Oracle基础(十):关联查询、内连接、外连接、自连接
一、关联查询
查询数据是从多张表中关联查询出一个结果集。
关联查询的重点是添加连接条件。连接条件的作用是告知数据库表与表之间的数据是怎样对应的。
关联查询通常都要添加连接条件,否则会产生笛卡尔积,通常是一个无意义的结果集。
--查看每个员工的名字以及其所在部门的名字? 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';
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步