首页
学习
活动
专区
圈层
工具
发布

十五、子查询EXISTS和IN的使用

一、子查询 IN 子查询 IN 允许我们在 WHERE 子句中过滤某个字段的多个值,语法如下: SELECT column_nam FROM table_name WHERE column_name IN...,valueN) 如果运算符 in 后面的值来源于某个查询结果,并非是指定的几个值,这时就需要用到子查询。子查询又成为内部查询或嵌套查询,即在 SQL 查询的 WHERE 子句中嵌入查询语句。....* from student A where A.stu_no in (select B.stu_no from elective B where B.name='计算机'); 二、子查询 EXISTS...EXISTS是子查询中用于测试内部查询是否返回任何行的布尔运算符。...奖助查询的数据放到子查询中左条件验证,根据验证结果(TRUE或FLASE)来决定著查询的数据结果是否保留。

3K40

MySQL查询语句中的IN 和Exists 对比分析

这种情况下子查询结果集很大,我们看看MySQL的查询计划: 使用in时,由于子查询结果集很大,对t_author和t_poetry表都接近于全表扫描,此时对t_author表的遍历耗时差异对整体效率影响可以忽略...,执行计划里多了一行,在接近全表扫描的情况下,mysql优化器选择了auto_key来遍历t_author表: 使用exists时,数据量的变化没有带来执行计划的改变,但由于子查询结果集很大...font color=red>子查询结果集很大的情况下能显著改善查询匹配效率: 实验结论 根据上述两个实验及实验结果,我们可以较清晰的理解IN 和Exists的执行过程,并归纳出IN 和...Exists的适用场景: IN查询在内部表和外部表上都可以使用到索引; Exists查询仅在内部表上可以使用到索引; 当子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop...网上的说法不准确,即表的规模不是看内部表和外部表,而是外部表和子查询结果集。 最后一点,也是最重要的一点:世间没有绝对的真理,掌握事物的本质,针对不同的场景进行实践验证才是最可靠有效的方法。

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

    MYSQL基本操作-select 查询语句【续】

    子查询 查看图书类别表中有图书的类别id和类别名称 常见错误写法 正确写法 ---- 前言 内容:MYSQL基本操作-select 查询语句【续】 聚合函数 最大值(max) select max(bookprice...,所以解决这个问题需要用到别名 联合查询 其实Mysql并没有全连接,Oracle才有全连接(full join) 但是在MySQL中,union关键字可以达到同样的效果,所以这里也要介绍下union...[sql1]UNION [ALL | DISTINCT][sql2]UNION [ALL | DISTINCT][sql3].... sql1、sql2、sql3:平时写的查询 sql,可以连接很多条...= '机械工业出版社' ); [not] exists子查询 查看图书类别表中没有图书的类别id和类别名称 SELECT typeid, typename FROM booktype WHERE...和 exists的一个比较 in exists 当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE; 用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回

    2.7K40

    MariaDB 连接查询

    一般的子查询中常用的操作符有ANY(SOME),ALL,IN,EXISTS.子查询可以添加到SELECT、UPDATE和DELETE 语句中,而且可以进行多层嵌套.子查询中也可以使用比较运算符,如ALL 子查询◆ ALL关键字与ANY不同,使用ALL时需要同时满足所有内层查询的条件,ALL关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为TRUE,则返回TRUE....◆EXISTS 子查询◆ EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询.如果子查询没有返回任何行...◆比较运算符子查询◆ 在前面介绍的带ANY,ALL关键字的子查询时使用了>比较运算符,子查询时还可以使用其他的比较运算符,如,>=,=,!=等....合并但不删除重复行: 查询所有价格小于9.0的水果的信息,且查询Gid=101和103所有水果信息,使用UNION ALL连接,不要删除重复的行,查询结果,SQL语句如下: MariaDB [lyshark

    5.2K10

    【云原生进阶之数据库技术】第一章MySQL-2.3-数据基本操作

    1 数据查询SQL操作 1.1 单表查询 1、语法:select from 表名; as:将某个字段取个别名 2、语法:select distinct from 表名; 去掉重复项,对应的字段前加符号表达...语法:select from where [表达式] (select from where [表达式] ) 1.3.1 带有IN谓语的子查询 select * from books where isbn...in (select * isbn from brrowrecord where reader_id='201801'); 1.3.2 带有比较运算符的子查询 指父查询与子查询之间用比较运算符连接...(SOME)或ALL谓语子查询 子查询返回值单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓语,使用ANY或ALL谓语时必须同时使用比较运算符。...where reader_id="201801"); 1.3.4 带有EXISTS谓语的子查询 EXISTS谓语的子查询不返回任何数据,是一个布尔值(true或false)逻辑判断。

    1.1K10

    查看Mysql正在执行的事务、锁、等待

    SHOW WARNINGS命令:可以查看MySQL优化器优化后的SQL语句。     EXPLAIN PARTITIONS命令:显示SQL语句的带有分区表信息的查询执行计划。     ...,可能重复 select_type: SIMPLE,简单的select查询,不使用union及子查询 PRIMARY,最外层的select查询 UNION,UNION 中的第二个或随后的...select 查询,不依赖于外部查询的结果集 DEPENDENT UNION,UNION 中的第二个或随后的 select 查询,依赖于外部查询的结果集 SUBQUERY,子查询中的第一个...MySQL会递归执行这些子查询, 把结果放在临时表里。 UNCACHEABLE SUBQUERY,结果集不能被缓存的子查询,必须重新为外层查询的每一行进行评估。...UNCACHEABLE UNION,UNION 中的第二个或随后的 select 查询,属于不可缓存的子查询 table:涉及的表,如果SQL中表有赋别名,这里出现的是别名 type:

    19.1K22

    手把手教你 SQL 多表查询

    结果为: (201215121,1) (201215121,3) (201215122,2) 3、带有 ANY(SOME)或ALL 谓词的子查询 使用 ANY 或 ALL 谓词时必须同时使用比较运算...>= ALL 大于等于子查询结果中的所有值 子查询结果中的某个值 ALL 小于等于子查询结果中的所有值 = ANY 等于子查询结果中的某个值 =ALL 等于子查询结果中的所有值...=(或)ANY 不等于子查询结果中的某个值 !=(或)ALL 不等于子查询结果中的任何一个值 例子:查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄。...带有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值 “true” 或逻辑假值 “false” 。 例如:查询所有选修了 1 号课程的学生姓名。...NOT EXISTS 谓词的子查询不能被其他形式的子查询等价替换 所有带 IN 谓词、比较运算符、ANY 和 ALL 谓词的子查询都能用带 EXISTS 谓词的子查询等价替换 三、集合查询 集合操作的种类

    2.4K20

    PostgreSQL基础知识整理

    / UNION ALL UNION用于合并两个或多个SELECT语句的结果,不返回任何重复的行。...可以使用子查询的有SELECT,INSERT,UPDATE和DELETE语句,与运算符如=,,>=,查询必须遵循的规则: 必须用括号括起来的子查询。...GROUP BY可以用来执行相同的功能在子查询中的ORDER BY。 子查询返回多于一行只能用于使用多值的运算符,如为IN,EXISTS,IN,ANY / SOME,ALL运算符。...EXISTS指定一个子查询,检测行的存在。NOT EXISTS的作用与EXISTS正好相反。如果子查询没有返回行,则满足了NOT EXISTS中的WHERE子句。...EXISTS内部有一个子查询语句(SELECT … FROM…),我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

    5.2K10

    【MySQL 系列】MySQL 语句篇_DQL 语句

    2.3.8、操作符 EXISTS 在 MySQL 中,EXISTS 操作符用来判断一个子查询是否返回数据行。...,它需要一个子查询 subquery 作为参数;③ 如果子查询 subquery 返回了至少一个数据行,则 EXISTS 的计算结果为 TRUE,否则计算结果为 FALSE;④ EXISTS 运算时,一旦子查询找到一个匹配的行...这对提高查询新能很有帮助;⑤ EXISTS 不关心子查询中的列的数量或者名称,它只在乎子查询是否返回数据行。...子查询经常用在 WHERE 子句中。 例如,我前面提到的操作符 EXISTS 就属于子查询的范畴。...运算包括 UNION DISTINCT 和 UNION ALL 两种算法,其中 UNION DISTINCT 可以简写为 UNION; ④UNION 会删除两个结果集中的重复记录行,而 UNION ALL

    3.6K10

    (4) MySQL中EXPLAIN执行计划分析

    列表中的子查询 DEPENDENT SUBQUERY 依赖外部结果的子查询 UNION Union操作的第二个或是之后的查询的值为union DEPENDENT UNION 当UNION作为子查询时,...第二或是第二个后的查询的select_type值 UNION RESULT UNION产生的结果集 DERIVED 出现在FROM子句中的子查询 3....TABLE列 包含以下几种结果: 输出去数据行所在表的名称,如果表取了别名,则显示的是别名 union M,N>: 由ID为M,N查询union产生的结果集 /<subquery...Extra列 包含MySQL如何执行查询的附加信息 值 含义 Distinct 优化distinct操作,在找到第一个匹配的元素后即停止查找 Not exists 使用not exists来优化查询 Using...,常见于排序,子查询,和分组查询 Using where 需要在MySQL服务器层使用WHERE条件来过滤数据 select tables optimized away 直接通过索引来获得数据,不用访问表

    1.6K20

    【数据库SQL server】关系数据库标准语言SQL之数据查询

    )或ALL谓词的子查询 使用ANY或ALL谓词时必须同时使用比较运算 语义为: > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 子查询结果中的某个值 ALL 小于子查询结果中的所有值 >= ANY 大于等于子查询结果中的某个值 >= ALL 大于等于子查询结果中的所有值 EXISTS谓词的子查询 EXISTS谓词,存在量词 ヨ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。...谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换 用EXISTS/NOT EXISTS实现全称量词(难点)...SQL语言中没有全称量词 (For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词: 【1】查询与“刘晨”在同一个系学习的学生。

    1.8K10

    MariaDB 连接查询与子查询

    一般的子查询中常用的操作符有ANY(SOME),ALL,IN,EXISTS.子查询可以添加到SELECT、UPDATE和DELETE 语句中,而且可以进行多层嵌套.子查询中也可以使用比较运算符,如ALL 子查询◆ALL关键字与ANY不同,使用ALL时需要同时满足所有内层查询的条件,ALL关键字接在一个比较操作符的后面,表示与子查询返回的所有值比较为TRUE,则返回TRUE.ALL实例: 返回tab2...◆EXISTS 子查询◆EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询.如果子查询没有返回任何行...◆比较运算符子查询◆在前面介绍的带ANY,ALL关键字的子查询时使用了>比较运算符,子查询时还可以使用其他的比较运算符,如,>=,=,!...:当我们使用SELECT语句显示查询结果时,MySQL会显示每个SELECT后面指定的输出列,在有些情况下,显示的列的名称会很长或者名称不够改观,MySQL可以指定列别名,替换字段或表达式.为字段取别名的基本语法格式为

    5.7K30

    MySQL表的增删查改(二)

    子查询 子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询单行子查询: 返回一行记录的子查询 多行子查询:返回多行记录的子查询 用例: -- 使用IN select * from score...='英文') and cou.id = sco.course_id); 在from子句中使用子查询:子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。...在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。...使用UNION和UNION ALL时,前后查询的结果集中,字段需要一致。 union 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。...* from course where id<3 or name='英文'; union all 该操作符用于取得两个结果集的并集。

    3.3K10

    【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询

    带有IN谓词的子查询 【1】查询与“刘晨”在同一个系学习的学生。...ALL谓词的子查询 使用ANY或ALL谓词时必须同时使用比较运算 语义为: > ANY 大于子查询结果中的某个值 > ALL 大于子查询结果中的所有值 EXISTS谓词的子查询 EXISTS谓词,存在量词 ヨ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。...谓词的子查询不能被其他形式的子查询等价替换 所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换 用EXISTS/NOT EXISTS实现全称量词(难点)...SQL语言中没有全称量词 (For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词: 【1】查询与“刘晨”在同一个系学习的学生。

    2.5K10

    MySQL4_联合-子查询-视图-事务-索引

    文章目录 MySQL_联合-子查询-视图-事务-索引 1.联合查询 关键字:`union` 2.多表查询 多表查询的分类 内连接(inner join ... on ..)...exists | not exists 子查询分组 4.视图 创建视图 查询 修改视图 查看创建视图的语句 查看视图的结构 查看所有的视图 删除视图 视图的算法论 5.事务 开启事务 事务的特性 隔离性...数据库(mysql)中保存操作记录(较全) 7.悲观锁 8.乐观锁 9.索引 索引的创建原则 索引的类型 mysql优化 MySQL_联合-子查询-视图-事务-索引 1.联合查询 关键字:union 将多个...查询的语句中还有一个查询(where … xx (…)) 外面的查询叫做父查询,里面的查询叫做子查询 子查询作为父查询的条件 #查询Python成绩大于等于80的学生的信息,不要成绩 select a....| all #in = #some | any | all 用在=后面 some 和 any 是一样的 和 in比较相似 all 表示全部的 ,和=号一样 select * from stuinfo

    1.8K30

    数据库圣经--聚合查询 子查询 分组查询 合并查询

    where name = 'Java' or name = 'MySQL'); 4、多列子查询         单行子查询和多行子查询都只返回⼀列数据,多列子查询中可以返回多个列的数据,外层查询与嵌套的内层查询的列要匹配...union select * from student1; 2、Union  all         该操作符用于取得两个结果集的并集。...# 结果集中有两张表中的数据,返回了所有唐三藏的记录 select * from student where id union all select * from student1; 五、插入查询结果...示例 4:ALL + 列子查询(匹配集合中所有值) ALL 含义:字段值 >/子查询结果中的「所有值」才成立。...核心逻辑 EXISTS:子查询有至少 1 条记录 → 主查询保留当前行; NOT EXISTS:子查询无记录 → 主查询保留当前行。

    57810

    MySQL多表查询详解

    可以通过UNION 或 ALL将多个SELECT语句的查询结果合并输出,这两个关键字的使用说明如下:UNION:利用该关键字可以将多个SELECT 语句的查询结果合并输出,并删除重复行ALL:利用该关键字可以将多个...SELECT 语句的查询结果合并输出,但不会删除重复行在使用UNION或ALL关键字将多个表合并输出时,查询结果必须具有相同的结构并且数据类型必须兼容,另外使用UNION时两张表的字段数量也必须相同,否则会提示...=ANY或ANY 不等于子查询中的某个值>ALL 大于子查询中的所有值>=ALL 大于等于子查询中的所有值ALL 小于等于子查询中的所有值=ALL 等于子查询中的所有值!...=ALL或ALL 不等于子查询中的所有值七.使用子查询作派生的表在实际项目开发过程中经常用到从一个信息较为完善的表中派生出一个只含有几个关键字段的信息表,通过子查询就可以来实现这一目标,如SELECT...)不包括GROUP BY 或 HAVING子句,除非预先确定了成组或单个的值(3)用EXISTS引入的SELECT列表一般都由*组成,不必指定列名(4)子查询不能在内部处理其结果八使用子查询作表达式SELECT

    2.6K10

    MySQL数据库、数据表的基本操作及查询数据

    带 ANY、SOME关键字的子查询 ANY和 SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件...带 EXISTS关键字的子查询 EXISTS关键字后面的参数是一个任一的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么 EXISTS的结果为 true,此时外层查询语句将进行查询...各个 SELECT语句之间使用 UNION或 UNION ALL关键字分割。...UNION不适用关键字 ALL,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字 ALL的作用时不删除重复行也不对结果进行自动排序。...为表和字段取别名 为表取别名 表名 [AS] 表别名 为字段取别名 列名 [AS] 列别名 使用正则表达式查询 MYSQL中使用 REGEXP关键字指定正则表达式的字符匹配模式。

    4.4K20
    领券