推荐答案
SQL 中的子查询主要分为以下几种类型:
标量子查询(Scalar Subquery)
返回单个值的子查询,通常用于 SELECT、WHERE 或 HAVING 子句中。行子查询(Row Subquery)
返回一行数据的子查询,通常用于与行比较操作符(如=
、<>
等)一起使用。表子查询(Table Subquery)
返回一个表的子查询,通常用于 FROM 子句中,作为派生表使用。派生表(Derived Table)
在 FROM 子句中定义的子查询,生成一个临时表供外部查询使用。
本题详细解读
1. 标量子查询(Scalar Subquery)
标量子查询返回单个值,通常用于需要单个值的上下文中。例如:
SELECT employee_name, (SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) AS department_name FROM employees;
在这个例子中,子查询返回每个员工的部门名称,作为一个标量值。
2. 行子查询(Row Subquery)
行子查询返回一行数据,通常用于与行比较操作符一起使用。例如:
SELECT employee_name, salary FROM employees WHERE (department_id, salary) = (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);
在这个例子中,子查询返回每个部门的最高工资和部门 ID,然后外部查询使用这些值与员工表中的数据进行匹配。
3. 表子查询(Table Subquery)
表子查询返回一个表,通常用于 FROM 子句中。例如:
SELECT employee_name, department_name FROM (SELECT employee_name, department_id FROM employees WHERE salary > 5000) AS high_salary_employees JOIN departments ON high_salary_employees.department_id = departments.department_id;
在这个例子中,子查询返回一个包含高薪员工的临时表,然后外部查询与部门表进行连接。
4. 派生表(Derived Table)
派生表是在 FROM 子句中定义的子查询,生成一个临时表供外部查询使用。例如:
SELECT department_name, AVG(salary) AS avg_salary FROM (SELECT department_id, salary FROM employees) AS employee_salaries JOIN departments ON employee_salaries.department_id = departments.department_id GROUP BY department_name;
在这个例子中,子查询生成一个包含员工工资的临时表,然后外部查询计算每个部门的平均工资。