3 其他连接概念---子查询中涉及的连接
在子查询中,还有一些关键字,分别是“ANY、EXISTS、IN、SOME”,在这些关键字之前,还可以添加“NOT”,取反之意。通常的用法如:
EXISTS (subquery)
expression IN (subquery)
row_constructor IN (subquery)
expression NOT IN (subquery)
row_constructor NOT IN (subquery)
expression operator ANY (subquery)
expression operator SOME (subquery)
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)
| 连接 名称 | 说明 | 示例(源自Oracle) |
| 半连接[1] semi join | 如TBL_A 半连接TBL_B,对TBL_A中的每一条元组tuple,如果tuple能与TBL_B中的某一条元组连接上,则停止tuple与TBL_B的连接,并将tuple作为结果返回,并继续执行TBL_A的下一条元组,如果tuple与B中任何一条都连接不成功,则不返回结果。 对于“subquery”,使用IN、EXISTS等谓词表示存在即可,称之为半连接。 | SELECT * FROM departments WHERE EXISTS (SELECT * FROM employees WHERE departments.department_id = employees.department_id AND employees.salary > 2500) ORDER BY department_name; |
| 反半连接[2] anti join | 如TBL_A反半连接TBL_B,对TBL_A中的每一条元组tuple,如果tuple能与TBL_B中的某一条元组连接上,则停止tuple与TBL_B的连接,且不返回任何结果,TBL_A的下一条元组开始与TBL_B做连接;如果TBL_B中所有元组都不能与tuple连接上,则将tuple作为结果返回,执行TBL_A的下一条元组。 对于“subquery”,使用NOT IN谓词表示不存在即可,称之为反半连接。 | SELECT * FROM employees WHERE department_id NOT IN (SELECT department_id FROM departments WHERE location_id = 1700) ORDER BY last_name; |
[1] Oracle文档。半连接:A semijoin returns rows that match an EXISTS subquery without duplicating rows from the left side of the predicate when multiple rows on the right side satisfy the criteria of the subquery.
[2] Oracle文档,反半连接:An antijoin returns rows from the left side of the predicate for which there are no corresponding rows on the right side of the predicate. It returns rows that fail to match (NOT IN) the subquery on the right side.
本文介绍了SQL子查询中使用的连接概念,包括关键字ANY、EXISTS、IN、SOME及NOT的用法,同时详细解释了半连接和反半连接的概念,并通过具体的Oracle示例进行说明。

被折叠的 条评论
为什么被折叠?



