版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TDCQZD/article/details/82708403
一、子查询语法
1、子查询 (内查询) 在主查询之前一次执行完成。
2、子查询的结果被主查询(外查询)使用 。
二、分类:单行子查询 和 多行子查询
注意事项
1)子查询要包含在括号内。
2)将子查询放在比较条件的右侧。
3)单行操作符对应单行子查询,多行操作符对应多行子查询。
三、单行子查询
1、基本介绍
- 只返回一行。
- 使用单行比较操作符。
2、执行单行子查询实操:
#题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资
#
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
)
AND salary > (
SELECT salary
FROM employees
WHERE employee_id = 143
);
3、在子查询中使用组函数
#题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
4、子查询中的 HAVING 子句
- 首先执行子查询。
- 向主查询中的HAVING 子句返回结果。
#题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary ) > (
#查询50号部门的最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
5、子查询中的空值问题
如果为空,子查询不返回任何行
# 子查询中的空值问题
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');
6、非法使用子查询
#错误原因:Subquery returns more than 1 row。因为内查询是一个多行子查询,却使用了单行子查询的运算符。
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id
);
四、多行子查询
1、在多行子查询中使用IN操作符
#多行子查询
# in的使用
SELECT employee_id, last_name
FROM employees
WHERE salary IN
(SELECT MIN(salary)
FROM employees
GROUP BY department_id
);
2、在多行子查询中使用 ANY 操作符
any 的使用
#题目:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(
#job_id为‘IT_PROG’部门的员工工资
SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
)
AND job_id <> 'IT_PROG';
3、子查询中的空值问题
SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
(SELECT mgr.manager_id
FROM employees mgr);
4、如何使用子查询。
在查询时基于未知的值时,应使用子查询。
五、子查询相关性与不相关性
所有的子查询可以分为两类,即相关子查询和非相关子查询
1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。
2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。
3)故非相关子查询比相关子查询效率高
#非相关查询
# 查询工资比公司平均工资高的员工的员工号,姓名和工资。
SELECT employee_id,last_name,salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
#相关查询:
#查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
SELECT employee_id,last_name,salary
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e1.`department_id` = e2.`department_id`
);