标量子查询
- 标量子查询是返回单个值的子查询,通常用于在查询中作为一个常量值使用。
- 例如,查询出所有员工中工资高于平均工资的员工信息:
sql
SELECT *
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
列子查询
- 列子查询返回一列数据,可用于在 `WHERE` 子句中进行比较操作,通常与 `IN`、`NOT IN`、`ANY`、`ALL` 等关键字一起使用。
- 例如,查询出与部门编号为10或20的员工职位相同的员工信息:
sql
SELECT *
FROM employees
WHERE job_id IN (SELECT job_id FROM employees WHERE department_id IN (10, 20));
行子查询
- 行子查询返回一行数据,用于与一行数据进行比较。
- 例如,查询出与员工编号为100的员工具有相同薪资和职位的员工信息:
sql
SELECT *
FROM employees
WHERE (salary, job_id) = (SELECT salary, job_id FROM employees WHERE employee_id = 100);
表子查询
- 表子查询返回一个结果集,该结果集可以作为一个临时表在外部查询中使用。
- 例如,查询每个部门中工资最高的员工信息:
sql
SELECT *
FROM (SELECT *, MAX(salary) OVER (PARTITION BY department_id) AS max_salary
FROM employees) AS temp
WHERE salary = max_salary;
相关子查询
- 相关子查询是指子查询的执行依赖于外部查询的值,子查询会为外部查询的每一行数据执行一次。
- 例如,查询每个员工的工资是否高于其所在部门的平均工资:
sql
SELECT e.employee_id, e.salary,
(SELECT AVG(salary) FROM employees d WHERE d.department_id = e.department_id) AS dept_avg_salary,
CASE WHEN e.salary > (SELECT AVG(salary) FROM employees d WHERE d.department_id = e.department_id)
THEN '高于平均工资' ELSE '低于或等于平均工资' END AS salary_status
FROM employees e;