文章目录
- ✨连接查询
- ✨什么是连接查询
- ✨连接查询的分类
- ✨笛卡尔积现象
- ✨内连接
- ✨什么叫内连接
- ✨内连接之等值连接
- ✨内连接之非等值连接
- ✨内连接之自连接
- ✨外连接
- ✨什么叫外连接
- ✨外连接之左外连接(左连接)
- ✨外连接之右外连接(右连接)
- ✨全连接
- ✨多张表连接
🌈你好呀!我是 山顶风景独好
💕欢迎来到我的博客,很高兴能够在这里和您见面!
💕希望您在这里可以感受到一份轻松愉快的氛围!
💕这里不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
🏠大家订阅本专栏!本专栏旨在为SQL初学者提供一条逐步迈向高级应用的学习之路,带您从零开始,一步一步练习,逐步掌握SQL的精髓,实现技能的提升与飞跃!😊
✨连接查询
✨什么是连接查询
- 从一张表中查询数据称为单表查询。
- 从两张或更多张表中联合查询数据称为多表查询,又叫做连接查询。
- 什么时候需要使用连接查询?
- 比如这样的需求:员工表中有员工姓名,部门表中有部门名字,要求查询每个员工所在的部门名字,这个时候就需要连接查询。
✨连接查询的分类
- 根据语法出现的年代进行分类:
- SQL92(这种语法很少用,可以不用学。)
- SQL99(我们主要学习这种语法。)
- 根据连接方式的不同进行分类:
- 内连接
- 等值连接
- 非等值连接
- 自连接
- 外连接
- 左外连接(左连接)
- 右外连接(右连接)
- 全连接
- 内连接
✨笛卡尔积现象
- 当两张表进行连接查询时,如果没有任何条件进行过滤,最终的查询结果条数是两张表条数的乘积。为了避免笛卡尔积现象的发生,需要添加条件进行筛选过滤。
- 需要注意:添加条件之后,虽然避免了笛卡尔积现象,但是匹配的次数没有减少。
- 为了SQL语句的可读性,为了执行效率,建议给表起别名。
✨内连接
✨什么叫内连接
满足条件的记录才会出现在结果集中。
✨内连接之等值连接
连接时,条件为等量关系。
案例:查询每个员工所在的部门名称,要求显示员工名、部门名。
select
e.ename,d.dname
from
emp e
inner join
dept d
on
e.deptno = d.deptno;
注意:inner可以省略。
✨内连接之非等值连接
连接时,条件是非等量关系。
案例:查询每个员工的工资等级,要求显示员工名、工资、工资等级。
select
e.ename,e.sal,s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
✨内连接之自连接
连接时,一张表看做两张表,自己和自己进行连接。
案例:找出每个员工的直属领导,要求显示员工名、领导名。
select
e.ename 员工名, l.ename 领导名
from
emp e
join
emp l
on
e.mgr = l.empno;
思路:
将emp表当做员工表 e
将emp表当做领导表 l
可以发现连接条件是:e.mgr = l.empno(员工的领导编号=领导的员工编号)
注意:KING这个员工没有查询出来。如果想将KING也查询出来,需要使用外连接。
✨外连接
✨什么叫外连接
内连接是满足条件的记录查询出来。也就是两张表的交集。
外连接是除了满足条件的记录查询出来,再将其中一张表的记录全部查询出来,另一张表如果没有与之匹配的记录,自动模拟出NULL与其匹配。
左外连接:
右外连接:
✨外连接之左外连接(左连接)
案例:查询所有部门信息,并且找出每个部门下的员工。
select
d.*,e.ename
from
dept d
left outer join
emp e
on
d.deptno = e.deptno;
注意:outer可以省略。
任何一个左连接都可以写作右连接。
✨外连接之右外连接(右连接)
还是上面的案例,可以写作右连接。
select
d.*,e.ename
from
emp e
right outer join
dept d
on
d.deptno = e.deptno;
案例:找出所有员工的上级领导,要求显示员工名和领导名。
select
e.ename 员工名,l.ename 领导名
from
emp e
left join
emp l
on
e.mgr = l.empno;
select
e.ename 员工名,l.ename 领导名
from
emp l
right join
emp e
on
e.mgr = l.empno;
✨全连接
什么是全连接?
MySQL不支持full join。oracle数据库支持。
两张表数据全部查询出来,没有匹配的记录,各自为对方模拟出NULL进行匹配。
客户表:t_customer
订单表:t_order
案例:查询所有的客户和订单。
select
c.*,o.*
from
t_customer c
full join
t_order o
on
c.cid = o.cid;
✨多张表连接
三张表甚至更多张表如何进行表连接
案例:找出每个员工的部门,并且要求显示每个员工的薪资等级。
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍