Oracle从多个表中获取数据
  • 1.1 【表连接】
  • 1.2 【笛卡尔积:交叉连接】
  • 1.3 【使用表的别名】
  • 1.4 【连接的类型】
  • 1.5 【等连接】
  • 1.5.1 自然连接
  • 1.6 【非等连接】
  • 1.7 【外连接】
  • 1.7.1 【环境准备】
  • 1.7.2 【左外连接】
  • 1.7.3 【右外连接】
  • 1.7.4 【全外连接】
  • 1.8 【自连接】
  • 1.9 【多表关联】
  • 【总结】

1.1 【表连接】

06、Oracle从多个表中获取数据_外连接

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

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

06、Oracle从多个表中获取数据_左外连接_02

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

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

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

列定义模糊

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

06、Oracle从多个表中获取数据_左外连接_04

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

06、Oracle从多个表中获取数据_外连接_05

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

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

1.3 【使用表的别名】

06、Oracle从多个表中获取数据_外连接_07

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

06、Oracle从多个表中获取数据_外连接_08

1.4 【连接的类型】

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

分类标准不同

1.5 【等连接】

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

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

06、Oracle从多个表中获取数据_外连接_10

**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);
  • 1.
  • 2.
  • 3.

06、Oracle从多个表中获取数据_左外连接_11

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

06、Oracle从多个表中获取数据_外连接_12

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

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

06、Oracle从多个表中获取数据_外连接_13

1.5.1 自然连接

06、Oracle从多个表中获取数据_左外连接_14

SCOTT@orcl>select emp.ename,deptno,dept.dname
  2  from emp natural join dept;
  • 1.
  • 2.
<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.

1.6 【非等连接】

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

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

-- 查询员工的工资以及对应的工资等级
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;
  • 1.
  • 2.
  • 3.
  • 4.

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

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;
  • 1.
  • 2.
  • 3.

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

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.
  • 2.
  • 3.

06、Oracle从多个表中获取数据_外连接_18

1.7 【外连接】

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

06、Oracle从多个表中获取数据_外连接_20

1.7.1 【环境准备】

06、Oracle从多个表中获取数据_外连接_21

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(+);
  • 1.
  • 2.
  • 3.

06、Oracle从多个表中获取数据_外连接_22

**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.
  • 2.

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

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;
  • 1.
  • 2.

06、Oracle从多个表中获取数据_左外连接_24

**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.
  • 2.

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

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.
  • 2.
  • 3.

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

1.8 【自连接】

06、Oracle从多个表中获取数据_外连接_27

(表里有从属关系)

需求:查询员工的姓名以及其经理的姓名

员工的经理号 **= **经理的员工号

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;
  • 1.
  • 2.
  • 3.

06、Oracle从多个表中获取数据_外连接_28

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.
  • 2.

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

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);
  • 1.
  • 2.
  • 3.
  • 4.

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

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);
  • 1.
  • 2.
  • 3.

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

【总结】

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

e.deptno=d.deptno(+);
  • 1.

传统 **oracle **连接语法

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

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

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

全外连接

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

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

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