SQL 子查询
子查询
在 SQL 中,子查询(Subquery)是一个嵌套在另一个查询中的查询语句。子查询可以用于在 SELECT
、INSERT
、UPDATE
或 DELETE
语句中提供数据或条件。子查询可以返回单个值、一行、一列或多行多列数据。以下是对子查询的详细讲解。
1. 子查询的基本语法
子查询的基本语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE column_name operator (
SELECT column1, column2, ...
FROM another_table
WHERE condition
);
column1, column2, ...
:要查询的列。table_name
:主查询的表。column_name
:主查询中用于比较的列。operator
:比较运算符,如=
,<>
,>
,<
,>=
,<=
,IN
,NOT IN
,EXISTS
,NOT EXISTS
等。another_table
:子查询的表。condition
:子查询的条件。
2. 子查询的类型
子查询可以分为以下几种类型:
- 标量子查询:返回单个值。
- 行子查询:返回一行数据。
- 列子查询:返回一列数据。
- 表子查询:返回多行多列数据。
示例
假设有一个 employees
表,包含以下数据:
1 | Alice | Smith | 60000 | 101 |
2 | Bob | Johnson | 70000 | 101 |
3 | Charlie | Brown | 50000 | 102 |
4 | David | Davis | 80000 | 102 |
5 | Eve | White | 90000 | 103 |
标量子查询
查询工资高于平均工资的员工:
SELECT *
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
结果:
4 | David | Davis | 80000 | 102 |
5 | Eve | White | 90000 | 103 |
行子查询
查询工资和部门 ID 与员工 Alice
相同的员工:
SELECT *
FROM employees
WHERE (salary, department_id) = (
SELECT salary, department_id
FROM employees
WHERE first_name = 'Alice'
);
结果:
1 | Alice | Smith | 60000 | 101 |
2 | Bob | Johnson | 70000 | 101 |
列子查询
查询工资高于部门 101 的任何员工工资的员工:
SELECT *
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department_id = 101
);
结果:
4 | David | Davis | 80000 | 102 |
5 | Eve | White | 90000 | 103 |
表子查询
查询每个部门工资最高的员工:
SELECT e1.*
FROM employees e1
WHERE (
SELECT COUNT(*)
FROM employees e2
WHERE e2.department_id = e1.department_id AND e2.salary > e1.salary
) = 0;
结果:
2 | Bob | Johnson | 70000 | 101 |
4 | David | Davis | 80000 | 102 |
5 | Eve | White | 90000 | 103 |
EXISTS
和 NOT EXISTS
查询没有订单的客户:
SELECT *
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
结果:
3 | Charlie | charlie@example.com | 22 |