半連接&反連接
1. 半連接
半連接返回左表中與右表至少匹配一次的數據行,通常體現為 EXISTS 或者 IN 子查詢。左表驅動右表。只返回左表的數據,右表作為篩選條件。
可以用 EXISTS、 IN 或者 =ANY
舉例:表t1和表t2做半連接,t1是驅動表,t2是被驅動表,半連接條件為t1.x=t2.y。
這里"t1.x semi= t2.y"的含義是只要在表t2中找到一條記錄滿足t1.x=t2.y,則馬上停止搜索表t2,并直接返回表T1中滿足條件t1.x=t2.y的記錄。表t2中滿足半連接條件t1.x=t2.y的記錄即使有多條,表t1中也只會返回第一條滿足條件的記錄。
所以半連接和普通的內連接不同,半連接實際上會去重。
2. 反連接
反連接返回左表中與右表不匹配的數據行,通常體現為 NOT EXISTS 或者 NOT IN 子查詢。反連接的邏輯與半連接正好相反
可以用NOT EXISTS、NOT IN 或者 !=ALL 操作符
反連接只返回左表的數據,右表負責條件判斷
半連接、反連接等價于首先通過左外連接獲取所有滿足條件的數據,然后使用 WHERE 條件找出右表中存在/不存在的數據,最后執行 DISTINCT 操作去除重復值;效率低,不過大多數數據庫可以實現這兩者的等價轉換。
參考鏈接:
https://blog.csdn.net/horses/article/details/108152329