1. 子查询的本质与分类
SQL子查询本质上是一个嵌套在另一个SQL语句中的完整查询语句。它就像俄罗斯套娃一样,外层查询依赖内层查询的结果作为数据源或判断条件。根据使用场景和返回结果的不同,子查询主要分为以下几类:
1.1 标量子查询(Scalar Subquery)
返回单个值的子查询,通常出现在SELECT列表、WHERE条件或HAVING子句中。例如获取高于部门平均工资的员工信息:
sql复制SELECT employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = 10);
1.2 列子查询(Column Subquery)
返回单列多行数据的子查询,常与IN、ANY/SOME、ALL等运算符配合使用。比如查找没有订单的客户:
sql复制SELECT customer_id, customer_name
FROM customers
WHERE customer_id NOT IN (SELECT DISTINCT customer_id FROM orders);
1.3 行子查询(Row Subquery)
返回单行多列数据的子查询,需要与行构造器语法配合使用。典型场景是比较多个字段的组合值:
sql复制SELECT product_id, product_name
FROM products
WHERE (category_id, price) = (SELECT category_id, MAX(price)
FROM products
GROUP BY category_id
HAVING category_id = 5);
1.4 表子查询(Table Subquery)
返回完整表结构的子查询,通常出现在FROM子句中作为派生表。这是实现复杂分页查询的经典方案:
sql复制SELECT t.*
FROM (SELECT
