第六章:Oracle的多表查询

目录

一、外连接的语法

二、SQL1999连接

交叉连接cross join(了解)

自然连接natural join

内连接

左外连接

右外连接

完全外连接

三、Oracle的set运算符

union

union all

intersect

minus


一、外连接的语法

Oracle和SQL Server的语法很多都一样,但外连接有点区别,所以这里特别提出来。


外连接是用“(+)”操作符来完成的,看下图:

右外连接:返回等号右边的表的全部记录(也就是table2),这个记录当中也包含不满足连接条件的记录;返回等号左边表满足条件的记录(也就是table1)。

左外连接:返回等号左边的表的全部记录(也就是table1),这个记录当中也包含不满足连接条件的记录;返回等号右边表满足条件的记录(也就是table1)。

二、SQL1999连接

SQL1999标准提到的几类连接查询:交叉连接、自然连接、内连接、外连接(又分为左外连接、右外连接、完全(满)外连接)。


交叉连接cross join(了解)

在实际的应用当中,交叉连接产生的笛卡尔集本身没有什么大的用处,只有在两个表连接的时候在后边加上限制条件才会有实际意义。另外,它可以提供一个快捷简单的办法来产生大量的数据集,可以用来测试等等。

自然连接natural join

一种特殊的等价连接,它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。

内连接

返回两个表中相匹配的数据。(只返回满足条件的数据)等值连接、非等值连接、自然连接都属于内连接。

左外连接

返回左表的全部记录,右表满足条件的记录。

右外连接

返回右表的全部记录,左表满足条件的记录。

完全外连接

返回左表和右表的全部记录

--cross join
select d.dname, e.ename, d.deptno, e.deptno from dept d cross join emp e;
select count(*) from emp;
select count(*) from dept;


--natural join
--查询员工名、工资以及所在部门名称
select e.ename, e.sal, d.dname from dept d natural join emp e;

--内连接
--using子句
select e.ename,e.sal, d.dname from dept d join emp e using(deptno);

--通过on指定内连接的条件
select e.ename,e.sal, d.dname from dept d join emp e on d.deptno = e.deptno;

--内连接的关键字inner join, inner通常省略
select e.ename,e.sal, d.dname from dept d inner join emp e on d.deptno = e.deptno;

--左外连接
select e.ename,e.sal, d.dname from dept d left join emp e on d.deptno = e.deptno;

--右连接
select e.ename,e.sal, d.dname from dept d right join emp e on d.deptno = e.deptno;

--完全连接
select e.ename,e.sal, d.dname from dept d full join emp e on d.deptno = e.deptno;

三、Oracle的set运算符

set运算符:集合操作符专门用于合并多条select语句的结果,包括四种:

  • union/union all:并集
  • intersect:交集
  • minus:差集

使用set操作符的注意事项:在select列表中的列名和表达式在数量和数据类型上要相对应。


union

union操作符用于取得两个结果集的并集,会自动去掉结果集中的重复行,并且会以第一列的结果进行升序排序。

union all

union all操作符用于取得两个结果集的并集,不会自动去掉结果集中的重复行,并且不会对结果集数据进行排序。

intersect

intersect操作符用于取得两个结果集的交集。只会显示同时存在于两个结果集中的数据,并且会以第一列的结果进行升序排序。

minus

minus操作符用于取得两个结果集的差集。只会显示在第一个结果集中存在,在第二个结果集中不存在的数据,并且会以第一列的结果集进行升序排序。

--emp01
create table emp01
as
select * from emp where deptno in(10,20);

--emp02
create table emp02
as
select * from emp where deptno in(20,30);

--合并显示emp01表和emp02表所有雇员的部门编号、员工号、员工姓名。
--10号部门有3个、20号部门有5个、
select * from emp01;
--30号部门有6个、
select * from emp02;

--union  14个记录
select deptno, empno, ename from emp01
union
select deptno, empno, ename from emp02;

--union all
--通过部门号进行排序
select deptno, empno, ename from emp01
union all
select deptno, empno, ename from emp02
order by deptno;

--通过列值进行排序,1代表第一列
select deptno, empno, ename from emp01
union all
select deptno, empno, ename from emp02
order by 1;

--intersect
select deptno, empno, ename from emp01
intersect
select deptno, empno, ename from emp02;

--minus
select deptno, empno, ename from emp01
minus
select deptno, empno, ename from emp02;
发布了26 篇原创文章 · 获赞 27 · 访问量 5465

猜你喜欢

转载自blog.csdn.net/weixin_44337241/article/details/104655767
今日推荐