ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle基础(十):关联查询、内连接、外连接、自连接

2022-06-08 08:33:41  阅读:189  来源: 互联网

标签:ename -- 查询 dept emp Oracle deptno 连接


一、关联查询

查询数据是从多张表中关联查询出一个结果集。
关联查询的重点是添加连接条件。连接条件的作用是告知数据库表与表之间的数据是怎样对应的。
关联查询通常都要添加连接条件,否则会产生笛卡尔积,通常是一个无意义的结果集。

--查看每个员工的名字以及其所在部门的名字?
select ename,dname from emp,dept 
where emp.deptno=dept.deptno;

(1)使用别名

当关联查询的表中有同名字段时,需要通过表名或表别名来指定该字段所属表。这样也可以简化SELECT语句的复杂度。

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

(2)笛卡尔积

笛卡尔积:
关联查询通常都要添加连接条件,否则会产生笛卡尔积,通常是一个无意义的结果集,
它的记录数是所有参与查询表的记录数乘积的结果,要避免出现,数据量大时极易出现内存溢出等现象,
N张表关联查询要有至少N-1个连接条件。
两张表中的每条记录都会连接,emp表14条记录,dept表4条记录,14*4=56条记录。

select e.ename,d.dname,d.deptno from emp e,dept d;--不添加连接条件,会产生笛卡尔积

(3)关联查询的例子

--查看在NEW YORK工作的员工(连接条件和过滤条件要成立)
select e.ename,e.deptno,d.loc
from emp e,dept d 
where e.deptno=d.deptno and d.loc='NEW YORK';

--查看工资高于3000的员工的名字、工资、部门名以及所在地?
select e.ename,e.sal,e.deptno,d.dname,d.loc 
from emp e,dept d 
where e.deptno=d.deptno and e.sal>3000;

--查看RESEARCH部门的员工信息?
select e.ename,e.sal,e.job,d.deptno,d.dname,d.loc 
from emp e,dept d 
where e.deptno=d.deptno and d.dname='RESEARCH';

--查看每个员工的名字以及其所在部门的名字?(普通关联查询的方式:SQL89标准)
select e.ename,d.dname 
from emp e,dept d 
where e.deptno=d.deptno 
and d.dname='SALES';

二、内连接

内连接和普通关联查询的作用一样。

内连接返回所有满足连接条件的记录,内连接也是关联查询的一种,也是用来完成关联查询的。 

语法:
SELECT XXX 
FROM tb_name1 JOIN tb_name2  
ON 连接条件 JOIN tb_name...
ON 连接条件 ...

 

--查看每个员工的名字以及其所在部门的名字?(内连接的方式:SQL92标准)
select e.ename,d.dname 
from emp e join dept d 
on e.deptno=d.deptno 
where d.dname='SALES';

三、外连接 

外连接在关联查询时会将满足连接条件的记录查询出来之外,还可以将不满足连接条件的记录也查询出来。
外连接分为:左外连接、右外连接和全外连接。

 (1)左外连接

以JOIN左侧表作为驱动表,驱动表(主要显示记录的表)中所有数据都要列出来,
那么当该表某条记录不满足连接条件时,那么来自右侧表的字段值全部填NULL

--使用左外连接,查询员工的名字和对应的部门名字
select e.ename,d.dname 
from emp e left outer join dept d 
on e.deptno=d.deptno ;--左外连接驱动表是emp,因为SCOTT的部门号不满足连接条件,所以来自右侧表dept的数据为NULL

(2)右外连接

右外连接:(与左外连接相反)

--(查询员工的名字和对应的部门名字)
select e.ename,d.dname 
from emp e right outer join dept d 
on e.deptno=d.deptno;--右外连接驱动表是emp,因为SCOTT的部门号不满足连接条件,所以来自左侧表emp的数据为NULL

(3)全外连接

全外连接:(结合了左外连接和右外连接,哪边不符合连接条件就填NULL) 

--(查询员工的名字和对应的部门名字)
SELECT e.*,d.dname 
FROM emp e FULL OUTER JOIN dept d 
ON e.deptno=d.deptno;

(4)使用(+)实现左外连接和右外连接

普通的关联查询也可以完成左外连接和右外连接,(+)在哪边字段,哪边的表就填NULL,但不可以实现全外连接

--左外连接
select e.ename,d.dname 
from emp e join dept d
on e.deptno(+)=d.deptno;--dept为驱动表

--右外连接
select e.ename,d.dname 
from emp e join dept d
on e.deptno=d.deptno(+);

四、自连接

当在当前表中的一条记录可以对应当前表的其他记录时,这种设计称为自连接。
自连接是为了解决同类型数据但又存在上下级关系的树状结构数据时使用。

--查看每个员工以及其上司的名字?
SELECT e.ename,e.mgr,m.empno,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno;

--查看每个员工以及其上司的名字?(内连接的方式)
SELECT e.ename,e.mgr,m.empno,m.ename
FROM emp e JOIN emp m
ON e.mgr=m.empno;

--查看SMITH的上司是谁?他在哪个城市工作?(连接条件和过滤条件同时成立)
select e.ename,m.ename,d.loc
from emp e,emp m,dept d 
where e.mgr=m.empno 
and m.deptno=d.deptno 
and e.ename='SMITH';

--使用内连接的方式实现
select e.ename,m.ename,d.loc 
from emp e join emp m 
on e.mgr=m.empno join dept d 
on m.deptno=d.deptno
where e.ename='SMITH';

标签:ename,--,查询,dept,emp,Oracle,deptno,连接
来源: https://www.cnblogs.com/codercat/p/16354217.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有