本文已参与「新人创作礼」活动,一起开启掘金创作之路
子查询
背景:SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。
第一节:单行子查询
实例:select * from info where score > (select score from info where name=’张三’);
规则:
--- 子查询(内查询)在主查询之前一次执行完成。
--- 子查询的结果被主查询(外查询)使用 。
--- 子查询要包含在括号内。
--- 常用操作符:= | > |>= | < | <= | <>
第二节:多行子查询
多行子查询,是指执行查询语句获得的结果集中返回了多行数据的子查询。在子查询中可以使用in关键字、exists关键字和比较运算符来连接表。
2.1 in关键字
in关键字用来判断一个表中指定列的值是否包含在已定义的列表中,或在另一个表中
语法:select * from 表名称 where 列名称 in(select * from 表名称);
2.2 比较运算符
2.2.1 All 运算符
它将单个值与子查询返回的单列值集进行比较。
ALL运算符必须以比较运算符开头,例如:>,>=,<,<=,<>,=,后跟子查询。
语法:select * from 表名称 where 列名称 > all (select score from 表名称);
#大于子查询集合中score 最大的分数
2.2.2 ANY运算符
ANY运算符是一个逻辑运算符,它将值与子查询返回的一组值进行比较。 ANY运算符必须以比较运算符:>,>=,<,<=,=,<>开头,后跟子查询。
2.3.3 EXISTS 和 NOT EXISTS关键字
将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
-- exist适合 子查询中表数据大于外查询表中数据的业务场景(in相反)
-- 先执行一次外部查询,遍历外部查询的每一次结果集时,各执行一次子查询。