第六章 连接(联合)查询

第六章 连接(联合)查询,第1张

系列文章目录

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


文章目录 系列文章目录前言一、什么是连接查询?二、连接查询的分类三、笛卡尔积四、如何避免笛卡尔积现象?五、内连接5.1 等值连接5.2 内连接中的非等值连接5.3 内连接中的自连接 六、外连接6.1 外连接的左外连接6.2 外连接的右外连接6.3 练习题 总结


前言

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


一、什么是连接查询?

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

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;

结果如下:


总结

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/991065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存