
🔥承渊政道: 个人主页
❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C++知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》
✨逆境不吐心中苦,顺境不忘来时路!✨ 🎬 博主简介:

在实际开发中,数据库查询往往不会停留在"单表 + 简单条件"的层面.随着业务复杂度的提升,我们需要从多个数据表中获取关联信息,并对结果进行筛选、组合与重组.这时,MySQL 复合查询 就成为提升数据处理能力的核心技能之一.本篇文章围绕【MySQL数据库学习】(MySQL复合查询)展开,将带你系统理解多表查询的本质逻辑,包括 JOIN 多表连接、子查询(Subquery)、UNION 合并查询以及集合运算 等关键内容.通过这些能力,你可以把分散在不同表中的数据"拼接"为有意义的结果集,从而更高效地支撑复杂业务场景.无论你是刚接触 SQL 的初学者,还是希望提升查询性能与表达能力的开发者,这一部分内容都非常关键.掌握复合查询,不仅意味着你能写出"能用的SQL",更意味着你开始具备"用SQL解决问题"的能力.接下来,我们将从最基础的多表连接开始,一步步拆解复合查询的核心思想与实战写法.废话不多说,下面跟着小编的节奏🎵一起去疯狂的学习吧!

目录
- 1.复合查询(重点)
- 2.基本查询回顾
- 3.多表查询
- 4.自连接
- 5.子查询
-
- 5.1单行子查询
- 5.2多行子查询
- 5.3多列子查询
- 5.4在from子句中使用子查询
- 5.5合并查询
-
- 5.5.1union
- [5.5.2union all](#5.5.2union all)
- 6.实战OJ
1.复合查询(重点)
1.什么是复合查询
在 MySQL 中,**复合查询(Compound Query)**指的是通过多种查询方式组合来获取最终结果的查询结构.它不再局限于单一的 SELECT + 单表条件,而是通过 多表连接、子查询、集合运算等方式,实现更复杂的数据检索逻辑.
简单来说:
复合查询 = 多种 SQL 查询方式的组合使用,用来解决复杂业务数据需求。
2.为什么需要复合查询
在真实业务中,数据通常分散在多个表中,例如:
- 用户信息存在
users表 - 订单信息存在
orders表 - 商品信息存在
products表
如果只靠单表查询,你无法直接得到"某个用户买了什么商品、消费了多少钱"这样的结果.
因此必须使用复合查询,把多个表"拼接"或"组合"起来.
3.复合查询的核心类型
1.多表连接(JOIN)
用于将多个表按关联字段进行合并查询:
INNER JOIN:只返回匹配数据LEFT JOIN:保留左表全部数据RIGHT JOIN:保留右表全部数据
典型应用:订单 + 用户 + 商品信息整合查询
2.子查询(Subquery)
在一个查询中嵌套另一个查询,用来作为条件或数据源。
常见形式:
WHERE子查询FROM子查询SELECT子查询
典型应用:查"消费超过1000的用户"
3.UNION 合并查询
用于将多个查询结果纵向合并:
UNION:去重合并UNION ALL:不去重合并
典型应用:合并普通用户 + VIP 用户列表
4.集合运算
用于对查询结果进行"集合级别"的处理,例如:
INTERSECT(交集)EXCEPT(差集,MySQL中通常用替代写法)
典型应用:筛选不同条件下的重合数据
4.复合查询的本质
复合查询的核心思想可以概括为一句话:
把数据当作集合,通过"连接 + 过滤 + 合并"来重新组织信息。
2.基本查询回顾
查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

按照部门号升序而雇员的工资降序排序

使用年薪进行降序排序

显示工资最高的员工的名字和工作岗位

显示工资高于平均工资的员工信息

显示每个部门的平均工资和最高工资

显示平均工资低于2000的部门号和它的平均工资

显示每种岗位的雇员总数,平均工资

3.多表查询
实际开发中往往数据来自不同的表,所以需要多表查询.下面我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询.
案例:显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询.



其实我们只要emp表中的deptno = dept表中的deptno字段的记录

显示部门号为10的部门名,员工名和工资

显示各个员工的姓名,工资,及工资级别

4.自连接
自连接是指在同一张表连接查询
案例:显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号--empno)
使用的子查询:

使用多表查询(自查询)
使用到表的别名
from emp leader, emp worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别

5.子查询
1.什么是子查询?
子查询(Subquery) 就是:
在一个 SQL 语句里面,再嵌套一个 SQL 查询。
通俗理解:
👉 SQL 里面套 SQL
👉 用"内层查询结果"作为"外层查询条件"
2.子查询的基本结构
sql
SELECT 列
FROM 表
WHERE 字段 = (SELECT 字段 FROM 表 WHERE 条件);
5.1单行子查询
返回一行记录的子查询
显示SMITH同一部门的员工

5.2多行子查询
返回多行记录的子查询
in关键字;查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的

all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

any关键字;显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)

5.3多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
案例:查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

5.4在from子句中使用子查询
子查询语句出现在from子句中.这里要用到数据查询的技巧,把一个子查询当做一个临时表使用.
案例:显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

查找每个部门工资最高的人的姓名、工资、部门、最高工资

显示每个部门的信息(部门名,编号,地址)和人员数量
方法1:使用多表

方法2:使用子查询

5.5合并查询
合并查询(UNION Query) 就是:
把多个 SELECT 查询结果"纵向拼接"在一起
通俗理解:
子查询:嵌套(SQL 套 SQL)
JOIN:横向拼接(加列)
UNION:纵向拼接(加行)
5.5.1union
该操作符用于取得两个结果集的并集.当使用该操作符时,会自动去掉结果集中的重复行.
案例:将工资大于2500或职位是MANAGER的人找出来

5.5.2union all
该操作符用于取得两个结果集的并集.当使用该操作符时,不会去掉结果集中的重复行.
案例:将工资大于25000或职位是MANAGER的人找出来

6.实战OJ
6.1查找所有员工入职时候的薪水情况

sql
SELECT e.emp_no, s.salary
FROM employees e
JOIN salaries s
ON e.emp_no = s.emp_no
AND e.hire_date = s.from_date
ORDER BY e.emp_no DESC;




6.2获取所有非manager的员工emp_no

sql
SELECT e.emp_no
FROM employees e
LEFT JOIN dept_manager d
ON e.emp_no = d.emp_no
WHERE d.emp_no IS NULL;




6.3获取所有员工当前的manager

sql
SELECT de.emp_no,
dm.emp_no AS manager
FROM dept_emp de
JOIN dept_manager dm
ON de.dept_no = dm.dept_no
WHERE de.to_date = '9999-01-01'
AND dm.to_date = '9999-01-01'
AND de.emp_no <> dm.emp_no;





🚀真正的勇者不是流泪的人,而是含泪奔跑的人!
敬请期待下一篇文章内容
每日心灵鸡汤: 慢慢来,也是在前进!
人生不是一场必须立刻抵达终点的比赛.很多时候,我们焦虑,不是因为自己不够努力,而是因为太急着看到结果.请相信,那些你认真走过的路,那些你默默坚持的日子,都不会白费.也许今天的你还没有变得特别厉害,但只要你没有放弃,就已经在变好的路上.允许自己慢一点,允许生活有起伏.真正重要的不是跑得多快,而是在迷茫的时候,依然愿意向前走一步.愿你今天也能带着温柔和勇气,继续成为更好的自己.
