多表查询(图解join)

1 笛卡尔积

1.1 概念解释

  • 两张表的行数据 排列组合 的结果
    在这里插入图片描述
  • 准备sql语句
# 查询员工信息
select * from tb_emp;

# 查询部门信息
select * from tb_dept;

# 查询排列组合结果
select e.*, d.* from tb_dept d, tb_emp e;

1.2 问题

  • 里面有很多错误的数据需要过滤.

2 内连接查询

2.1 问题

  • 查询 员工信息和对应的部门信息.
    在这里插入图片描述

2.2 解决

在这里插入图片描述

2.2.1 方案1:

select e.*, d.* from tb_dept d, tb_emp e
where e.dept_id=d.did;

2.2.2 方案2:

select e.*,d.* from tb_emp e
inner join tb_dept d
on e.dept_id=d.did;

2.3 小结

  • 内连接查询两张表的公共部分, 就是能够关联上数据

3 外连接查询

  • 准备数据
insert into tb_emp values(5, '长孙无忌', 30000, null, 3);
insert into tb_emp values(6, '太平公主', 30000, null, 4);

3.1 问题

  • 因为 长孙无忌退休了, 太平公主年龄太小, 没有在部门任职, 所以使用内连接查询无法显示两个人信息
  • 能否查询时 将 长孙无忌 和 太平公主 查询出来且显示.
    在这里插入图片描述

3.2 解决

3.2.1 左外连接

在这里插入图片描述

select e.*, d.* from tb_emp e left join tb_dept d
on e.dept_id=d.did;

3.3.2 右外连接

在这里插入图片描述

select e.*, d.* 
from tb_dept d right join tb_emp e
on e.dept_id=d.did;

3.3 小结

  • 1 外连接以某表为主,会将关联上的数据 和 没有关联上的数据 都查询出来
  • 2 左外连接和右外连接 可以相互转化

4 自连接查询

4.1 问题

  • 在员工表, 查询员工的姓名和上级的姓名
    在这里插入图片描述

4.2 解决

select yg.ename 员工姓名,sj.ename 上级姓名
from tb_emp yg left join tb_emp sj
on yg.manager=sj.eid;

5 子查询

  • 子查询:一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)。

5.1 问题

在这里插入图片描述

需求1 查询归属于研发部的员工信息

# 方案一 分解式
# 1.1 在部门表 根据部门名称查询研发部对应的编号
select did from tb_dept
where dname='研发部'

# 1.2 在员工表 根据研发部的编号查询所属的员工信息
select * from tb_emp
where dept_id = 1

# 方案二 合并式
select * from tb_emp
where dept_id = (select did from tb_dept
                 where dname='研发部')

需求2 查询归属于研发部的员工信息 且 显示部门信息

# 方案一
select e.*, d.* from tb_emp e inner join tb_dept d
on e.dept_id = d.did
where d.dname='研发部';

# 方案二
# 2.1 查询研发部信息
select * from tb_dept where dname='研发部'

# 2.2 将2.1的结果当做临时表处理
select e.*, d.*
from tb_emp e inner join (select * from tb_dept where dname='研发部') d
on e.dept_id = d.did;

需求3 查询归属于研发部和行政部的员工信息

# 3.1 查询研发部和行政部的部门编号
select did from tb_dept
where dname in ('研发部', '行政部');

# 3.2 将3.1的结果作为参数值使用
select * from tb_emp
where dept_id in (select did from tb_dept
                  where dname in ('研发部', '行政部'));

需求4 查询归属于研发部和行政部的员工信息 且 显示部门信息

# 方案一
select e.*, d.* from tb_emp e inner join tb_dept d
on e.dept_id = d.did
where d.dname in ('研发部', '行政部');

# 方案二
# 4.1 查询研发部和行政部信息
select * from tb_dept where dname in ('研发部', '行政部')

# 4.2 将2.1的结果当做临时表处理
select e.*, d.*
from tb_emp e inner join (select * from tb_dept where dname in ('研发部', '行政部')) d
on e.dept_id = d.did;

5.2 小结

  • 子查询 就是将查询的结果 当做 临时表或一个值或一列值来处理.
  • 注意 in 要求只能是 一列值, 切忌切忌
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
INNER JOIN 是一种用于在数据库中连接多个数据表的查询语句。它可以通过共享相同字段的值来将多个表的数据合并在一起,使得我们可以根据特定的条件从多个表中检索和筛选数据。INNER JOIN 语句的用法可以根据需要连接不同数量的表。 引用中给出了一个 INNER JOIN 连接五个数据表的示例,其中使用了嵌套的 INNER JOIN 语句来连接这些表。通过在每个 INNER JOIN 语句中指定连接条件,我们可以将这五个表中满足条件的数据行合并在一起。 引用提供了一个图解 SQL JOIN 的博文,可以更直观地理解 INNER JOIN 的使用方式。在图解中,可以看到 INNER JOIN 将两个表中相同字段值的数据行进行匹配,并将满足条件的数据行返回作为结果集。 引用则展示了 INNER JOIN 连接四个数据表的示例。这个示例与引用中的示例类似,使用嵌套的 INNER JOIN 语句根据连接条件将四个表中的数据行合并在一起。 总结来说,INNER JOIN 是一种用于连接多个数据表的查询语句,可以根据共享字段的值将表中的数据行合并在一起。可以根据需要连接不同数量的表,并通过指定连接条件进行数据匹配。 #### 引用[.reference_title] - *1* *3* [INNER JOIN多个表连接](https://blog.csdn.net/loster_Li/article/details/77479088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [mysql 开发技巧之JOIN 更新和数据查重/去重](https://download.csdn.net/download/weixin_38528939/14836741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值