笛卡尔积+表的连接操作+案例
笛卡尔积
含义:用第一张表的每一行0与第二张表的每一行进行连接
消除笛卡尔积(等值条件)
(1)确定所需的数据表
(2)确定已知的关联字段
【案例1】查询每个雇员编号、姓名、职位、基本工资、部门名称、部门位置信息
select e.empno,e.ename,e.job,e.sal,
d.dname,d.loc
from emp e ,dept d //这里的e、d是别名
where e.deptno=d.deptno
【案例2】查询出每个雇员编号、姓名、雇佣日期、基本工资、工资等级
select e.empno,e.name,e.hiredate,e.sal,s.grade
from emp e ,salgrade s
where e.sal between s.losal and s.hisal;
【案例3】现要求清楚显示工资等级信息,按如下格式进行替换(这里使用decode函数)
5.E等级工资 4.D等级工资 3.C等级工资 2.B等级工资 1.A等级工资
select e.empno,e.ename,e.hiredate,e.sal
decode(s.grade,1,'E级工资',2,'D级工资',3,'C级工资',4,'B级工资',5,'A级工资',)
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
表的连接操作
内连接:等值连接
SQL:1999语法
select 字段列表
from table1 join table 2
on 连接条件
【案例4】使用内连接等值连接emp和dept两个表,查询雇员部门为ACCOUNTING的信息
select *
from emp e,dept d
where e.deptno=d.deptno
and d.name='ACCOUNTING';
------------------------------------------------------------------
使用1999语法
select *
from emp e join dept d
on e.deptno = d.deptno
where d.dname = 'ACCOUNTING' ;
------------------------------------------------------------------
自然连接检索多个表时,oracle将第一张表和第二张表中字段名数据类型相同的列进行自动连接,不用指明需要连接的列,使用natural join
外连接
左外连接 left join | 左关系属性=右关系属性(+)
右外连接 right join |左关系属性(+)=右关系属性
全外连接 full join |不支持(+)
自连接 :自己连接自己
【案例5】查询出每个雇员的编号、姓名、及上级领导的编号姓名
select e.empno,e.ename,m.empno,m.ename
from emp e,emp m
where e.mgr=m.empno(+); //左外连接