MySQL-连接查询
什么是连接查询?
从一张表中查询数据成为单表查询,两张及以上的表联合起来查询数据就称为连接查询。
连接查询分类
- 根据语法年代分类:
SQL92:1992年出现的语法
缺点:结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
select
e.ename,d.dname
from
emp e,dept d
where
e.deptno = d.deptno;
SQL99:1999年出现的语法(重点)
优点:表连接的条件是独立的,连接之后,如果还需要进一步筛选,继续在后面添加where。
select
e.ename,d.dname
from
emp e
inner join
dept d
on
e.deptno = d.deptno;//条件是一个等量关系,所以被称为等值连接
//inner:内连接,可省略不写
SQL99的语法:
select
.....
from
a
inner join
b
on
a和b的连接条件
where
筛选条件;
//inner:内连接,可省略不写
- 根据表连接方式分类:
- 外连接:分为左外连接和右外连接
- 内连接:分为等值连接、非等值连接和自连接
- 全连接(非重点)
内连接之非等值连接
内连接的特点:把完全能够匹配上连接条件的数据查询出来。连接的两张表无主次关系。
- 案例:找出每个员工的薪资等级,要求显示员工名,薪资,薪资等级
如果没有条件限制,两张表任意进行连接,就会产生14*5=70条记录。
如何避免?加限制条件。
加限制条件并不会减少匹配次数,只是为了筛选目的数据。
select
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;//条件不是一个等量关系,称为非等值连接
内连接之自连接
案例:查询每个员工的上级领导,要求显示员工名和对应的领导
技巧:一张表看成两张表
emp a 员工表
emp b 领导表
在员工表里去员工名和对应的领导号,去领导表里取领导名
select
a.ename as '员工名',b.ename as '领导名'
from
emp a
join
emp b
on
a.mgr=b.empno;
以上就是内连接中的自连接,技巧就是一张表看做两张表,取两个别名予以分辨。
外连接(右外连接和左外连接)
- 案例:右外连接
select
e.ename,d.dname
from
emp e
right outer join
dept d
on
e.deptno = d.deptno;
//outer可省略,带着可读性更强
right表示将join关键字右边的表看做主表,主要将主表里的数据全部查询出来,捎带着关联查询左边表里的数据,在外连接中,两张表连接产生了主次关系。
- 左外连接
select
e.ename,d.dname
from
dept d
left outer join
emp e
on
e.deptno = d.deptno;
带有right的是右外连接,又叫右连接
带有left的是左外连接,又叫左连接
任何一个右外连接都有左外连接的写法
任何一个左外连接都有右外连接的写法
-
思考:外连接查询结果条数一定是大于等于内连接的查询结果条数?
正确 -
案例:查询每个员工的上级领导,要求显示所有员工的名字和领导名字
select
a.ename as '员工名',b.ename as '领导名'
from
emp a
left join
emp b
on
a.mgr=b.empno;
三张表或者四张表怎么连接
语法:
select
.....
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
join
d
on
a和d的连接条件
理解:a和b连接以后有个结果再去和c连接,如此再和d连接。
中间内连接和外连接都有可能,可以混合。
- 案例:找出每个员工的部门名称,同时找出每个员工的工资等级,要求显示员工名,工资,部门名,工资等级。
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;
- 案例:找出每个员工的部门名称,同时找出每个员工的工资等级,还有上级领导,要求显示员工名,领导名,部门名,工资,工资等级。
select
e.ename,e.sal,d.dname,s.grade,l.ename
from
emp e
join
dept d
on
e.deptno = d.deptno
join
salgrade s
on
e.sal between s.losal and s.hisal;
left join
emp l
on
e.mgr = l.empno;
总结:根据要求判断在哪里使用内连接或外连接。