06、Oracle从多个表中获取数据

1.1 【表连接】


需求:查询员工的姓名、部门号、部门名称。

-- 查询员工的姓名、部门号、部门名称。
SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept
  2  where emp.deptno=dept.deptno;


注意:同一列名多表使用时,要写上表名做前缀。

SCOTT@orcl>seelct ename,deptno,dname from emp,dept where emp.deptno=dept.deptno;


列定义模糊

1.2 【笛卡尔积:交叉连接】

SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept;



表连接不要忘记写 **where **条件。

1.3 【使用表的别名】

SCOTT@orcl>select e.ename,e.deptno,d.deptno,d.dname from emp e,dept d
  2  where e.deptno=d.deptno;

1.4 【连接的类型】


分类标准不同

1.5 【等连接】

传统 **Oracle **连接语法:

SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname from emp,dept
  2  where emp.deptno=dept.deptno;


**SQL1999 **语法(标准 SQL

SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept.dname
  2  from emp inner join dept
  3  on ( emp.deptno=dept.deptno);

SCOTT@orcl>select emp.ename,emp.deptno,dept.deptno,dept,dname 
  2  from emp inner join dept
  3  using(deptno);


连接列名称相同时,可以使用 using,但列名前不能加修饰

SCOTT@orcl>select emp.ename,deptno,dept.dname
  2  from emp inner join dept
  3  using(deptno);

1.5.1 自然连接

SCOTT@orcl>select emp.ename,deptno,dept.dname
  2  from emp natural join dept;
<br />![](https://cdn.nlark.com/yuque/0/2023/png/300262/1681183720179-df24b1c2-ab56-4525-890c-1a06d1029548.png#averageHue=%23080706&id=ZpDJ7&originHeight=473&originWidth=672&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)

1.6 【非等连接】


需求:查询员工的工资以及对应的工资等级

-- 查询员工的工资以及对应的工资等级
SCOTT@orcl>select e.empno,e.ename,e.sal,s.losal,s.grade
  2  from emp e,salgrade s
  3  where e.sal>=s.losal and e.sal<=s.hisal;

SCOTT@orcl>select e.empno,e.ename,e.sal,s.losal,s.hisal,s.grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;

SCOTT@orcl>select e.ename,e.sal,s.losal,s.hisal,s.grade from emp e join salgrade s
  2  on (e.sal between s.losal and s.hisal)
  3  where deptno in(10,20);


1.7 【外连接】



1.7.1 【环境准备】


1.7.2 【左外连接】

需求:列出所有员工及其对应部门信息, 包括没有部门的员工。
传统 **Oracle **连接语法:

SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
  2  from emp e,dept d
  3  where e.deptno=d.deptno(+);


**SQL:1999 **语法:

SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
  2  from emp e left outer join dept d on(e.deptno=d.deptno);


1.7.3 【右外连接】

需求:列出所有部门及其对应的员工信息, 包括没有员工的部门。
传统 **Oracle **连接语法

SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname from emp e,dept d
  2  where e.deptno(+)=d.deptno;


**SQL:1999 **语法:

SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
  2  from emp e right outer join dept d on(e.deptno=d.deptno);


1.7.4 【全外连接】

需求:查询员工对应的部门信息, 包括没有部门的员工和没有员工的部门

SCOTT@orcl>select e.empno,e.ename,e.sal,d.deptno,d.dname
  2  from emp e full outer join dept d 
  3  on (e.deptno=d.deptno);


1.8 【自连接】


(表里有从属关系)
需求:查询员工的姓名以及其经理的姓名
员工的经理号 **= **经理的员工号

SCOTT@orcl>select e.empno,e.ename,e.mgr,m.empno,m.ename
  2  from emp e,emp m
  3  where e.mgr=m.empno;

SCOTT@orcl>select e.empno,e.ename,e.mgr,m.empno,m.ename
  2  from emp e,emp m where e.mgr=m.empno(+);


1.9 【多表关联】

需求:查询员工的姓名、部门名称、工资等级

-- 查询员工的姓名、部门名称、工资等级
SCOTT@orcl>select e.ename,d.dname,s.grade
  2  from emp e,dept d,salgrade s
  3  where (e.sal between s.losal and s.hisal) and (e.deptno=d.deptno);

SCOTT@orcl>select e.ename,d.dname,s.grade 
  2  from emp e join dept d on (e.deptno=d.deptno)
  3  join salgrade s on (e.sal between s.losal and s.hisal);

【总结】

等值连接、不等值连接、外连接、自连接
笛卡尔积:忽略了连接条件
左外连接:列出所有员工的部门信息,包括没有部门的员工。

e.deptno=d.deptno(+); 

传统 **oracle **连接语法

left outer join dept d on (e.deptno=d.deptno); 

**SQL:1999 **连接语法
右外连接:列出所有部门的员工信息,包括没有员工的部门。

e.deptno(+)=d.deptno;
right outer join dept d on (e.deptno=d.deptno);

全外连接

full outer join dept d on (e.deptno=d.deptno);

注意:同一个外连接查询需求,使用左外连接或者右外连接都可以实现!左外连接是把左边表里数据显示完整,包括不符合连接条件的行;
右外连接是把右边表里数据显示完整,包括不符合连接条件的行。
如何区分左右:传统 **oracle **连接语法看 **where **子句中比较符,标准 **SQL **看 **from **子句中 join

【OCP】
051-7
join using/join on
051-121 表连接
join using / natural join

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值