第六章 连接(联合)查询

系列文章目录

第一章 MySQL概述
第二章 MySQL的常用命令
第三章 MySQL中的常用数据类型
第四章 单行处理函数
第五章 多行处理函数(聚合函数)及group by的使用



前言

前五章的连接在上面,点击标题可以直达哦,接下来我们学习的是第六章内容;


一、什么是连接查询?

从一张表中查询数据,叫做单表查询;从多张表中查询数据,叫做多表查询;
连接查询的语法格式是

select column1、column2、column3 from table1, table2 ,table3;

二、连接查询的分类

根据表连接的方式分类,可分为以下几类:
在这里插入图片描述

三、笛卡尔积

在第一节我们给出了连接查询的语法格式为

select column1、column2、column3 from table1, table2 ,table3;

我们试着连接查询一下下面两张表
在这里插入图片描述
在这里插入图片描述
输入

select ename ,dname from emp,dept;

结果为:在这里插入图片描述
在这里插入图片描述

如果我们按照这个格式试着进行连接查询,就会发现一个现象:查询出来的数据条数是被联合查询的各个表中的数据条数的乘积,上面两张表中,dept中有4条数据,emp中有14条数据,那么查询出来的数据条数就是4*14共56条数据,我们把这个现象称为笛卡尔积现象;

四、如何避免笛卡尔积现象?

在查询出来的56数据中,其实大部分的数据都是错误的,比如关于“SAMITH”的有四条数据,但是只有与“RESEARCH”匹配的才是正确的,所以为了查询的高效性,我们应该在查询语句中添加条件以筛选出我们想要的数据;

如我们可以加入筛选条件:

select ename , dname from emp,dept where emp.deptno=dept.deptno;

查询结果为:在这里插入图片描述
可以看到,我们查询出来的都是正确的数据,但是需要注意的是,尽管我们查询出来了正确的数据,但是并没有避免笛卡尔现象,只不过是在查询出56条数据之后,又加了一步筛选,把符合条件的数据筛选出来;

若想要避免笛卡尔积现象,可以这样做

select emp.ename , dept.dname from emp,dept where emp.deptno=dept.deptno;

查询出来的是相同的结果,但是减少了匹配次数在这里插入图片描述

五、内连接

内连接,也被称为自然连接,只有两个表与查询条件相匹配的行才能在结果集中出现;

5.1 等值连接

等值连接,内连接的查询条件为等式时就是内连接的等值连接;

这里我们要稍微扩展一下,介绍一下SQL92和SQL99语法关于连接查询写法上的不同,
sql92

select emp. ename ,dept.dname from emp,dept where emp.deptno=dept.deptno;

sql99

select emp. ename ,dept.dname from emp join dept on emp.deptno=dept.deptno;

区别上就是将逗号改为了join,将where改为了on,sql99写法的好处是可以与where配合使用;

5.2 内连接中的非等值连接

顾名思义,非等值连接,内连接的查询条件为不等式时就是内连接的非等值连接;

比如在表salgrade和表emp中找出每个员工的薪资等级,并显示员工名,薪资,薪资等级;
在这里插入图片描述
在这里插入图片描述

我们可以输入

select e.ename ,e.sal, s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;

查询结果如下:
在这里插入图片描述

5.3 内连接中的自连接

连接查询不一定非要两张不同的表才可以进行连接,两张完全相同的表也可以进行连接查询;

如:在表emp中查询员工的上级领导,要求显示员工名和对应的领导名:在这里插入图片描述
代码如下:

select e.ename , s.ename from emp e join emp s on e.mgr=s.empno;

结果如下:在这里插入图片描述

六、外连接

在内连接的自查询结果中,不知道大家注意没有,其中并没有关于“KING及其领导”的数据,这是因为“KING”的领导是“NULL”,所以并没有显示出来,那么有没有一种方法让“KING”的领导显示为“NULL”呢?
有的,那就是外连接,代码如下:

select e.ename , s.ename from emp e left join emp s on e.mgr=s.empno;

结果为:在这里插入图片描述

6.1 外连接的左外连接

外连接的左外连接,就是在内连接的基础上,在join前加left,意思是将左边的表显示完整,如果某一项在右表中找不到对应项,就置为null,所以与"KING"对应的就是"NULL";

6.2 外连接的右外连接

外连接的右外连接与左外连接仅是"左右"的差别;

6.3 练习题

找出每个员工的部门名称以及工资等级,并显示员工名,部门名,薪资,薪资等级;

代码如下:

select e.ename, d.dname, s.grade ,e.sal from emp e join dept d on d.deptno = e.deptno join salgrade s on e.sal between s.losal and s.hisal ;

结果为:在这里插入图片描述

在上题的基础上,显示每个员工的上级领导名;

代码如下:

select e.ename, d.dname, s.grade ,e.sal,l.ename from emp e join dept d on d.deptno = e.deptno join salgrade s on e.sal between s.losal and s.hisal left join emp l on e.mgr=l.empno;

结果如下:在这里插入图片描述


总结

如果您觉得有用的话,不妨点个赞吧!

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马孔多镇长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值