SQL中子查询的特殊用法
|
admin
2025年8月26日 0:28
本文热度 44
|
一、子查询是什么
在SQL的世界里,子查询就像是一个“小助手”,它是一个嵌套在另一个查询里面的查询语句。就好比你在做一道复杂的菜,需要先准备好一些小配料,子查询就是那个先做好的小配料,等会儿要用到的时候再拿出来。
二、子查询的特殊用法
(一)相关子查询
想象一下,你有一个员工表,里面记录了员工的工资和部门信息。现在你想找出每个部门里工资高于该部门平均工资的员工。这时候可以使用相关子查询。
SELECT e1.*
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
这个查询看起来有点复杂,但其实很好理解。外层的查询(e1
)会逐行检查员工表,而内层的子查询(e2
)会针对每个员工所在的部门计算平均工资。关键在于,子查询里的WHERE
条件e2.department_id = e1.department_id
,它会根据外层查询当前处理的员工所在的部门来动态计算平均工资。这就像是子查询和外层查询在“互动”一样,每次外层查询换了一个员工,子查询就重新计算一次对应的部门平均工资,然后外层查询再拿这个结果来判断当前员工的工资是否高于平均工资。
(二)标量子查询
标量子查询就是一个只给你一个答案,总是返回一个单一的值,通常用在SELECT
子句里,给查询结果添加一些额外的信息。
举一个蠢一点的例子。比如,你想在查询员工信息的时候,顺便知道整个公司员工的平均工资是多少。你可以这样写:
SELECT employee_id, first_name, last_name,
(SELECT AVG(salary) FROM employees) AS avg_salary
FROM employees;
这里,子查询(SELECT AVG(salary) FROM employees)
只计算一次整个公司员工的平均工资,然后把这个值(一个标量)附加到每一行员工信息后面。不管员工表里有多少行数据,这个子查询都只执行一次,因为它只关心整个表的平均工资这个单一的值。
(三)行子查询
行子查询有点像一个比较严格的小能手,它会返回一行数据,通常用在WHERE
子句里,用来比较一行数据是否满足某个条件。举个例子,你想找出那些工资和佣金比例都和某个特定员工(比如员工ID为100的员工)一样的其他员工。你可以这样写:SELECT *
FROM employees
WHERE (salary, commission_pct) = (
SELECT salary, commission_pct
FROM employees
WHERE employee_id = 100
);
这个查询里,子查询(SELECT salary, commission_pct FROM employees WHERE employee_id = 100)
会找出员工ID为100的员工的工资和佣金比例,然后外层查询会把所有工资和佣金比例与之相同的员工找出来。行子查询在这里就像是一个严格的比较标准,它确保了两个字段(工资和佣金比例)都要完全匹配。
(四)表子查询
表子查询就像是一个神奇的“虚拟表”,它可以让你把子查询的结果当作一个临时的表来用,然后在这个“虚拟表”上进行进一步的查询操作。
比如,你想找出那些部门位置在1700的员工信息和他们对应的部门名称。你可以这样写:
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e,
(SELECT department_id, department_name
FROM departments
WHERE location_id = 1700) d
WHERE e.department_id = d.department_id;
这里,子查询(SELECT department_id, department_name FROM departments WHERE location_id = 1700)
先筛选出部门位置在1700的部门信息,然后把这个结果当作一个“虚拟表”d
,和员工表e
进行连接操作。这样,你就可以很方便地把符合条件的员工信息和部门名称一起查出来了。
阅读原文:原文链接
该文章在 2025/8/26 13:09:38 编辑过