DQL_SQL多表连接查询

多表联合查询:一般一个业务都会对应多张表,避免出现数据冗余

连接查询

分类:按连接方式

分类 细分
内连接(inner join) 等值连接
非等值连接
自连接
外连接(left join ; right join) 左外连接
右外连接
全连接

在表的连接查询方面有一种现象被成为:笛卡尔积现象(笛卡尔乘积现象)

案例:找出每个员工的部门名称,要求显示员工名和部门名

1
select e.ename,d.dname from emp e,dept d;

当两张表进行连接查询时,如果没有任何条件限制,最终查询结果为两张表的乘积

表的别名好处:执行效率高,指定在那张表中查询;可读性好

避免笛卡尔积现象

添加条件进行过滤,但是匹配次数仍然没变,只是显示的是过滤后的记录


内连接—–等值连接

最大特点:条件是等量关系

找出每个员工的部门名称,要求显示员工名和部门名

sql92(旧语法),where后添加条件为and,关系不明确

1
select e.ename,d.dname from emp e ,dept d where e.deptno=d.deptno;

sql99(新语法),后面可以添加where过滤条件,inner可省略

1
select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;

内连接—–非等值连接

最大特点:连接条件中的关系是非等量关系,inner可省略

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

1
2
3
4
5
6
7
8
select 
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;

内连接—–自连接

最大特点:一张表看做两张表,自己连接自己,inner可省略

案例:找出每个员工的上级领导,要求显示员工名和对应的上级 的领导名

1
2
3
4
5
6
7
8
select 
a.ename as '员工名' ,b.ename as '领导名'
from
emp a
inner join
emp b
on
a.mgr=b.empno;


#### 外连接

内连接:两张表没有主副之分inner 可省略

外连接:一张为主表,一张为副表,当副表中没有数据和主表中数据匹配,副表自动模拟出null与之匹配outer 可省略

左连接:左外连接,左边的表为主表

右连接:右外连接,右边的表为主表

案例:找出每个员工的上级领导(所有员工必须查询出)

1
2
3
4
5
6
7
8
select 
a.ename as '员工名' ,b.ename as '领导名'
from
emp a
left outer join
emp b
on
a.mgr=b.empno;

案例:找出没有员工的部门

1
2
3
4
5
6
7
8
9
10
select 
d.*
from
emp e
right join
dept d
on
e.deptno=d.deptno
where
e.empno is null;


多表连接

1
2
3
4
5
6
7
8
9
10
11
12
select
...
from
a
join
b
on
...
join
c
on
...

表示a表与b表先连接查询,然后a表再与c表连接查询

案例:找出每一个员工的部门名称,工资等级

1
2
3
4
5
6
7
8
9
10
11
12
select
e.ename,d.dname,s.grade
from
emp e
join
dept d
on
e.deptno=d.deptno
join
salgrade s
on
e.sal between s.local and s.hisal;

案例:找出每一个员工的部门名称,工资等级,以及上级领导

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
select
e.ename as '员工',d.dname,s.grade,e1.ename as '领导'
from
emp e
join
dept d
on
e.deptno=d.deptno
join
salgrade s
on
e.sal between s.local and s.hisal
left join
emp e1
on
e.mgr=e1.empno;