SQL1999连接
连接查询新语法:
SELECT table1.column_name,table2.column_name FROM table1
[CROSS JOIN table2] //交叉连接
[NATURAL JOIN table2] | //自然连接
[JOIN table2 USING (column_name)] | //内连接
[JOIN table2 ON (table1.column_name = table2.column_name)] | //内连接
[LEFT | RIGHT | FULL OUTER JOIN table2 //左外连接 右外连接 全(满)外连接
ON (table1.column_name = table2.column_name)];
交叉连接(了解即可)
用于生成两张表的笛卡尔集
Select d.dname,e.ename,d.deptno,e.deptno
from dept d cross join emp e;
自然连接:特殊的等价连接,它将表中具有相同名称的列自动进行记录匹配
自然连接不必指定任何同等连接条件。(内连接中的一种)
语法:
SELECT table1.column_name,table2.column_name
FROM table1 NATURAL JOIN table2;
举例:查询员工名、工资以及所在部门名称。
Select e.ename,e.sal,d.dname
From emp e natural join dept d;
9.5.3连接介绍
内连接(返回两张表完全满足连接条件的记录)
左连接:左表全部记录,右表满足条件记录。缺失的数据用null
右连接:与左连接相反 缺失的数据用null
完全外连接:两张表的全部内容相当于左连接和右连接并集去掉重复。
内连接
只返回两个表中相匹配的数据(满足条件的数据)
等值连接、非等值连接、自然连接都属于内连接。
用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 e.deptno=d.deptno;
左(外)连接:用于返回左表的全部记录,右表的满足条件的记录
LEFT[OUTER]JOIN
Select e.ename,e.sal,d.dname from dept d left join emp e on e.deptno = d.deptno;
右(外)连接:用于返回右表的全部记录,左表的满足条件的记录
RIGHT[OUTER]JOIN
Select e.ename,e.sal,d.dname from dept d right join emp e on e.deptno=d.deptno;
完全(外)连接:左表和右表的全部数据 FULL[OUTER] JOIN
Select e.ename,e.sal,d.dname from dept d full join emp e on e.deptno=d.deptno;
Oracle 的set运算符
集合操作符专门用于合并多条select语句的结果,包括4种:
第一种:UNION 并集:去掉重复数据,并按第一列的结果升序排序
举例:合并显示emp01表和emp02表所有雇员的部门编号、员工号、员工姓名
创建两张表:
第一张:部门号10-20的员工信息表
create table emp01
As
Select * from emp where deptno in (10,20);
第二张:部门号20-30的员工信息表
create table emp02
As
Select * from emp where deptno in (20,30);
那么求并集就是:
Select deptno,emono,ename from emp01
Union
Select deptno,empno,ename from emp02;
//注意 在这里因为是union所以部门号为20的不会显示两遍,重复的只显示一遍
UNION ALL 并集:不去掉重复数据,并不会对结果集排序
举例:合并显示emp01表和emp02表所有雇员的部门编号、员工号、员工姓名
Select deptno,empno,ename from emp01
Union all
Select deptno,empno,ename from emp02;
//注意 在这里因为是union所以部门号为20的会显示两遍
INTERSECT交集:显示同时存在两个结果集中的数据,按第一列的结果集升序排序
举例:显示同时emp01表和emp02表的雇员的部门编号、员工号、员工姓名
Select deptno,emono,ename from emp01
INTERSECT
Select deptno,empno,ename from emp02;
//注意 在这里显示的是部门号为20的员工的而信息。
MINUS 差集:显示第一个结果集中存在,而第二个结果集中不存在的数据。按第一列结果集进行升序排序
举例:显示emp01表中有emp02表中没有的雇员的部门编号、员工号、员工姓名
Select deptno,emono,ename from emp01
MINUS
Select deptno,empno,ename from emp02;
//注意 在这里显示的是部门号为10的员工的而信息。
控制结果排序:当使用union、intersect和minus时,默认情况下会自动基于第一列进行升序排序,而当使用union all时不会进行排序,为了控制结果的排序顺序,可以使用order by子句
Select deptno,emono,ename from emp01
Union all
Select deptno,empno,ename from emp02;
Order by 1;
注意:
//order by 后面指定需要进行排序的列
//查询的两个表的列名相同时,可以用列名称
//查询两个表的列名不同时,要使用列位置(用数字表示)
//若是同SELECT *,order by 后面必须用数字