Oracle中的连接可分为,内连接(INNER JOIN)、外连接(OUTER JOIN)、全连接(FULL JOIN),不光是 Oracle,其他很多的数据库也都有这3种连接查询方式。
Oracle 外连接(OUTER JOIN),又分为左外连接和右外连接,即左连接和右连接。
左外连接 LEFT OUTER JOIN == 左连接 LEFT JOIN(左边的表不加限制)
右外连接 RIGHT OUTER JOIN == 右连接 RIGHT JOIN(右边的表不加限制)
全外连接 FULL OUTER JOIN == 全连接 FULL JOIN(左右两表都不加限制)
注意:通常写 SQL 的时候会省略 OUTER 关键字。
在左连接和右连接时都会以一张 A 表为基础表,该表的内容会全部显示,然后加上 A 表和 B 表匹配的内容。 如果 A 表的数据在 B 表中没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接,也可以使用 "(+)" 操作符来表示。使用时的一些注意事项:
1. 操作符只能出现在 WHERE 子句中,并且不能与 OUTER JOIN 语法同时使用;
2. 操作符执行外连接时,如果在 WHERE 子句中包含有多个条件,则必须在所有条件中都包含 (+) 操作符;
3. 操作符只适用于列,而不能用在表达式上;
4. 操作符不能与 OR 和 IN 操作符一起使用;
5. 操作符只能用于实现左外连接和右外连接,而不能用于实现全外连接;
SELECT * FROM t_A;
SELECT * FROM t_B;
左外连接,又名左连接(OUTER LEFT JOIN / LEFT JOIN)
LEFT JOIN 是以左表的记录为基础的,t_A 可以看成左表,t_B 可以看成右表,它的结果集是 t_A 表中的全部数据,再加上 t_A 表和 t_B 表匹配后的数据。换句话说,左表 t_A 的记录将会全部表示出来,
而右表 t_B 只会显示符合搜索条件的记录。t_B 表记录不足的地方均为 NULL。
SELECT * FROM t_A a LEFT JOIN t_B b ON a.id = b.id;
或 SELECT * FROM t_A a LEFT OUTER JOIN t_B b ON a.id = b.id;
用 (+) 来实现,这个 + 号可以这样来理解:+ 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在右表,左表就是全部显示,所以是左连接。
SELECT * FROM t_A a,t_B b WHERE a.id=b.id(+);
右外连接,又名右连接(RIGHT OUTER JOIN / RIGHT JOIN)
和 LEFT JOIN 的结果刚好相反,是以右表 t_B 为基础的。它的结果集是 t_B 表所有记录,再加上 t_A 和 t_B 匹配后的数据。 t_A 表记录不足的地方均为 NULL。
SELECT * FROM t_A a RIGHT JOIN t_B b ON a.id = b.id;
或 SELECT * FROM t_A a RIGHT OUTER JOIN t_B b ON a.id = b.id;
用 (+) 来实现,这个 + 号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显示,所以是右连接。
SELECT * FROM t_A a,t_B b WHERE a.id(+)=b.id;
全外连接,又名全连接(FULL OUTER JOIN / FULL JOIN)
左表和右表都不做限制,所有的记录都显示,两表不足的地方均为 NULL。 全外连接不支持 (+) 写法。
以 id 为限制的用法:
SELECT * FROM t_A a FULL JOIN t_B b ON a.id = b.id;
或 SELECT * FROM t_A a FULL OUTER JOIN t_B b ON a.id = b.id;
不加限制的用法:
SELECT * FROM t_A FULL JOIN t_B ON 1=1;
内连接,又名自连接(INNER JOIN / JOIN)
查出的记录既存在于 t_A,又存在于 t_B,即查出匹配两张表的数据。
SELECT * FROM t_A a,t_B b WHERE a.id = b.id;
或 SELECT * FROM t_B b,t_A a WHERE b.id = a.id;
或 SELECT * FROM t_A a JOIN t_B b ON a.id = b.id;
或 SELECT * FROM t_A a INNER JOIN t_B b ON a.id = b.id;
或 SELECT * FROM t_B b JOIN t_A b ON b.id = a.id;
或 SELECT * FROM t_B b INNER JOIN t_A a ON b.id = a.id;
笛卡尔乘积,又名笛卡尔积(CROSS JOIN)
不加任何条件,达到 M*N 的结果集
SELECT * FROM t_A a CROSS JOIN t_B b;
或 SELECT * FROM t_A a,t_B b;
注意:如果 CROSS JOIN 加上 WHERE ON a.id = b.id 条件,会产生跟内连接(自连接)一样的结果(CROSS JOIN 后 加上 ON 会报错);
即 SELECT * FROM t_A a CROSS JOIN t_B b WHERE a.id = b.id;(不需要 ON) 相当于 SELECT * FROM t_A a JOIN t_B b ON a.id = b.id;