系列文章目录
第一章 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 leftjoin 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 leftjoin emp l on e.mgr=l.empno;
结果如下:
总结
如果您觉得有用的话,不妨点个赞吧!
版权归原作者 马孔多镇长 所有, 如有侵权,请联系我们删除。