简答题 4.  什么是半连接、反连接和星型连接?
【正确答案】(1)半连接(Semi Join)  半连接(Semi Join)是一种特殊的连接类型,当作子查询展开时,Oracle经常会把那些外部WHERE条件为EXISTS、IN或=ANY的子查询转换为对应的半连接。半连接分为嵌套循环半连接(Hint为:NL_SJ)、排序合并半连接(Hint为:MERGE_SJ)和哈希半连接(Hint为:HASH_SJ),不过在新版本数据库里,都倾向于使用哈希半连接。不过哈希半连接也有一些限制条件,例如,只能使用等值连接、不能使用GROUP BY、CONNECT BY、ROWNUM等限制条件。在执行计划中若有关键字“HASH JOIN SEMI”,则说明Oracle使用了哈希半连接。
   (2)反连接(Anti Join)  反连接(Anti Join)也是一种特殊的连接类型,通常用于从一个表中返回不在另一个数据源中的数据行。当作子查询展开时,Oracle经常会把那些外部WHERE条件为NOTEXISTS、NOT IN或<>ALL的子查询转换成对应的反连接。反连接分为嵌套循环反连接(NESTED LOOPS ANTI,Hint为:NL_AJ)、排序合并反连接(MERGE JOIN ANTI,Hint为:MERGE_AJ)和哈希反连接(HASH JOINANTI,Hint为:HASH_AJ)。
   需要注意的是,NOT IN和<>ALL对NULL值敏感,这意味着NOT IN后面的子查询或者常量集合一旦有NULL值出现,则整个SQL的执行结果就会为NULL,即此时的执行结果将不包含任何记录。但是,NOT EXISTS对NULL值不敏感,这意味着NULL值对NOT EXISTS的执行结果不会有什么影响。正是因为NOT IN和<>ALL对NULL值敏感,所以一旦相关的连接列上出现了NULL值,此时Oracle如果还按照通常的反连接的处理逻辑来处理,得到的结果就不对了。为了解决NOTIN和<>ALL对NULL值敏感的问题,Oracle推出了改良的反连接,这种反连接能够处理NULL值,Oracle称其为Null-Aware Anti Join,如下例:
   
【答案解析】