第六章 连接(联合)查询

系列文章目录

第一章 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;

二、连接查询的分类

根据表连接的方式分类,可分为以下几类:
第六章 连接(联合)查询_第1张图片

三、笛卡尔积

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

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

我们试着连接查询一下下面两张表
第六章 连接(联合)查询_第2张图片
第六章 连接(联合)查询_第3张图片
输入

select ename ,dname from emp,dept;

结果为:第六章 连接(联合)查询_第4张图片
第六章 连接(联合)查询_第5张图片

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

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

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

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

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

查询结果为:第六章 连接(联合)查询_第6张图片
可以看到,我们查询出来的都是正确的数据,但是需要注意的是,尽管我们查询出来了正确的数据,但是并没有避免笛卡尔现象,只不过是在查询出56条数据之后,又加了一步筛选,把符合条件的数据筛选出来;

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

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

查询出来的是相同的结果,但是减少了匹配次数第六章 连接(联合)查询_第7张图片

五、内连接

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

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中找出每个员工的薪资等级,并显示员工名,薪资,薪资等级;
第六章 连接(联合)查询_第8张图片
第六章 连接(联合)查询_第9张图片

我们可以输入

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

查询结果如下:
第六章 连接(联合)查询_第10张图片

5.3 内连接中的自连接

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

如:在表emp中查询员工的上级领导,要求显示员工名和对应的领导名:第六章 连接(联合)查询_第11张图片
代码如下:

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

结果如下:第六章 连接(联合)查询_第12张图片

六、外连接

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

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

结果为:第六章 连接(联合)查询_第13张图片

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 ;

结果为:第六章 连接(联合)查询_第14张图片

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

代码如下:

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;

结果如下:第六章 连接(联合)查询_第15张图片


总结

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

你可能感兴趣的