陆续的把单表查询学完了,今天学了连接查询。
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 可以省略
优点:表连接独立出来了,结构清晰,对表连接不满意,可以再追加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;
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;
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;
案例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;