連接配接(join)
一、oracle連接配接的文法分為2類:
1、oracle專用文法(傳統文法,主要是指sql:89文法,被廣泛支援,是oracle專門支援的文法)
2、ANSI SQL:99(标準文法,oracle在8i後引入了sql99的文法,各廠商據此發展自己的sql:T-SQL,PL/SQL)
Oracle為了适應大多數人的使用,既支援了oracle專用文法,也支援了ANSI SQL:99文法,是以oracle 9i實作多表之間的連接配接既可以用oracle專用文法,也可以用ANSISQL:99文法。兩種文法沒有效率上的提高。
第一個圖介紹了oracle8i及之前的資料庫使用專用文法,8i之後支援标準文法。oracle8i及之前的資料庫實作标準文法的内連接配接都是通過等值連接配接和不等連接配接實作的,沒有标準文法直接引用natrual join、join using、join on更友善。是以自然連接配接使用很廣泛。
第二個圖介紹了sql join types,給各種類型聯接做出分類。
參見http://www.gplivna.eu/papers/sql_join_types.htm
二、Oracle連接配接的類型:
Oracle 專用文法也支援内連接配接(自然連接配接,交叉連接配接,自連接配接)和外連接配接;内連接配接通過等值連接配接、不等值連接配接和笛卡爾乘積來實作。外連接配接通過(+)=和=(+)來實作。
外連接配接中,+ 表示補充,即哪個表有加号,這個表就是比對表。是以加号寫在右表,左表就是全部顯示, 故是左連接配接; 加号寫在左表,右表就是全部顯示, 故是右連接配接。
等值連接配接:在連接配接條件中使用等于号(=)運算符比較被連接配接列的列值,其查詢結果中列出被連接配接表中的所有列,包括其中的重複列。
不等連接配接:在連接配接條件使用除等于運算符以外的其它比較運算符比較被連接配接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
自然連接配接:在連接配接條件中使用等于(=)運算符比較被連接配接列的列值,但它使用選擇清單指出查詢結果集合中所包括的列,并删除連接配接表中的重複列。
1、内連接配接(inner join):相對于外連接配接而言的。sql語句中的join預設是inner join。
inner join省略inner。
1.1自然連接配接
1.1.1專用文法
1.1.2标準文法
1.1.2.1 natual join (純自然連接配接)
1.1.2.2 join using
1.1.2.3 join on
1.2交叉連接配接(cross-join/cartesian product)
1.2.1專用文法
1.2.2标準文法
1.3自連接配接(self-join): 特殊的内連接配接
1.3.1 專用文法
備注:1、自然連接配接是一種特殊的等值連接配接,它要求兩個關系中進行比較的分量必須是相同的屬性組,并且在結果中把重複的屬性列去掉。而等值連接配接并不去掉重複的屬性列。2、這裡的等值連接配接和不等值連接配接指的是操作符兩邊都是表的列,而不是具體值或者範圍等。
2、外連接配接(outerjoin)
2.1 左外連接配接left (outer) join
2.1.1 專用文法
2.1.2 标準文法
2.2 右外連接配接right (outer) join
2.3 全外連接配接full (outer) join
2.1.1 專用文法:+不支援全外連接配接,可以通過union左右連接配接實作
三、select執行順序
FROM < left_table>
ON < join_condition>
< join_type> JOIN < right_table>
WHERE < where_condition>
GROUP BY < group_by_list>
WITH {cube | rollup}
HAVING < having_condition>
SELECT
DISTINCT
ORDER BY < order_by_list>
< top_specification> < select_list>
标準的SQL 的解析順序為:
.FROM 子句組裝來自不同資料源的資料
.WHERE 子句基于指定的條件對記錄進行篩選
.GROUP BY 子句将資料劃分為多個分組
.使用聚合函數進行計算
.使用HAVING子句篩選分組
.計算所有的表達式
.使用ORDER BY對結果集進行排序
執行順序
FROM:對FROM子句中前兩個表執行笛卡爾積生成虛拟表vt1
ON:對vt1表應用ON篩選器隻有滿足< join_condition> 為真的行才被插入vt2
OUTER(join):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重複執行步驟和步驟直接結束
WHERE:對vt3應用 WHERE 篩選器隻有使< where_condition> 為true的行才被插入vt4
GROUP BY:按GROUP BY子句中的列清單對vt4中的行分組生成vt5
CUBE|ROLLUP:把超組(supergroups)插入vt6 生成vt6
HAVING:對vt6應用HAVING篩選器隻有使< having_condition> 為true的組才插入vt7
SELECT:處理select清單産生vt8
DISTINCT:将重複的行從vt8中去除産生vt9
ORDER BY:将vt9的行按order by子句中的列清單排序生成一個遊标vc10
TOP:從vc10的開始處選擇指定數量或比例的行生成vt11 并傳回調用者
四、實作算法
1、嵌套循環(NestedLoops Join)
2、哈希連接配接(HashJoin)
3、排序合并(MergeSort Join)