MYSQL8子查询
子查询:sql里面嵌套sql
通常情况下,SQL多表查询(Join)
比子查询
效率高。
这是因为在使用子查询时,需要执行多个
查询语句,而在使用关联查询时只需要执行单个
查询语句。
当使用子查询时,子查询语句将被执行一次,并返回一个结果集,这个结果集将用于主查询中的条件判断。如果主查询中有多个条件需要使用子查询返回的结果集进行比较,那么就需要执行多个子查询语句,这会大大降低查询效率。
相比之下,使用关联查询时,所有的查询条件都包含在单个查询语句中。这样可以减少查询的次数,提高查询效率。此外,关联查询还可以利用索引来加速查询,进一步提高查询效率。
尽管关联查询通常比子查询效率更高,但在某些特定情况下,子查询可能会更加适合。例如,当需要在查询结果中动态计算数据或者需要使用聚合函数来汇总数据时,使用子查询会更加方便和灵活。
语法格式
-- 子查询---根据学生ID查询学生姓名
-- 子句是查询 年级=70 且是计算机系的学生id
SELECT id,
name
FROM student
WHERE id =(
SELECT stu_id
FROM score
WHERE c_name = '计算机'
AND grade = 70
);
示例:
查询年龄最大的员工信息
查询哪个员工的部门编号时1001或1002
查询研发部和销售部的员工信息
子查询关键字
ALL
ALL 本质用and 取最大值
- ALL子句中 > ALL代表大于最大值
- ALL子句中 < ALL代表小于最小值
ANY/SOME
ANY 本质用OR 取最小值
- ANY子句 表示父查询只需要任意匹配一条子查询结果就可执行
- ANY子句中 = ANY(子查询) 与IN同意
- ANY子句中 > ANY代表大于最小值
- ANY子句中 < ANY代表小于最大值
IN
EXISTS
CTE通用表表达式(Common Table Expressions)
https://www.qycn.com/xzx/article/582.html
复杂的查询会使用嵌入式表
,例如:
SELECT t1.*, t2.* FROM
(SELECT col1 FROM table1) t1,
(SELECT col2 FROM table2) t2;
而有了 CTE,我们可以这样写:
WITH
t1 AS (SELECT col1 FROM table1),
t2 AS (SELECT col2 FROM table2)
SELECT t1.*, t2.*
FROM t1, t2;
这样看上去层次
和区域
都更加分明
,改起来也更清晰的知道要改哪一部分。