news 2026/9/17 8:45:01

mysql--多表查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mysql--多表查询

目录

一、联合查询

案例1,UNION

案例2,UNION? ALL

二、表连接查询

(一)内连接

(二)外连接

1.左外连接

2.右外连接?

3.全外连接

去重关键字 distinct?

三、自连接

案例1:

案例2:

四、子查询?


一、联合查询

  1. 作用:合并结果集就是把两个select语句的查询结果合并到一起!

  2. 合并结果集有两种方式:

UNION:合并并去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;

UNION ALL:合并但不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

案例1,UNION

select * from emp where deptno=30
union
select * from emp where job=‘SALESMAN’;

查询结果会去重:

案例2,UNION ALL

select * from emp where deptno=30
union all
select * from emp where job=‘SALESMAN’;

查询结果不会去重:

注意:

如果多条查询语句查询出来的结果,字段数量不一致,在进行union/union all联合查询时,将会报错。

mysql实现交集效果:通过子查询

create table emp_clerk as select * from emp where job=‘CLERK’;

create table emp_30 as select * from emp where deptno=30;

select * from emp_clerk where empno in(
select empno from emp_30
);

查询结果:

差集:

存在与30部门表中的数据, 但是不存在于文员表的记录

select * from emp_30 where empno not in(
select empno from emp_clerk
);

查询结果:

二、表连接查询

多张表之间进行两两连接,两张表的每条记录都相互连接一次,连接查询会产生笛卡尔积

笛卡尔积 tb_class:4条数据 tb_student:1 总记录 4*1=4条

select * from tb_class,tb_student;

查询结果:

数据太多,无法从中找到我们需要的数据,那么就要从笛卡尔积筛选需要的数据,添加条件

内连接,外连接:都连接条件,从笛卡尔积结果集筛选

(一)内连接

  1. [inner] join A内连接B 查询结果集中记录 满足条件才显示
  2. A的记录一定有一条与B对应

标准sql语法: select * / 列… from 表1 [innner] join 表2
on 连接条件; 推荐
非sql标准语法: select * / 列… from 表1 表2 where 连接条件;

(二)外连接

外连接的特点:让某些表的数据数据全部显示,不管是否满足条件

1.左外连接

SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 … ;

join 左边(前面)的表全部显示 left [outer] join


举例:

查询部门以及员工信息, 所有部门都显示

select * from dept d left join emp1 e
on e.deptno = d.deptno;

2.右外连接

SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 … ;

join 右边(前面)的表全部显示 right [outer] join


举例:

查询部门以及员工信息, 所有部门都显示

select * from emp1 e right join dept d
on e.deptno = d.deptno;

3.全外连接

两张表的数据全部显示 full outer join(MYSQL不支持它的写法)


mysql全连接: 把左外连接 联合(并集) 右外连接

select *from emp1 e left join dept d

on e.deptno = d.depton

union

select *from emp1 e right join dept d

on e.deptno = d.depton

去重关键字 distinct

distinct 列名,列名2… 多个列组合去重

select distinct dname from emp e join dept d
on e.deptno = d.deptno;

三、自连接

自己连接自己

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 … ;

案例1:

列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称

1.找表: emp e1 emp e2 dept d

2.找条件:受雇日期早于直接上级的 连接条件 e1.mgr=e2.empno

emp e1=dept d连接条件:e1.deptno=d,deptno

3.找编号、姓名、部门


select e1.empno,e1.ename,d.dname from emp e1 join dept d
on e1.deptno=d.deptno
join emp e2
on e1.mgr=e2.empno and e1.hiredate < e2.hiredate;

结果:

案例2:

列出所有员工的姓名及其直接上级的姓名

select e.ename,w.ename

from emp e join emp w on e.empno=w.mgr;

结果:

四、子查询

子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

语法:

SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );

子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。

分类:

子查询出现的位置:

  • where后,作为条件的一部分;

  • from后,作为被查询的一条表;

  • SELECT之后 ,作为被查询的一列;

当子查询出现在where后作为条件时,还可以使用如下关键字:

  • any

  • all


查询员工的信息,以及他的部门信息,以及该部门的人数 count(1)

  1. 找表: emp dept
  2. 找条件: 表连接条件
  3. 找列: 员工的信息,以及他的部门信息,以及该部门的人数
  4. 子查询作为表使用, 一定要给子查询取别名

select e.*,d.*,num from emp e join dept d
on e.deptno = d.deptno
join (select deptno,count(1) num from emp group by deptno) t
on e.deptno = t.deptno;


配合子查询使用的关键字

  1. any /some 子查询返回列表中,有任意一个满足即可
  2. all 子查询返回列表的所有值都必须满足

> any(select 子查询) > 最小值
< any(select 子查询) < 最大值

> all(select 子查询) > 最大值
< all(select 子查询) < 最小值

案例1:

查询薪水比30部门任意一个小的员工信息

select * from emp where sal < any(select sal from emp where deptno = 30 );

案例2:

查询薪水比30部门所有人薪水都高的员工

select * from emp where sal > all(select sal from emp where deptno = 30);

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 8:45:00

用 Wireshark 嗅探 ESP32 通信数据,教你看懂“WiFi 的语言”

&#x1f575;️ 用 Wireshark 嗅探 ESP32 通信数据&#xff0c;教你看懂“WiFi 的语言” 很多做 ESP32 的工程师都会遇到一个瓶颈&#xff1a; 代码看起来没问题日志也没有明显报错但 WiFi 连接就是不稳定 / 偶尔失败 / 延迟巨大 这时候&#xff0c;继续“猜”已经没意义了。 …

作者头像 李华
网站建设 2026/9/17 8:45:00

大型C项目的头文件管理:3招解决“重复包含”与“依赖混乱”

大型C项目的头文件管理:3招解决“重复包含”与“依赖混乱” 做过大型C项目开发或维护的你,大概率踩过头文件的“连环坑”:编译时突然弹出一堆“重定义”错误,排查半天发现是同一个头文件被重复包含;项目迭代到中后期,头文件之间形成“闭环依赖”,改一个底层头文件的宏定…

作者头像 李华
网站建设 2026/9/15 20:16:18

15_嵌入式C与控制理论入门:控制算法的定点数优化与精度平衡

嵌入式C与控制理论入门:控制算法的定点数优化与精度平衡 做嵌入式控制开发的你,大概率遇到过这种窘境:精心设计的PID、模糊控制算法,在PC上用浮点数仿真时效果拉满,可移植到STM32、TI C2000等MCU后,要么运算速度慢到突破实时控制阈值,要么因MCU缺少浮点运算单元(FPU)导…

作者头像 李华
网站建设 2026/9/17 1:44:24

【值得收藏】Agent-Graph:构建强大多智能体系统的完整教程

Agent-Graph是基于上下文工程的多智能体系统&#xff0c;提供Agent管理、Workflow可视化编排、Subagent任务分解、双层记忆架构、MCP集成等核心功能。支持团队协作&#xff0c;可分享对话并导出为训练数据&#xff0c;适合构建复杂AI工作流。项目开源&#xff0c;提供完整文档和…

作者头像 李华
网站建设 2026/9/15 20:10:47

华为HCCDP-GaussDB工作级开发者题库(带详细解析)

同学们有考HCCDP-GaussDB工作级开发者的没&#xff1f;整理了一部分题库&#xff0c;需要的再学可以一起学习。完整的题库已经发布在“题主”小程序上了&#xff0c;可以自己去找一下。以下哪一项系统视图可用于定位单个session在特性级上的内存问题&#xff1f;A、SESSION_STA…

作者头像 李华
网站建设 2026/9/17 7:18:38

大模型学习宝典:从小白到专家的进阶之路,建议收藏反复阅读

文章介绍了大模型的基本概念、分类和应用场景&#xff0c;详细解释了大模型的训练过程&#xff08;预训练和微调&#xff09;&#xff0c;分析了当前"百模大战"的发展趋势及面临的挑战&#xff0c;包括失业、版权、偏见、犯罪和能耗等问题。大模型作为AI的重要发展方…

作者头像 李华