子查询
概述
子查询(Subquery)是嵌套在另一个查询中的查询。它可以用于在查询中获取中间结果,并将其用作外部查询的条件或数据源。子查询在处理复杂查询时非常有用,尤其是在需要基于另一个查询的结果进行进一步操作时。
子查询的基本概念
子查询可以出现在以下几个位置:
- WHERE子句:用于过滤外部查询的结果。
- FROM子句:将子查询的结果作为一个临时表使用。
- SELECT子句:用于计算单个值。
子查询的类型
- 标量子查询(Scalar Subquery):返回单个值的子查询,通常用于SELECT或WHERE子句中。
- 行子查询(Row Subquery):返回一行数据的子查询,通常用于WHERE子句中。
- 表子查询(Table Subquery):返回一个表的子查询,通常用于FROM子句中。
子查询的语法
子查询的基本语法如下:
SELECT column_name
FROM table_name
WHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);
示例1:标量子查询
假设我们有两个表:employees 和 departments。我们想要查询每个员工的部门名称。
SELECT employee_id, first_name, last_name,
(SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) AS department_name
FROM employees;
在这个例子中,子查询 (SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) 返回单个值(部门名称),并将其作为外部查询的一部分。
示例2:表子查询
假设我们想要查询所有工资高于平均工资的员工。
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
在这个例子中,子查询 (SELECT AVG(salary) FROM employees) 计算所有员工的平均工资,并将其作为外部查询的条件。
示例3:行子查询
假设我们想要查询工资最高的员工。
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE (salary, department_id) = (SELECT MAX(salary), department_id FROM employees GROUP BY department_id);
在这个例子中,子查询 (SELECT MAX(salary), department_id FROM employees GROUP BY department_id) 返回每个部门的最高工资和部门ID,并将其作为外部查询的条件。
实践练习
练习1:标量子查询
编写一个查询,显示每个员工的部门名称和城市。
SELECT employee_id, first_name, last_name,
(SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) AS department_name,
(SELECT city FROM locations WHERE locations.location_id = departments.location_id) AS city
FROM employees;
练习2:表子查询
编写一个查询,显示所有工资高于平均工资的员工,并按工资降序排列。
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY salary DESC;
练习3:行子查询
编写一个查询,显示每个部门中工资最高的员工。
SELECT employee_id, first_name, last_name, salary, department_id
FROM employees e1
WHERE (salary, department_id) = (SELECT MAX(salary), department_id FROM employees e2 WHERE e1.department_id = e2.department_id GROUP BY department_id);
总结
子查询是SQL中非常强大的工具,能够帮助我们处理复杂的查询需求。通过嵌套查询,我们可以将多个查询的结果结合起来,实现更复杂的逻辑。掌握子查询的使用,将大大提升你在SQL查询中的灵活性和效率。
下一步
在掌握了子查询的基本概念和使用方法后,你可以继续学习更高级的SQL主题,如连接(JOIN)、集合操作(UNION, INTERSECT, EXCEPT)、窗口函数等。这些主题将进一步扩展你的SQL技能,使你能够处理更复杂的数据库操作。