笛卡尔积 和内连接 外连接
实际上是两张表的乘积,查询结果没有实际意义
select * from emp,dept;
内连接-等值内连接(隐式)
select * from emp,dept where emp.deptno = dept.deptno;
内连接-不等值内连接
select * from emp,dept where emp.deptno <> dept.deptno;
内连接-显式内连接
select * from emp inner join dept on emp.deptno = dept.deptno;
多表查询时,习惯性的去取别名,数据库在后台进行多表操作的时候也会自动起别名进行查询。
select * from emp e,dept d where e.deptno = d.deptno;
自连接:自己连接自己
select * from emp e1,emp m1 where e1.mgr = m1.empno;
内连接查询练习
-- 查询员工编号,员工姓名,经理编号, 经理姓名
select e1.empno,e1.ename,e1.mgr,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno;
-- 查询员工编号,员工姓名,员工的部门名称,经理编号, 经理姓名
select e1.empno,e1.ename,d.dname,e1.mgr,e2.ename
from emp e1,emp e2,dept d
where e1.mgr = e2.empno and e1.deptno = d.deptno;
-- 查询员工编号,员工姓名,员工的部门名称,经理编号, 经理姓名,经理的部门名称
select e1.empno,e1.ename,d1.dname,e1.mgr,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno;
//这里是员工和经理两个对象,分别查询两个对象的部门名称,需要引入两次部门表,因为员工和他的经理可能是在同一个部门,也可能在不同的不能,如果只引用一个部门表的话会丢失掉员工和经理在不同部门的数据
-- 查询员工编号,员工姓名,员工的部门名称,员工工资等级,经理编号, 经理姓名,经理的部门名称
select e1.empno,e1.ename,d1.dname,s.grade,e1.mgr,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2,salgrade s
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno
and e1.sal between s.losal and s.hisal;
-- 查询员工编号,员工姓名,员工的部门名称,员工工资等级,经理编号, 经理姓名,经理的部门名称,经理工资等级
select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,e2.ename,d2.dname,s2.grade
from emp e1,emp e2,dept d1,dept d2,salgrade s1,salgrade s2
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
and e2.sal between s2.losal and s2.hisal;
-- 查询员工编号,员工姓名,员工的部门名称,员工工资等级(一级),经理编号, 经理姓名,经理的部门名称,经理工资等级
select e1.empno,e1.ename,d1.dname,
case s1.grade
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
else
'四级'
end,
e1.mgr,e2.ename,d2.dname,
case s2.grade
when 1 then '一级'
when 2 then '二级'
when 3 then '三级'
when 4 then '四级'
else
'顶级'
end
from emp e1,emp e2,dept d1,dept d2,salgrade s1,salgrade s2
where e1.mgr = e2.empno and e1.deptno = d1.deptno and e2.deptno = d2.deptno
and e1.sal between s1.losal and s1.hisal
and e2.sal between s2.losal and s2.hisal;
外连接查询练习
- 左外连接: 查询左表中所有的记录,如果右表没有对应的记录,则显示null
left outer join .. on
select * from emp e left outer join dept d on e.deptno = d.deptno;
- 右外连接: 查询右表中所有的记录,如果左表没有对应的记录,则显示null
right outer join .. on
select * from emp e right join dept d on e.deptno = d.deptno;
- Oracle外连接特有写法: (+) : 没有对应的记录, + null 值
左外连接
select * from emp e, dept d where e.deptno = d.deptno(+);右外连接
select * from emp e,dept d where e.deptno(+) = d.deptno;
–扩展: oracle特有, 全外连接 – full join
select * from emp e full join dept d on e.deptno = d.deptno;
内连接和外连接的区别和关系: