首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系

本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系! 准备: 首先我们创建一列sex。再为部分行设置好值0(女)或者1(男); ?...也可以这么理解: 非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。 ?...现在我们来对这个表做一个查询: 查询具有年龄相同的人在2人及以上的,他们的年龄分别是多少。...也可以这么理解: 执行查询的时候先取得外部查询的一个属性值,然后执行与此属性值相关的子查询,执行完毕后再取得外部父查询的下一个值,依次再来重复执行子查询; 我们先把表格增加一列sex并设置好值。...接下来: 查询不但具有年龄相同的人在2人及以上的,而且性别是1的那些人的年龄。

1.6K10

【重学 MySQL】四十三、多行子查询

多行子查询通常与 IN、ANY 或 ALL 关键字一起使用。 使用 IN 子查询 IN 子查询是最常见的多行子查询,用于判断某个值是否存在于子查询返回的结果集中。...使用 ANY 和 ALL 子查询 ANY 和 ALL 子查询也可以用于多行子查询,但它们的用法和语义有所不同。 使用 ANY ANY 用于判断某个值是否满足子查询返回结果集中的任意一个值。...使用 ALL ALL 用于判断某个值是否满足子查询返回结果集中的所有值。...NULL 值:在子查询中返回 NULL 值时,IN 子查询会忽略这些 NULL 值,但 ANY 和 ALL 子查询可能会受到 NULL 值的影响,因为 NULL 在比较时具有特殊的行为。...通过以上内容,你应该对 MySQL 中的多行子查询有了更深入的理解。在实际应用中,选择正确的查询方式可以有效提高查询性能和代码可读性。

17510
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    explain的属性详解与提速百倍的优化示例

    const:查找主键索引,返回的数据至多一条(0或者1条)。属于精确查找。 eq_ref:查找唯一性索引,返回的数据至多一条。属于精确查找。 ref:查找非唯一性索引,返回匹配某一条件的多条数据。...ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。 unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值。...index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。...哪些列或常量被用于查找索引列上的值。 rows MySQL根据表统计信息及索引选用情况,估算mysql查询过程中遍历的行数,不是准确值。...where条件单表查,锁定最小返回记录表——把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高 explain查看执行计划,是否从锁定记录较少的表开始查询

    1.4K30

    性能优化-通过explain查询分析SQL的执行计划

    类似,表示这个subquery的查询要受到外部表查询的影响 H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select 3)、table 显示的查询表名...或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。...值的比较。...G:unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值 H:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值...如果内表的数据量比较大,就可能出现这个 K:loosescan(m…n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个 除了这些之外

    1.4K10

    MySQL优化之Explain命令解读

    :与dependent union类似,表示这个subquery的查询要受到外部表查询的影响 H:derived:from字句中出现的子查询。...或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。...:用于where中的in形式子查询,子查询返回不重复值唯一值 I:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。...以上说的是索引扫描的两种情况,一种是查询使用了覆盖索引,那么它只需要扫描索引就可以获得数据,这个效率要比全表扫描要快,因为索引通常比数据表小,而且还能避免二次查询。...K:loosescan(m..n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个。

    85830

    无处不在的子查询

    所有的子查询可以分为两类,即相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。...,应用max函数从表Sales.Orders中查找orderdate最后一天的日期,生成虚拟表VT1, 2.处理嵌套在外层的查询语句,从Sales.Orders表中查找满足where条件orderdate...在虚拟表VT1中有相等值的数据,得到虚拟表VT2 3.处理select列表,从虚拟表VT2中查找出custid,orderdate,custid,empid返回虚拟表VT3 */ /*2:写一条查询语句...VT2 4.处理嵌套在外层的查询语句,从Sales.Orders表中查找满足where条件empid不在虚拟表VT2中有相等值的数据,得到虚拟表VT3 5.处理select列表从虚拟表VT3中查找empid...,应用where子句返回满足条件O.custid = C.custid和EXISTS条件的值 5.返回到外层查询处理 EXISTS,外查询根据子查询返回的结果集得到满足条件的行 */

    1.5K70

    MySQL 不相关子查询怎么执行?

    子查询的记录都写入临时表之后,从主查询记录中拿到 sub_field 字段值,去临时表中查找,如果找到了记录,sub_field 字段条件结果为 true,否则为 false。...从以上内容可以见,子查询物化只会执行一次。 3. 创建临时表 临时表是在查询优化阶段创建的,它也是一个正经表。既然是正经表,那就要确定它使用什么存储引擎。...使用临时表存放子查询的结果,是为了提升整个 SQL 的执行效率。如果临时表中的记录数量很多,根据主查询字段值去临时表中查找记录的成本就会比较高。...从 city 表中读取到 city_id = 73 的记录之后,拿到 country_id 的值 44,去临时表中查找记录。...由上所述,总结一下 MySQL 的优化逻辑: 对于包含子查询的 where 条件字段,如果连续几条记录的字段值都相同,这组记录中,只有第一条记录会根据 where 条件字段值去临时表中查找是否有对应记录

    2K10

    Mysql中explain命令查看执行计划

    . select_type id select_type description 1 SIMPLE 不包含任何子查询或union等查询 2 PRIMARY 包含子查询最外层查询就显示为 PRIMARY...从UNION中获取结果集,例如上文的第三个例子 table 查询的数据表,当从衍生表中查数据时会显示 x 表示对应的执行计划id。...partitions 表的分区字段,没有分区的话则为null. type 这条查询语句访问数据的类型.所有可取值的范围: ALL 扫描全表数据 index 使用索引 range 索引范围查找 ref...非唯一性索引扫描,返回匹配某个单独值的所有行。...不同的字符集占用字节不一样,上面举例是使用的utf8mb4字符集. ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 rows 返回估算的结果集数目,并不是一个准确的值。

    2K10

    mysql慢查询日志

    =mysqlpassword --host=localhost /var/lib/mysql/izwz9hiye4lft7f85poremz-slow.log // 从慢查找数据库表中重复的索引 pt-duplicate-key-checker...,通常type是const,其他数据库也叫做唯一索引扫描 eq_ref: 出现在要连接多个表的查询计划中,驱动表循环获取数据,这行数据是第二个表的主键或者唯一索引,作为条件查询只返回*一条数据*,且必须为...、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据*不唯一的等值*查找就可能出现 fulltext: 全文索引检索,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价...中的in形式子查询,子查询返回不重复唯一值 index_subquery: 用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可能使用索引将子查询去重 range: 索引范围扫描...,常见于where字句含有in()类型的子查询,如果内表的数据量比较大的,就可能出现这个 loosescan(m..n): 5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时

    74920

    mysql索引及优化

    subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响...或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。...ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。 unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值。...index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。...如果内表的数据量比较大,就可能出现这个 loosescan(m..n):5.6.x之后引入的优化子查询的新特性之一,在in()类型的子查询中,子查询返回的可能有重复记录时,就可能出现这个 filtered

    79520

    sql语句面试经典50题_sql基础知识面试题

    DESC]; limit 使用limt子句返回topN(对应这个问题返回的成绩前两名)如:[ limit 2 ==>从0索引开始读取2个] limit==>从0索引开始 [0,N-1] ① select...score group by 课程号; 查询男生、女生人数 /* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表...“每个”就是要分组了 平均成绩大于60分,就是对分组结果指定条件 分析思路 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表...1)不及格课程 2)两门以上[不及格课程] select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件 [限制条件...的学生,需要从成绩表里查找,用到子查询 第1步,写子查询(所有课程成绩 的学生) select 查询结果[学号] from 从哪张表中查找数据[成绩表:score] where

    2.9K20

    MySQL 子查询

    标量子查询(Scalar Subquery):返回单个值(一行一列)的子查询。 行子查询(Row Subquery):返回单行结果(一行多列)的子查询。...列子查询(Column Subquery):返回单列结果(一列多行)的子查询。 表子查询(Table Subquery):返回一个虚拟表(多行多列)的子查询。...当 WHERE 条件中的子查询返回多行数据时,不能再使用普通的比较运算符,因为它们不支持单个值和多个值的比较;如果想要判断某个字段是否在子查询返回的数据列表中,可以将子查询与 IN、ALL、ANY/SOME...ALL 必须跟在比较运算符之后,如果表达式与子查询返回列中的所有值的比较结果为 TRUE,则返回 TRUE。...ANY 关键字必须跟在比较运算符之后,如果表达式与子查询返回列中的任何值的比较结果为 TRUE,则返回 TRUE。

    25910

    MySQL DQL 子查询

    标量子查询(Scalar Subquery):返回单个值(一行一列)的子查询。 行子查询(Row Subquery):返回单行结果(一行多列)的子查询。...列子查询(Column Subquery):返回单列结果(一列多行)的子查询。 表子查询(Table Subquery):返回一个虚拟表(多行多列)的子查询。...当 WHERE 条件中的子查询返回多行数据时,不能再使用普通的比较运算符,因为它们不支持单个值和多个值的比较;如果想要判断某个字段是否在子查询返回的数据列表中,可以将子查询与 IN、ALL、ANY/SOME...ALL 必须跟在比较运算符之后,如果表达式与子查询返回列中的所有值的比较结果为 TRUE,则返回 TRUE。...ANY 关键字必须跟在比较运算符之后,如果表达式与子查询返回列中的任何值的比较结果为 TRUE,则返回 TRUE。

    8600

    常见的SQL面试题:经典50例

    ]; limit 使用limt子句返回topN(对应这个问题返回的成绩前两名),如:[ limit 2 ==>从0索引开始读取2个]limit==>从0索引开始 [0,N-1] select * from...score group by 课程号; 查询男生、女生人数 /* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表...“每个”就是要分组了 平均成绩大于60分,就是对分组结果指定条件 分析思路 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表...: 1)不及格课程 2)两门以上[不及格课程] select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件...:所有课程成绩 的学生,需要从成绩表里查找,用到子查询 第1步,写子查询(所有课程成绩 的学生) select 查询结果[学号] from 从哪张表中查找数据[成绩表:score]

    7K42

    平平无奇SQL面试题:经典50例

    score group by 课程号; 查询男生、女生人数 /* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表...select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表score] where 查询条件 [没有] group by 分组...: 1)不及格课程 2)两门以上[不及格课程] select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件...:所有课程成绩 的学生,需要从成绩表里查找,用到子查询 第1步,写子查询(所有课程成绩 的学生) select 查询结果[学号] from 从哪张表中查找数据[成绩表:score]...上面查询结果课程号“0001”有2行数据,是因为最大成绩80有2个 分组取每组最小值 案例:按课程号分组取成绩最小值所在行的数据 同样的使用关联子查询来实现 select * from score as

    2.6K60

    深入浅出理解动态规划(一) | 交叠子问题

    因此当没有公共的(交叠的、重叠的)子问题时动态规划算法并不适用,因为没有必要将一个不再需要的结果存储起来。例如,二分搜索(折半查找)就不具有重叠的子问题性质。...采用这种方法,只需对递归程序进行一点小小的修改,即在计算某个值时,先查询一个表。这个表可以使用数组来实现,初始时把数组的值全部初始为NIL(比如-1或0等值,这个值是计算过程中不会出现的那些值)。...任何时候当我们需要求解一个子问题时,我们首先查询这个表,如果这个表中有我们预先对该子问题求解的结果,则我们直接返回表中的这个值,否则我们就对子问题进行计算,并把计算结果存入这个表中,以便在后续计算中可以重复使用...在记忆化搜索方法中,我们只是在需要时往查询表中添加记录,而在打表法中,从第1项记录开始,所有计算结果一项一项地添加到表中。与打表法不同,记忆化搜索方法无需将所有计算结果添加到查询表中。...以上就是本期所有的内容了,记得分享给身边人哦,感谢你的支持。下期继续更新动态规划--最优子结构。

    1.2K10

    面试 SQL整理 常见的SQL面试题:经典50题

    DESC]; limit 使用limt子句返回topN(对应这个问题返回的成绩前两名)如:[ limit 2 ==>从0索引开始读取2个] limit==>从0索引开始 [0,N-1] ① select...score group by 课程号; 查询男生、女生人数 /* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表...“每个”就是要分组了 平均成绩大于60分,就是对分组结果指定条件 分析思路 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表...1)不及格课程 2)两门以上[不及格课程] select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件 [限制条件...的学生,需要从成绩表里查找,用到子查询 第1步,写子查询(所有课程成绩 的学生) select 查询结果[学号] from 从哪张表中查找数据[成绩表:score] where

    2.4K10

    常见的SQL面试题:经典50例

    :查询有多少人选了课程 --select 学号,成绩表里学号有重复值需要去掉 --from 从课程表查找score; select count(distinct 学号) as 学生人数  from score...score group by 课程号; 查询男生、女生人数 /* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表...“每个”就是要分组了 平均成绩大于60分,就是对分组结果指定条件 分析思路 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表...知识: 3.复杂查询 查询所有课程成绩小于60分学生的学号、姓名 【知识点】子查询 1.翻译成大白话 1)查询结果:学生学号,姓名 2)查询条件:所有课程成绩 的学生,需要从成绩表里查找,用到子查询...第1步,写子查询(所有课程成绩 的学生) select 查询结果[学号] from 从哪张表中查找数据[成绩表:score] where 查询条件[成绩 < 60] group by 分组[

    2K20

    面试中经常被问到的 50 个 SQL 题,必须拿下!

    :查询有多少人选了课程 --select 学号,成绩表里学号有重复值需要去掉 --from 从课程表查找score; select count(distinct 学号) as 学生人数 from score...score group by 课程号; 查询男生、女生人数 /* 分析思路 select 查询结果 [性别,对应性别的人数:汇总函数count] from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表...“每个”就是要分组了 平均成绩大于60分,就是对分组结果指定条件 分析思路 select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [成绩在成绩表中,所以查找的是成绩表...: 1)不及格课程 2)两门以上[不及格课程] select 查询结果 [学号,平均成绩:汇总函数avg(成绩)] from 从哪张表中查找数据 [涉及到成绩:成绩表score] where 查询条件...:所有课程成绩 的学生,需要从成绩表里查找,用到子查询 第1步,写子查询(所有课程成绩 的学生) select 查询结果[学号] from 从哪张表中查找数据[成绩表:score]

    3.2K30

    MySQL查询优化-基于EXPLAIN

    select_type 分为 simple(简单查询)、subquery(子查询)、drived(衍生表,from 列表中有子查询)、union(联合查询)等。...table 通常是表名,或者表的别名,或者一个为查询产生临时表的标示符(如派生表、子查询、集合)。...从表中仅使用索引树中的信息就能获取查询语句的列的信息, 而不必进行其他额外查找(seek)去读取实际的行记录。当查询的列是单个索引的部分的列时, 可以使用此策略。...除非您特意打算从表中提取或检查所有行,否则如果 Extra 值不是Using where 并且表连接类型为 ALL 或 index,则查询可能会出错。...如果同时出现了 using where 表明进行了索引被用来执行键值的查询,如果没有using where表明索引用来读取数据,而非查找,以上两种情况都是从 mysql 服务层完成的,无需再回表查询记录

    1.6K20
    领券