【MySQL】第六章 子查询

角度1:从内查询返回的结果的条目数

1,单行子查询 vs 多行子查询

单行子查询是指内查询返回单行单列结果(一个标量值),然后外查询可以使用单行比较运算符(如 =、>、<、>=、<=、<>)与这个值进行比较

sql 复制代码
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
        );

多行子查询是指内查询返回多行单列的结果集,外查询使用多行比较运算符 (如 IN、ANY、ALL)或 EXISTS 运算符与这个结果集进行比较筛选

sql 复制代码
#题目:返回其它job_id中比job_id为'IT_PROG'部门任一工资低的员工的员工号、
#姓名、job_id 以及salary
​
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY (
        SELECT salary
        FROM employees
        WHERE job_id = 'IT_PROG'
        );
​
#题目:返回其它job_id中比job_id为'IT_PROG'部门所有工资低的员工的员工号、
#姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ALL (
        SELECT salary
        FROM employees
        WHERE job_id = 'IT_PROG'
        );

角度2:内查询是否被执行多次

2,相关子查询 vs 不相关子查询

相关子查询:内层查询依赖外层查询 不相关子查询:内层查询不依赖外层查询

比如:相关子查询的需求:查询工资大于本部门平均工资的员工信息。 不相关子查询的需求:查询工资大于本公司平均工资的员工信息。

sql 复制代码
#回顾:查询员工中工资大于公司平均工资的员工的last_name,salary和其department_id
#6.1 
SELECT last_name,salary,department_id
FROM employees
WHERE salary > (
		SELECT AVG(salary)
		FROM employees
		);
		
#题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
#方式1:使用相关子查询
SELECT last_name,salary,department_id
FROM employees e1
WHERE salary > (
		SELECT AVG(salary)
		FROM employees e2
		WHERE department_id = e1.`department_id`
		);

#方式2:在FROM中声明子查询
SELECT e.last_name,e.salary,e.department_id
FROM employees e,(
		SELECT department_id,AVG(salary) avg_sal
		FROM employees
		GROUP BY department_id) t_dept_avg_sal
WHERE e.department_id = t_dept_avg_sal.department_id
AND e.salary > t_dept_avg_sal.avg_sal


#题目:查询员工的id,salary,按照department_name 排序

SELECT employee_id,salary
FROM employees e
ORDER BY (
	 SELECT department_name
	 FROM departments d
	 WHERE e.`department_id` = d.`department_id`
	) ASC;

3,子查询可以放的位置

a,子查询放在 FROM 中

sql 复制代码
#方式2:在FROM中声明子查询
SELECT e.last_name,e.salary,e.department_id
FROM employees e,(
        SELECT department_id,AVG(salary) avg_sal
        FROM employees
        GROUP BY department_id) t_dept_avg_sal
WHERE e.department_id = t_dept_avg_sal.department_id
AND e.salary > t_dept_avg_sal.avg_sal

b,子查询放在 ORDDER BY 中

sql 复制代码
#题目:查询员工的id,salary,按照department_name 排序
​
SELECT employee_id,salary
FROM employees e
ORDER BY (
     SELECT department_name
     FROM departments d
     WHERE e.`department_id` = d.`department_id`
    ) ASC;
    
​
SELECT : 用于聚合函数
FROM   : 用于查表操作
WHERE  : 用于过滤操作,如进行条件分组
ORDER BY : 用于按照表进行排序操作
HAVING   : 用于聚合函数,进行分组操作

# 按照返回的部门名称进行排序
#结论:在SELECT中,除了GROUP BY 和 LIMIT之外,其他位置都可以声明子查询!
/*
SELECT ....,....,....(存在聚合函数)
FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件
(LEFT / RIGHT)JOIN ... ON ....
WHERE 不包含聚合函数的过滤条件
GROUP BY ...,....
HAVING 包含聚合函数的过滤条件
ORDER BY ....,...(ASC / DESC )
LIMIT ...,....
*/

相关推荐
程序员塔塔喵17 分钟前
【MySQL篇|第十而二篇】深层次讲解MVCC机制
mysql·mvcc
飞浪纪元[FWC–FE]23 分钟前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
Ivanqhz27 分钟前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
Tsuki_tl32 分钟前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
Gauss松鼠会32 分钟前
GaussDB 整体架构解析
运维·服务器·网络·数据库·sql·架构·gaussdb
系统集成-鹰翔38 分钟前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
西瓜拿铁好喝38 分钟前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
一技安身39 分钟前
MySQL 8.4.13 LTS 通用二进制包(Linux免安装版)完整教程
linux·mysql·adb
代码派1 小时前
业务不停机迁移 MySQL 到 TiDB,NineData 数据增量同步实操演示
数据库·mysql·tidb·ninedata·无停机迁移·增量迁移·全量迁移
Gauss松鼠会1 小时前
GaussDB 中 gsql 与 DBeaver(JDBC)客户端工具查询时间不一致:原因、排查与处理
运维·服务器·数据库·sql·gaussdb·经验总结