子查询: 一条查询语句中嵌入了另一条查询语句, 被嵌入里面的这条查询语句称为子查询, 外面的查询语句称为主查询
子查询的分类
相关性子查询(Correlated Subquery)是指子查询的执行依赖于外部查询的每一行数据。也就是说,子查询会对外部查询的每一行进行一次计算,通常通过外部查询的字段与子查询的字段进行关联
标量子查询(Scalar Subquery) 是 SQL 中的一种子查询,它返回 单个值(即一行一列的结果)。标量子查询可以嵌套在 SQL 语句的各个部分中,例如 SELECT
、WHERE
、HAVING
、ORDER BY
等,因为它返回的是一个确定的值,而不是一个集合
示例
示例1: 充当字段/相关性子查询
查询每个客户的订单总金额
子查询 (SELECT SUM(total_amount) FROM orders WHERE orders.customer_id = customers.customer_id)
被用来计算每个客户的订单总金额,并将其作为 total_spent
字段返回。子查询中的WHERE orders.customer_id = customers.customer_id 用于将 orders 表和 customers 表中的相关记录连接起来。这个条件确保了子查询计算的是与每个客户相关的订单总金额。如果不写这个条件,子查询将计算 orders
表中所有订单的总金额
相关性子查询:
子查询 (SELECT SUM(total_amount) FROM orders WHERE orders.customer_id = customers.customer_id)
依赖于外部查询中的 customers.customer_id
。对于外部查询中的每一行,子查询都会根据当前的 customer_id
来计算该客户的总订单金额。
示例2: 充当表/非相关性子查询
当子查询作为表使用时,它通常用于创建一个临时表,这个临时表可以与其他表进行连接
属于非相关性子查询:
对比相关性子查询
这里子查询 (SELECT aid FROM areas a2 WHERE a2.pid = a1.aid)
引用了外部查询的字段 a1.aid
,因此是相关性子查询
示例3:充当表/非相关性子查询
示例4 : 充当条件/非相关性子查询
子查询的结果在外部查询执行之前就已经确定,不会为外部查询的每一行重新计算,属于非相关性子查询
示例:充当字段
exists子查询和in子查询
用于在外部查询中过滤记录,基于子查询中是否存在满足条件的行。EXISTS
子查询返回一个布尔值(TRUE
或 FALSE
),如果子查询返回至少一行,则结果为 TRUE
,否则为 FALSE
语法:
示例
exists和 not exists
sql优化
子查询属于单表查询还是多表查询
子查询是一个嵌套在另一个查询中的查询,它可以独立于外部查询使用单表,也可以涉及多个表。