【十,MySQL】基础篇--多表查询(内连接、外连接、自连接、联合查询、子查询)

本文通过SQL查询语句的实例,详细讲解了内连接(包括隐式和显式)、外连接(左连接和右连接)、自连接以及联合查询的使用方法。涵盖了员工和部门、员工与领导、员工与部门间的关系查询,以及不同条件筛选的数据合并。旨在帮助读者深入理解SQL中的连接操作和数据组合技巧。
摘要由CSDN通过智能技术生成

一,内连接
inner可以省略
在这里插入图片描述
练习:

#===========================================隐式内连接==================================================
# 1,查询每一个员工的姓名,及关联部门的名称(隐式内连接实现)
select emp.name as 姓名, dept.name as 部门 from emp,dept where emp.dept_id = dept.id;

# 2,查询每一个员工的姓名,及关联部门的名称(显式内连接实现)
select a.name as 姓名 , b.name as 部门 from emp a join dept b on a.dept_id = b.id;

二,外连接
在这里插入图片描述
练习:

#===========================================外连接==================================================
# 1,查询emp表的所有数据,和对应的部门信息(左外连接)
# 表结构:emp,dept
# 连接条件:emp.dept_id = dept.id
select a.* ,b.name from emp a
left join dept b on a.dept_id = b.id;

# 2,查询dept表的所有数据,和对应的员工信息(右外连接)
select a.* ,b.* from dept a
right join emp b on a.id = b.dept_id;

三,自连接(可以是内连接,也可以是外连接)
在这里插入图片描述
在这里插入图片描述
练习:

#===========================================自连接==================================================
# 要将一张表堪称两张表
# 1,查询员工,及其所属领导的名字(使用内连接)
select a.name as 姓名,b.name as 直系领导 from emp a
join emp b on a.managerid = b.id;

# 2,查询所有员工emp,及其领导的名字emp,如果员工没有领导,也要查询出来(使用外连接)
select a.name as 姓名 , b.name as 直系领导 from emp a
left join emp b on a.managerid = b.id;

四,联合查询
在这里插入图片描述
练习:

#===========================================联合查询==================================================
# 1,查询所有年龄大于20的员工,和所有薪资低于7000的员工
select * from emp where age > 20
union all
select * from emp where salary < 7000;
# 对查询的结果去重
select * from emp where age > 20
union
select * from emp where salary < 7000;

五,子查询
在这里插入图片描述
1,标量子查询
在这里插入图片描述
练习:

# 标量子查询
# 1,查询“研发部”的所有员工信息
# ①查询“研发部”的id
# ②根据研发部门id,查询员工信息
select * from emp where dept_id = (select id from dept  where name = '研发部');
# 2,查询在“井中月”入职之后的所有员工信息
# ①查询“井中月”的入职日期
select entrydate from emp where name = '井中月';
# ②查询查询指定入职日期之后入职的员工信息
select * from emp where entrydate > (select entrydate from emp where name = '井中月');

2.列子查询

练习:

# 列子查询
# 1,查询“销售部”和“市场部”的所有员工信息
# ①查询“销售部”和“市场部”的部门id
# ②查询员工表的部门id在“销售部”和“市场部”
select * from emp where dept_id in (select id from dept where name in ('销售部','市场部'));

# 2,查询比财务部所有人工资都高的员工信息
# ①查询所有“财务部”的员工薪资
# ②比“财务部”所有人工资都高的员工信息
select * from emp where salary > all (select a.salary from emp a
left join dept b on a.dept_id = b.id
where b.name = '财务部');
# 实现方式不止一种
select * from emp where salary > (select max(a.salary) from emp a
left join dept b on a.dept_id = b.id
where b.name = '财务部');

# 3,查询比研发部其中任意一人高的员工信息(任意满足其一)
# ①查询所有“研发部”的员工薪资
# ②比研发部其中任意一人高的员工信息
select * from emp where salary > any (select a.salary from emp a
left join dept b on a.dept_id = b.id
where b.name = '研发部');

3,行子查询
在这里插入图片描述
练习:

# 行子查询
# 1,查询与”王语嫣“直系领导和薪资相同的员工信息
# ①查询”王语嫣“的直系领导和薪资
# ②与”王语嫣“直系领导和薪资相同的员工信息
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '王语嫣');

4,表子查询

# 表子查询
# 1,查询与”周芷若“、”王五“职位和薪资相同的员工信息
# ①查询”周芷若“、”王五“的职位和薪资
# ②与”周芷若“、”王五“职位和薪资相同的员工信息
# 满足子表其一即可
select * from emp where (job,salary) in (select job,salary from emp where name in ('周芷若','王五'));

# 2,查询入职日期是”2019-01-01“之后的员工信息,及其部门信息
# ①查询入职日期是”2019-01-01“之后的员工信息  将这个子查询作为一张子表,再去联查部门表
# ②查询这部分员工对应的部门信息
select * from (select * from emp where entrydate > '2019-01-01') a
left join dept b on a.dept_id = b.id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值