CROSS JOIN(交叉连接)
CROSS JOIN在不使用显式连接子句的两个表之间执行连接,并产生两个表的笛卡尔积。 笛卡尔积表示一个表的每一行与连接中的第二个表的每一行组合。 例如,如果TABLEA有20行,TABLEB有20行,结果将是20 * 20 = 400个输出行。
例:
|
|
也可以写成:
|
|
下面是两个表之间的SQL中的cross join的示例:
Sample Table: TABLEA
|
|
现在,如果执行查询:
|
|
输出:
|
|
LEFT OUTER JOIN(左外连接)
LEFT OUTER JOIN在需要显式连接子句的两个表之间执行连接,但不会从第一个表中排除不匹配的行。
例:
|
|
即使ANSI语法是推荐的方法,它很可能会经常遇到传统语法。 在条件内使用(+)确定等式的哪一侧被认为是外侧。
|
|
下面是两个表之间的Left Outer Join的示例:
Sample Table: EMPLOYEE
|
|
Sample Table: DEPT
|
|
现在,如果执行查询:
|
|
输出:
|
|
ANTIJOIN(反连接)
antijoin从谓词的左侧返回行,在谓词的右侧没有对应的行。 它返回不匹配(NOT IN)右侧子查询的行。
|
|
下面是两个表之间的反连接示例:
Sample Table: EMPLOYEE
|
|
Sample Table: DEPT
|
|
现在,如果执行查询:
|
|
输出:
|
|
RIGHT OUTER JOIN(右外部接合)
RIGHT OUTER JOIN在需要显式连接子句的两个表之间执行联接,但不会从第二个表中排除不匹配的行。
例:
|
|
由于包括SCOTT.DEPT的不匹配行,但不包括SCOTT.EMP的不匹配行,上述等价于使用LEFT OUTER JOIN的以下语句。
|
|
下面是两个表之间的Right Outer Join的示例:
Sample Table: EMPLOYEE
|
|
Sample Table: DEPT
|
|
现在,如果执行查询:
|
|
输出:
|
|
FULL OUTER JOIN(完全外部联接)
FULL OUTER JOIN在需要显式连接子句的两个表之间执行连接,但不排除任一表中的不匹配行。 换句话说,它返回每个表中的所有行。
例:
|
|
下面是两个表之间的完全外部联接的示例:
Sample Table: EMPLOYEE
|
|
Sample Table: DEPT
|
|
现在,如果执行查询:
|
|
输出:
|
|
这里,不匹配的列保持为NULL。
INNER JOIN(内部联接)
INNER JOIN是一个JOIN操作,允许你指定显式连接子句。
句法:
TableExpression [ INNER ] JOIN TableExpression { ON booleanExpression | USING clause }
可以通过使用布尔表达式指定ON来指定连接子句。
ON子句中的表达式的范围包括当前表和外部查询块中到当前SELECT的任何表。 在以下示例中,ON子句引用当前表:
|
|
JOIN
JOIN操作在两个表之间执行联接,排除第一个表中的任何不匹配的行。 从Oracle 9i向前,JOIN在功能上等同于INNER JOIN。 此操作需要一个显式连接子句,而不是CROSS JOIN和NATURAL JOIN运算符。
例:
|
|
Oracle文档:
NATURAL JOIN(自然加入)
NATURAL JOIN不需要显式连接条件; 它将基于连接表中具有相同名称的所有字段构建一个。
|
|
连接将在两个表共用的字段ID和DESCR上完成:
|
|
具有不同名称的列将不会在JOIN条件中使用:
|
|
如果连接的表没有公共列,则将执行没有条件的JOIN:
|
|
SEMI JOIN(半连接)
例如,可以使用semijoin 查询查找具有至少一个员工的工资超过2500的所有部门。
|
|
这比完整的联接替代方案更有效率,因为内部加入员工,然后给出一个where子句,详细说明工资必须大于2500可以多次返回相同的部门。 说如果消防部门有n个员工都有工资3000,select * from departments,employees有必要加入的员工在id和我们的where子句将返回消防部门n次。
