数据库查询中的表连接(二)

本文介绍了SQL子查询中使用的连接概念,包括关键字ANY、EXISTS、IN、SOME及NOT的用法,同时详细解释了半连接和反半连接的概念,并通过具体的Oracle示例进行说明。

3          其他连接概念---子查询中涉及的连接

在子查询中,还有一些关键字,分别是“ANYEXISTSINSOME”,在这些关键字之前,还可以添加“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中的某一条元组连接上,则停止tupleTBL_B的连接,并将tuple作为结果返回,并继续执行TBL_A的下一条元组,如果tupleB中任何一条都连接不成功,则不返回结果。

对于“subquery”,使用INEXISTS等谓词表示存在即可,称之为半连接。

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中的某一条元组连接上,则停止tupleTBL_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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值