Oracle 多表查询

1. 多表查询

  • 使用等值和不等值链接,在select语句中查询多个表的数据
  • 使用自连接
  • 使用外连接查询,不满⾜连接条件的数据
  • 笛卡尔积

2. 连接类型

2.1 Natural joins(自然连接)

  • natural join子句
  • using子句
  • on子句

2.2 Outer joins(外连接)

  • left outer jion (左外连接)
  • right outer join (右外连接)
  • full outer join (全外连接)

2.3 Cross join(交叉连接)

3. 语法

在这里插入图片描述

  1. 限制重复的列名
select e.ename,e.deptno,d.deptno,d.dname
  from emp e,dept d
where e.deptno=d.deptno;
  1. ⾃然连接
  • NATURAL JOIN⼦句,会以两个表中具有相同名字的列为条件创建等值连接。
  • 在表中查询满足等值条件的数据
  • 如果只是列名相同而数据类型不同,则会产⽣错误
  • location表通过LOCATION_ID列连接到DEPARTMENT表,这是两个表中惟⼀同名的列。如果存在其他公共列,联接就会全部使用它
    在这里插入图片描述

3.1 使用USING子句

如果多个列具有相同的名称,但自然连接的数据类型又不匹配,则可以使用using子句来指定,使用一个等值的列。

当有多个列匹配时,用using子句匹配唯一的列

natural join 和using子句互斥

使用USING子句检索

  • 不能对USING子句中的列,进⾏限制。
  • 对于USING子句中的列,如果同⼀个列在SQL语句中其他位置被使用到,则不能对其进行别名
    在这里插入图片描述
    在这里插入图片描述

3.2 使用ON子句

在这里插入图片描述

表连接语法

SELECT table1.col , table2.col
  FROM table1 JOIN table2
  ON (table1.col = table2.col)
SELECT table1.col , table2.col
  FROM table1 , table2
WHERE table1.col = table2.c

JOIN的附加条件
在这里插入图片描述
表连接的语法示例

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

3.3 表的自连接

表⾥有从属关系需求:查询员工的姓名以及其经理的姓员⼯的经理号 = 经理的员工

select * from emp;
select ename,mgr from emp;
select empno,ename from emp;
select e.empno,e.ename,e.mgr,m.empno,m.ename
from emp e,emp m
where e.mgr=m.empno;

在这里插入图片描述

3.4 非等值连接

在这里插入图片描述
多表查询(两种方式)

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

select e.ename,d.dname,s.grade
from emp e,dept d,salgrade s
where (e.sal between s.losal and s.hisal)
and (e.deptno=d.deptno);

3.5 INNER & OUTER JOIN 内连接和外连接

  • 两个表在连接过程中只返回匹配的行,被称为内连接
  • 两个表在连接过程中除了返回满⾜连接条件的行以外,还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接
  • 两个表在连接过程中除了返回满⾜连接条件的行以外,还返回两个表中不满⾜条件的行,这种连接称为全外连接

3.6 左/右外连接

可以使用外连接来查出在⼀个表中,不匹配连接条件的行

外连接的符号是 (+)

例子

  • 右外连接
    右外连接:列出所有部⻔的员⼯信息,包括没有员⼯的部⻔。
    e.deptno(+)=d.deptno;
    right outer join dept d on (e.deptno=d.deptno);SQL:1999 连接语法
    SELECT table1.col, table2.col 
    FROM table1 , table2
    WHERE table1.col(+) = table2.col ;
    
  • 左外连接
    左外连接:列出所有员⼯的部⻔信息,包括没有部⻔的员⼯。
    e.deptno=d.deptno(+); 传统 oracle 连接语法
    left outer join dept d on (e.deptno=d.deptno); SQL:1999 连接语法
    SELECT table1.col, table2.col
    FROM table1 , table2
    WHERE table1.col= table2.col(+)

3.7 全外连接

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

4. 笛卡尔积

笛卡尔积产生条件

  • 连接条件被遗漏
  • 连接条件不全
  • 所有表中所有的⾏=行互相连接
    为了避免笛卡尔积,可以在WHERE加⼊有效的连接条件

4.1 交叉连接

使用CROSS JOIN子句使连接的表产省生交叉集
交叉集也被称为在两个表之间的笛卡尔积

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值