笛卡儿积现象:
多表连接查询就是从多个表中获取数据,若两张表进行连接查询的时候没有任何条件限制,最终的查询结果总数是两张表记录的乘积,该现象称为笛卡儿积现象。
内连接
根据连接条件从多个表中查询选择数据,显示这些表中与连接条件相匹配的行,组合成新的记录。
分类:
等值连接:连接条件为相等判断的
非等值连接:连接条件不为相等判断的
自连接:在一个连接查询中,涉及的两个表都是同一张表的查询,自连接是一种特殊的连接查询,它指相互连接的表在物理上为同一张表,在逻辑上分为两张表
#等值连接
select * from emp, dept
where emp.deptno = dept.deptno;
select * from emp join dept
on emp.deptno = dept.deptno;
select ename, emp.deptno, dname
from emp join dept
on emp.deptno = dept.deptno;
#非等值连接:查询员工的薪水等级
select e.ename, e.sal, s.grade
from emp e join salgrade s
on e.sal between s.losal and s.hisal;
#自连接:查询员工所对应的领导名称
select e1.ename, e2.ename mgr_name
from emp e1 join emp e2
on e1.mgr=e2.empno;
select e1.ename, e2.ename mgr_name
from emp e1, emp e2
where e1.mgr=e2.empno;
外连接
A表和B表能够完全匹配的记录查询出来之外,将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录时,会自动模拟出null值与之匹配。
注意:外连接的查询结果条数>=内连接的查询结果条数
分类:
左外连接left [outer] join显示左表全部记录,右表满足连接条件的记录
右外连接right [outer] join显示右表全部记录,左表满足连接条件的记录
#左外连接
select *
from dept left join emp
on emp.deptno = dept.deptno;
#右外连接
select *
from emp right join dept
on emp.deptno = dept.deptno;
#查询员工所对应的领导名称
select e1.ename, e2.ename mgr_name
from emp e1 left join emp e2
on e1.mgr=e2.empno;
练习题
1.查询员工所对应的部门名称
2.查询员工薪水所对应的薪水等级
3.查询出员工所对应的领导名称
4.查询员工所对应的部门名称,要求显示所有部门
5.查询员工所对应的部门名称,要求显示所有员工
6.查询出员工的部门名称,员工的领导名称和薪水等级
#1.
select *
from emp join dept
on emp.deptno=dept.deptno;
#2.
select ename, sal, grade
from emp join salgrade
on sal between losal and hisal;
#3.
select e1.ename, e2.ename mgr_name
from emp e1 join emp e2
on e1.mgr=e2.empno;
#4.
select *
from emp right join dept
on emp.deptno=dept.deptno;
#5.
select *
from emp left join dept
on emp.deptno=dept.deptno;
#6.
select e1.ename, e2.ename mgr_name, d.dname, grade
from emp e1
join emp e2 on e1.mgr = e2.empno
join dept d on e1.deptno=d.deptno
join salgrade on e1.sal between losal and hisal;