目录
一、外连接的语法
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;