多张表联合起来查询称为连接查询。
如果两张表查询没有限制,最终查询结果就会是两张表数据条数的乘积。如emp表中ename数据有14条,dept表中dename数据有4条,没有限制的最终查询结果是14*4=56条信息。表连接次数越多效率越低。
注意:为了查询效率,需要给表起别名,指定某个字段在哪个表中查询:e.ename就是在e表中查询ename,否则会在两张表中都找一遍ename字段,降低了查询效率。SQL语句举例:
select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
这条语句中给表emp起别名e,表dept起别名d。在字段前面加上对应的表别名 e.ename
一、内连接与外连接区别
内连接是将完全匹配查询条件的数据(符合on后面条件的数据)查询出来。
外连接的两张表有主次之分,除了查询满足条件的数据外,还将一张表中的其他不匹配查询条件的数据也全部显示出来,就是说主要查询一张表中的全部数据,捎带着关联查询另一张表。
二、内连接
1.等值连接
查询每个员工所在的部门名,显示员工名和部门名
select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;
其中,join表示表连接,inner表示内连接,可省略,加上inner可读性更好。on后面跟条件
2.非等值连接
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
此时条件不是等值关系,称为非等值连接。
3.自连接
查询员工的上级领导,要求显示员工名和对应的领导名?
mgr表示上级领导,smith的上级领导编号为7902,对应的名字为FORD
思路就是把一张表看成两张表,给查询出的两个列起别名。
select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr=b.empno;
由于KING员工的上级数据为NULL,所以查询结果不包含KING,总共13条记录。
三、外连接
1.左连接
查询join关键字左边的表全部数据,无论是否满足查询条件。在join关键字前加left
select e.ename,d.dname from dept d left outer join emp e on e.deptnp=d.deptno;
outer表示外连接,可以省略,带上outer可读性强。
2.右连接
即查询join关键字右边的表全部数据,无论是否满足查询条件。在join关键字前加right
select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;
左连接和右连接可以互相转换。
外连接案例:查询员工的领导名,要求显示所有员工名字和领导名字?
select a.ename as '员工名',b.ename as '领导名' from emp a left join emp b on a.mgr=b.empno;
与内连接中的自连接相比,外连接将KING这个领导名为NULL(不完全匹配查询条件)的数据也查询出来了,查询结果共14条数据。
四、三张表连接
语法:select ...from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件;
其中a和c的连接条件是指,a和b连接查询后的结果再与c连接查询所使用的条件。一条SQL语句中可以内外连接混合,只需在需要的join前加left或right即可。
案例:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?
emp表结构:
dept表结构:
salgrade表结构:
查询语句:
select e.ename,e.sal,d.dname,s.grade from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.hisal;
输出结果: