连接查询

陆续的把单表查询学完了,今天学了连接查询。

1、什么是连接查询

 查询的时,只从一张表检索数据,被称为单表查询,在实际开发中,数据并不是存储在一张表中的,是同时存储在多张表中,这些表和表之间存在关系,我们在检索的时候通常是需要将多张表联合起来取有效数据,这种多表查询被称为连接查询或者跨表查询。

2、连接查询根据年代分类

sql92【1992】

sql99【1999:更新的语法,主要掌握掌握这种语法】

3、连接查询根据连接方式分类

内连接

    等值连接

    非等值连接

    自连接

外连接

    左外连接(左连接)

    右外连接(右连接)

全连接(使用较少

4、当多张表进行连接查询时,若没有任何条件进行限制,会法生什么想象?

若两张表进行连接查询的时候,没有任何条件限制,最终查询结果总数是两张表记录条数乘积,这种现象被称为笛卡而积现象,为了避免此想象,表连接时必须添加限制条件。虽然使用了限制条件,但是匹配的次数没有减少,还是56次,只是结果显示的是有效记录。

Select e.ename,d.dname From Emp e,dept d会出现笛卡而积现象

小知识点:多表查询时,给表起别名,效率高,可读写性高

案例1:查询每个一个员工所在的部门名称,要求最终显示员工名和对应的部门名称

Select e.ename,d.dname From Emp e,dept d where e.deptno=d.deptno;//这是sql92语法:内连接中的等值连接:


Select e.ename,d.dname From emp e  inner join dept d on e.deptno=d.deptno;//这是sql99语法:内连接中的等值连接  inner 可以省略

连接查询_第1张图片

优点:表连接独立出来了,结构清晰,对表连接不满意,可以再追加where进行过滤

案例2:找出每个一员工对应的工资等级,要求显示员工名,工资,工资等级

Sql99语法:内连接中的非等值连接 inner可以省略

Select e.ename,e.sal,s.grade From emp e join salgrade s ON e.sal BETWEEN s.losal AND s.hisal;

连接查询_第2张图片

Sql92语法:

Select e.ename,e.sal,s.grade From emp e,salgrade s where e.sal BETWEEN s.losal AND s.hisal;

案列3:找出每个一个员工对应的部门名称,要求部门名称都全部显示

Sql99语法外连接中的右外连接 省略了outer【右连接】

Select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;//省略了outer

Select e.ename,d.dname from emp e right outer join dept d on e.deptno=d.deptno;

连接查询_第3张图片

Sql99语法外连接中的右外连接 省略了outer【左连接】

Select e.ename,d.dname from dept d left join emp e on e.deptno=d.deptno;

注意:任何一个右外连接都可以写成左外连接,任何一个左外连接也同样可以写成右外连接

内连接:a表和b表能够完全 匹配的记录查询出来

外连接:a表和b表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录,会自动模拟出null与之匹配,查询结果条数>=内连接的查询结果条数

 

为什么inner或者outter可以省略,加上去有什么好处?

可以省略,区分内外连接的的标识关键字是sql语句中left/right,若存在都是外连接,反之都是内连接

加上的好处:增强可读性

 

案列4:找出每一个员工对应的领导名,要求显示所有的员工

Select a.ename empname,b.ename leadername from emp a left join emp b on a.mgr=b.empno;

 或者:

Select a.ename empname,b.ename leadername from emp b right join emp a on a.mgr=b.empno;

连接查询_第4张图片

案例5:找出每一个员工对应的部门名称,以及该员工对应的工资等级,要求显示员工名、部门名、工资等级

Select a.ename empname,b.dname deptname,c.grade grade from emp a join dept b on a.deptno=b.deptno join salgrade c on a.sal between losal and hisal;

连接查询_第5张图片

你可能感兴趣的:(mysql学习库)