Oracle-6 多表连接

————————————————————————–

Oracle自有写法:等值连接、非等值连接、外部连接、自身连接


笛卡尔积 : 连接条件被省略 或 连接条件无效
select * from emp,dept;–56行 = 14*4


等值连接 : N张表关联,必须有N-1个连接条件,否则产生笛卡尔积

查询所有员工编号,姓名,部门编号,工作地点
select * from emp,dept where emp.deptno = dept.deptno;
select emp.,dept. from emp,dept where emp.deptno = dept.deptno;

使用AND运算符增加其它查询条件
现在只想查询工作地点在NEW YORK的员工编号,姓名,部门编号,工作地点
select empno,ename,emp.deptno,loc from emp,dept where emp.deptno = dept.deptno and loc = ‘NEW YORK’;

限制歧义列名
使用表名作为前缀
select emp.empno,emp.ename,emp.deptno,dept.loc from emp,dept where emp.deptno = dept.deptno and loc = ‘NEW YORK’;

使用表的别名
select e.empno,e.ename,e.deptno,d.loc from emp e,dept d where e.deptno = d.deptno and d.loc = ‘NEW YORK’;–效率高点
select e.empno,e.ename,e.deptno,d.loc from emp e,dept d where d.loc = ‘NEW YORK’ and e.deptno = d.deptno;–效率低点


非等值连接

查询每个员工的姓名,工资,工资等级
select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal;


外部连接

查询所有雇员姓名,部门编号,部门名称,包括没有员工的部门40也要显示出来
select e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+) = d.deptno;
+所在的emp表为从表,增加一个万能空行 dept表为主表,会显示表中所有的数据

查询所有雇员姓名,部门编号,部门名称,包括没有部门的员工也要显示出来
select e.ename,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno(+);–emp主表 dept从表


自身连接

查询每个员工的姓名和直接上级姓名
select e.ename 员工姓名,mgr.ename 上级姓名 from emp e,emp mgr where e.mgr = mgr.empno;

——————————————————————————–

SQL99标准


交叉连接(cross join):会产生笛卡尔积
select * from emp cross join dept;
select * from emp,dept;–同上

自然连接(natural join)
– 自动连接列名相同、数据类型相同的列
– 连接的列仅显示一次,默认显示在第一列
select * from emp natural join dept;

using子句:指定连接条件
–注意: 列名不允许表名或表别名修饰
NATURAL JOIN子句和USING子句是相互排斥的,不能同时使用。
select * from emp join dept using(deptno);

on子句
select * from emp join dept on(emp.deptno = dept.deptno);
select * from emp,dept where emp.deptno = dept.deptno;

左外连接(left outer join)
select * from emp left outer join dept on(emp.deptno = dept.deptno);

右外连接(right outer join)
select * from emp right outer join dept on(emp.deptno = dept.deptno);

全外连接(full outer join)
select * from emp full outer join dept on(emp.deptno = dept.deptno);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值