SQL 子查询
SQL子查询是嵌套在其他SQL查询中的查询。它们允许你在一个查询中使用另一个查询的结果,从而实现更复杂的数据检索和操作。子查询可以出现在 SELECT
、INSERT
、UPDATE
、DELETE
语句中,甚至可以嵌套在其他子查询中。
什么是子查询?
子查询是一个查询语句,它嵌套在另一个查询语句中。子查询的结果可以作为外部查询的条件、值或表。子查询通常用于以下场景:
- 在
WHERE
子句中作为条件。 - 在
SELECT
子句中作为计算字段。 - 在
FROM
子句中作为临时表。
子查询的基本语法
子查询的基本语法如下:
SELECT column_name(s)
FROM table_name
WHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);
其中,OPERATOR
可以是比较运算符(如 =
、>
、<
等)或逻辑运算符(如 IN
、EXISTS
等)。
子查询的类型
子查询可以分为以下几种类型:
- 标量子查询:返回单个值的子查询。
- 行子查询:返回一行数据的子查询。
- 列子查询:返回一列数据的子查询。
- 表子查询:返回一个表的子查询。
标量子查询
标量子查询返回单个值,通常用于 WHERE
子句中的条件判断。
示例:
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
在这个例子中,子查询 (SELECT AVG(salary) FROM employees)
返回所有员工的平均工资,外部查询则返回工资高于平均工资的员工姓名和工资。
行子查询
行子查询返回一行数据,通常用于 WHERE
子句中的多条件判断。
示例:
SELECT name, department
FROM employees
WHERE (department, salary) = (SELECT department, MAX(salary) FROM employees GROUP BY department);
在这个例子中,子查询 (SELECT department, MAX(salary) FROM employees GROUP BY department)
返回每个部门的最高工资,外部查询则返回每个部门中工资最高的员工姓名和部门。
列子查询
列子查询返回一列数据,通常用于 IN
或 ANY
等操作符的条件判断。
示例:
SELECT name
FROM employees
WHERE department IN (SELECT department FROM departments WHERE location = 'New York');
在这个例子中,子查询 (SELECT department FROM departments WHERE location = 'New York')
返回位于纽约的部门名称,外部查询则返回这些部门中的员工姓名。
表子查询
表子查询返回一个表,通常用于 FROM
子句中的临时表。
示例:
SELECT e.name, d.department_name
FROM (SELECT * FROM employees WHERE salary > 50000) AS e
JOIN departments AS d ON e.department_id = d.department_id;
在这个例子中,子查询 (SELECT * FROM employees WHERE salary > 50000)
返回工资大于50000的员工表,外部查询则将这些员工与部门表进行连接,返回员工姓名和部门名称。
实际应用场景
场景1:查找工资高于部门平均工资的员工
SELECT name, salary, department
FROM employees e1
WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.department = e1.department);
在这个例子中,子查询 (SELECT AVG(salary) FROM employees e2 WHERE e2.department = e1.department)
返回每个部门的平均工资,外部查询则返回工资高于部门平均工资的员工姓名、工资和部门。
场景2:查找没有订单的客户
SELECT customer_name
FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);
在这个例子中,子查询 (SELECT customer_id FROM orders)
返回所有有订单的客户ID,外部查询则返回没有订单的客户姓名。
总结
SQL子查询是一种强大的工具,可以帮助你编写更复杂和灵活的查询语句。通过嵌套查询,你可以在一个查询中使用另一个查询的结果,从而实现更精细的数据检索和操作。掌握子查询的使用,将大大提升你的SQL技能。
附加资源
练习
- 编写一个SQL查询,查找工资高于公司平均工资的员工。
- 编写一个SQL查询,查找每个部门中工资最高的员工。
- 编写一个SQL查询,查找没有订单的产品。
通过完成这些练习,你将更好地理解和掌握SQL子查询的使用。