Oracle多表查询

  Oracle多表查询简单来说就是多张表连接进行查询,可以分为等值和不等值连接,自连接和内外连接,此外涉及到的还有笛卡尔集、1999语法连接、叉集、自然连接(using子句和on子句)。
  先简单介绍笛卡尔集,所谓笛卡尔集会在以下几点产生:(省略连接条件;连接条件无效;所有表中的所有行互相连接),为了避免笛卡尔集,可以在where子句中加上有效的连接条件;而1999语法连接就是从多个表中查询数据;叉集是使用cross join子句使连接的表产生叉集,叉集和笛卡尔集是相同的;自然连接是使用natural join子句,会以两个表中的具有相同名字是列为条件创建等值连接,在表中查询满足等值条件的数据,如果只是列名相同而数据类型不同,则会产生错误;在使用natural join子句创建等值连接时,可以使用using子句指定等值连接中需要用到的列,使用using可以在有多个列满足条件时进行选择,join和using子句经常同时使用;自然连接中是以具有相同名字的列为连接条件的,可以使用on子句指定额外的连接条件,这个连接条件是与其它条件分开的,on子句使语句具有更高的易读性。
这里主要讲解常用的等值连接、内外连接和自连接。
(1)等值连接
eg:显示员工的编号,姓名,部门名,使用表别名简化

select e.employee_id,e.first_name,d.department_name
from employees e,departments d
where e.department_id=d.department_id;

(2)内连接
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行。是我们用的最多的一种连接,前面我们使用的都是内连接。
eg:显示员工的信息和部门名称

select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno;

等价于

select e.ename,d.dname
from emp e inner
join dept d on e.deptno=d.deptno;
基本语法:select 字段1,字段2 … from 表名1 inner join表名2 on 条件

(3)外连接
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(null)。外连接的 where子句条件类似于内部连接, 但连接条件中没有匹配行的表的列后面要加外连接运算符, 即用圆括号括起来的加号(+)。
(我们创建2种表做测试:employees和departments)
① 左外连接
eg:显示所有员工的姓名last_name,部门号department_id和部门名称department_name.

select last_name, a.department_id,department_name
from employees a left outer join departments b
on a.department_id = b.department_id;

(left outer join中的outer可以省略)
也可以这样写 左外连接:

select last_name, a.department_id,department_name
from employees a,departments b
where a.department_id = b.department_id(+);

② 右外连接
eg:显示所有员工的姓名last_name,部门号department_id和部门名称department_name.

select e.last_name, e.department_id, d.department_name
from employees e
right outer join departments d
on (e.department_id = d.department_id);

(right outer join中的outer可以省略)
也可以这样写 右外连接:

select e.last_name, e.department_id, d.department_name
from employees e,departments d
where e.department_id(+) = d.department_id;

③ 完全外连接(满连接)
eg:显示所有员工的姓名last_name,部门号department_id和部门名称department_name.

select e.last_name, e.department_id, d.department_name
from employees e
full outer join departments d
on e.department_id = d.department_id;

(full outer join中的outer可以省略)


(4)自连接
自连接是指在同一张表的连接查询
eg:显示某个员工的上级领导的姓名?
比如显示员工‘FORD’的上级

select a.ename, b.ename
from emp a,emp b
where a.mgr = b.empno and a.ename ='FORD';

posted @ 2022-01-13 10:25  IT6889  阅读(185)  评论(0编辑  收藏  举报