MySQL基础知识—连接查询

介绍

多张表联合起来查询数据,被称为连接查询。

当两张表进行连接查询,没有任何的条件限制时,最终查询结果条数,是两张表条数的乘积——笛卡尔积现象。

表的连接越多,查询的效率越低。

分类

内连接

等值连接

连接运算符为“=”时,为等值连接

案例

目的:查询每个员工所在部门名称,并显示员工名和部门名。

思路:因为员工名和部门名是在两个不同的表中,所以需要对emp e和dept d表进行连接。

代码(92):

select
	 e.ename,d.dname
from
	 EMP e,DEPT d
where
	 e.deptno = d.deptno;

image-20210905155543201

代码(99):表连接条件是独立的,连接后,如果还需要进一步筛选,可以进一步添加where子句。

select
	e.ename,d.dname
from
    EMP e
inner join //inner可省略
	DEPT d
on
	e.deptno = d.deptno;

image-20210905155752807

非等值连接

当连接运算符为其他非“=”运算符时,为非等值连接。

案例

目的:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级。

思路:员工表

image-20210905161103865

薪资等级表

image-20210905161215078

代码:

select
	e.ename, e.sal, s.grade
from
    EMP e
inner join
    SALGRADE s
on
    e.sal between s.losal and s.hisal; //条件不是等量关系

image-20210905161513425

自连接

连接操作发生在一个表及其自身进行连接。在自连接中,一张表看成两张表来用。

案例

目的:查询员工的上级领导,要求显示员工名和对应的领导名。

思路:员工表如下

image-20210905162120192

将员工表看成两张表e1和e2,那么e1表中的mgr领导编号和e2表中的empno员工编号相等的话,对应e2表中的ename就是对应的领导名。

代码:

select
	e1.ename,e2.ename
from
	EMP e1
inner join
	EMP e2
on
	e1.mgr = e2.empno;

image-20210905162625489

外连接

左外连接(左连接)

左外连接:只保留左边关系的悬浮元组(在连接操作中被舍弃的元组称为“悬浮元组”)。

如果进行等值连接查询,只要两个表进行连接的字段连接不成功,两个表中的数据就不会被查询出来,但是左外连接查询的时候,左边表的所有数据都会进行显示,即使不能与右边的表连接成功。

案例

目的:将员工表和职位表的员工名和职位名进行左连接,让职务表作为主表。

代码:

select
	e.ename, d.dname
from
    DEPT d
left outer join
    EMP e
on
    e.deptno = d.deptno;

image-20210905164601649

右外连接(右链接)

右外连接:只保留右边关系的悬浮元组。

right表示将join关键字右边的表作为主表,主要是为了将主表中的数据全部查询出来,捎带关联查询左边的表。

案例

目的:将员工表和职位表的员工名和职位名进行右连接,让职务表作为主表。

代码:

select
	e.ename, d.dname
from
    EMP e
right outer join
    DEPT d
on
    e.deptno = d.deptno;

image-20210905164713161

全连接

多表连接

语法:

select
	....
from
	a
join
	b
on
	a和b的连接条件
join
	c
on
	a和c的连接条件
right join
	d
on
	a和d的连接条件

案例

目的:找出每个员工的部门名称以及工资等级、上级领导,要求显示员工名、薪资、部门名、薪资等级、领导名。

思路:

1、员工表

image-20210905165452707

2、部门表

image-20210905165507489

3、薪资等级表

image-20210905165525049

4、从员工表中取ename、sal,从部门表中取dname,从薪资等级表中取grade,就满足题目的需求了。

5、先将员工表和部门表进行等值连接,然后将员工表和薪资等级表进行非等值连接,最后将员工表和员工表进行一个外连接即可。

代码:(注意:其中的inner和outer可以省略,但是为了可读性,最好是带着)

select
	e.ename, e.sal, d.dname, s.grade, l.ename
from
	EMP e
inner join
	DEPT d
on
	e.deptno = d.deptno
inner join
	SALGRADE s
on
	e.sal between s.losal and s.hisal
left outer join
	EMP l
on
	e.mgr = l.empno;

image-20210905170407964

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值