1 简述
1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的。用来连接两张表的表达式组成了连接条件。当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合结果集
2) 有5种基本类型的的连接,内连接,外连接,自然连接,交叉连接,自连接。下面分别说下撒。
2 内连接(Inner Join / Join)
Inner join逻辑运算符返回满足第一个(顶端)输入与第二个(底端)输入联接的每一行。这个和用select查询多表是一样的效果,所以内连接用的很少。还有一点要说明的就是Join 默认就是inner join。 所以我们在写内连接的时候可以省略inner 这个关键字。注:等同于最常见的等值连接
下面举例说明一下内连接:
Ø 标准写法: inner join
SELECT
* FROM
EMP INNER
JOIN
DEPT ON
EMP.DEPTNO = DEPT.DEPTNO
Ø 这里省略了inner关键字
SELECT
* FROM
EMP JOIN
DEPT ON
EMP.DEPTNO = DEPT.DEPTNO
Ø select 多表查询
SELECT
* FROM
EMP,DEPT WHERE
EMP.DEPTNO = DEPT.DEPTNO
执行结果如下:
从这三个SQL 的结果我们也可以看出,他们的作用是一样的。
3 外连接(Out Join)
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种: 左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。
在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。 2.(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符 3.(+)操作符只适用于列,而不能用在表达式上。 4.(+)操作符不能与or和in操作符一起使用。 5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。3.1 左外连接(Left outer join / left join)
左外连接就是在等值连接的基础上加上主表中的未匹配数据,left join是以左表的记录为基础的,示例中EMP可以看成左表,DEPT可以看成右表,它的结果集是EMP表中的数据,在加上EMP表和DEPT表匹配的数据。换句话说,左表(EMP)的记录将会全部表示出来,而右表(DEPT)只会显示符合搜索条件的记录。DEPT表记录不足的地方均为NULL.
SELECT * FROM emp LEFT JOIN dept ON EMP.DEPTNO = DEPT.DEPTNO
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。注意: 用(+) 就要用关键字where
SELECT
* FROM
EMP,DEPT WHERE
EMP.DEPTNO = DEPT.DEPTNO(+)
3.3 右外连接(right outer join / right join)
右外连接是在等值连接的基础上加上被连接表的不匹配数据和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。 Dave表不足的地方用NULL填充.
SELECT
* FROM
emp RIGHT
JOIN
dept ON
EMP.DEPTNO = DEPT.DEPTNO
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。
SELECT * FROM EMP,DEPT WHERE EMP.DEPTNO(+) = DEPT.DEPTNO
3.4 全外连接(full outer join / full join)
左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。
SELECT
* FROM
EMP FULL
JOIN
DEPT ON
EMP.DEPTNO = DEPT.DEPTNO
4.自然连接
自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。即 自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。
SELECT * FROM EMP NATURAL JOIN DEPT
注:不能加限定条件,否则会报错
SQL 错误: ORA-25155: NATURAL 联接中使用的列不能有限定词25155. 00000 - "column used in NATURAL join cannot have qualifier"*Cause: Columns that are used for a named-join (either a NATURAL join or a join with a USING clause) cannot have an explicit qualifier.*Action: Remove the qualifier.
5.交叉连接
交叉连接不带ON子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到 结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查 询条件的数据行数。
SELECT
* FROM
emp CROSS
JOIN
dept;
等价于
SELECT
* FROM
emp,dept;
6.自连接
连接的表是同一张表,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据。
在oracle的scott的schema中有一个表是emp。在emp中的每一个员工都有自己的mgr(经理),并且每一个经理自身也是公司的员工,自身也有自己的经理。
但现在我们只有一张emp表。所以我们可以采用自连接。自连接的本意就是将一张表看成多张表来做连接。我们可以这样来写SQL语句:
select work.ename worker,mgr.ename from scott.emp work, scott.emp mgr where work.mgr = mgr.empno order by work.ename;
各种连接的一个图示: