半聯結 和 反聯結是 oracle 優化器能夠選擇用來在獲取資訊時應用的兩個密切相關的聯結方法(實際上是聯結方法的選項)
半聯結in 的半聯結
select /* using in */ department_name
from hr.departments dept
where department_id in (select department_id from hr.employees emp);
exists 半聯結
select /* using exists */ department_name
from hr.departments dept
where exists(select null from hr.employees emp where emp.department_id = dept.department_id);
exists 和 in 的可替換語法
select /* inner join */ department_name
from hr.departments dept, hr.employees emp
where dept.department_id = emp.department_id;
控制半聯結執行計畫
半聯結 實際上就是雙層for迴圈, 注意下邊的: nested loops semi (半聯結的標誌)
使用提示控制半聯結執行計畫
semijoin - 進行半聯結
no_semijoin - 不進行半聯結
例如:select /* exists no_semijoin */ department_name
from hr.departments dept
where exists (select /*+ no_semijoin */) null from hr.employees emp where emp.department_id = dept.department_id);
因為我們提供了 no_semijion 的提示, 所以, 執行計畫中就沒有在使用半聯結, 而是使用了 filter(exists (select o from ))
反聯結
總結: 實際上, 以上的聯結, 我都有在前面的 table join 型別時 有單獨拿出來講過, 所以, 這裡不在詳細說明.
總結的結果就是, 由於我們使用的優化器一般都是基於成本的, 所以, 只使用 exists 和 外連線 兩種.
內聯結 外聯結 左聯結 右聯結
1 內聯結 將兩個表中存在聯結關係的字段符合聯結關係的那些記錄形成記錄集的聯結。2 外聯結 分為外左聯結和外右聯結。左聯結a b表的意思 就是將表a中的全部記錄和表b中聯結的字段與表a的聯結字段符合聯結條件的那些記錄形成的記錄集的聯結,這裡注意的是最後出來的記錄集會包括表a的全部記錄。右聯結a b表...
MySQL的內部聯結,外部聯結和自然聯結
一 select語句 乙個典型的sql查詢語句具有如下形式 select a1,a2,an from r1,r2,rm where p select子句列出查詢結果中所需要的屬性。from子句是乙個查詢求值中需要訪問的關係列表。where子句是乙個作用在from子句關係屬性上的謂詞。其中from這個...
mysql 聯結主鍵 MySQL基礎 聯結
聯結表 mysql是一種關聯式資料庫,所謂關係就是指把資料分解為多個表,乙個類據一 個表。各表之間通過某些常用的值 即關係 相關聯 就比如說有乙個表儲存了 商資訊,商id為主鍵。另乙個表儲存了一些商品的資訊,但是也需要知道商品相應的 商資訊。那麼可以給商品設定乙個 商id 稱為外來鍵,通過這個外來鍵...