SQL 中的左外連線和+號的用法
Oracle 外連線
(1)左外連線 (左邊的表不加限制)
(2)右外連線(右邊的表不加限制)
(3)全外連線(左右兩表都不加限制)
外連線(Outer Join)
outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。外連線分為三種: 左外連線,右外連線,全外連線。 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我們省略outer 這個關鍵字。 寫成:LEFT/RIGHT/FULL JOIN。
在左外連線和右外連線時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的資料在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(NULL)。
對於外連線, 也可以使用“(+) ”來表示。 關於使用(+)的一些注意事項:
1.(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
2. 當使用(+)操作符執行外連線時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符
3.(+)操作符只適用於列,而不能用在表示式上。
4.(+)操作符不能與or和in操作符一起使用。
5.(+)操作符只能用於實現左外連線和右外連線,而不能用於實現完全外連線。
在做實驗之前,我們先將dave表和bl里加一些不同的資料。 以方便測試。
SQL> select * from bl;
ID NAME
---------- ----------
1 dave
2 bl
3 big bird
4 exc
9 懷寧
SQL> select * from dave;
ID NAME
---------- ----------
8 安慶
1 dave
2 bl
1 bl
2 dave
3 dba
4 sf-express
5 dmm
2.1 左外連線(Left outer join/ left join)
left join是以左表的記錄為基礎的,示例中Dave可以看成左表,BL可以看成右表,它的結果集是Dave表中的資料,在加上Dave表和BL表匹配的資料。換句話說,左表(Dave)的記錄將會全部表示出來,而右表(BL)只會顯示符合搜尋條件的記錄。BL表記錄不足的地方均為NULL.
示例:
SQL> select * from dave a left join bl b on a.id = b.id;
ID NAME ID NAME
--------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm -- 此處B表為null,因為沒有匹配到
8 安慶 -- 此處B表為null,因為沒有匹配到
SQL> select * from dave a left outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在右表,左表就是全部顯示,故是左連線。
SQL> Select * from dave a,bl b where a.id=b.id(+); -- 注意: 用(+) 就要用關鍵字where
ID NAME ID NAME
---------- ---------- ---------- ----------
1 bl 1 dave
1 dave 1 dave
2 dave 2 bl
2 bl 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
8 安慶
2.2 右外連線(right outer join/ right join)
和left join的結果剛好相反,是以右表(BL)為基礎的, 顯示BL表的所以記錄,在加上Dave和BL 匹配的結果。 Dave表不足的地方用NULL填充.
示例:
SQL> select * from dave a right join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
SQL> select * from dave a right outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧 --此處左表不足用Null 填充
已選擇7行。
用(+)來實現, 這個+號可以這樣來理解: + 表示補充,即哪個表有加號,這個表就是匹配表。所以加號寫在左表,右表就是全部顯示,故是右連線。
SQL> Select * from dave a,bl b where a.id(+)=b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
9 懷寧
2.3 全外連線(full outer join/ full join)
左表和右表都不做限制,所有的記錄都顯示,兩表不足的地方用null 填充。 全外連線不支援(+)這種寫法。
示例:
SQL> select * from dave a full join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
9 懷寧
已選擇9行。
SQL> select * from dave a full outer join bl b on a.id = b.id;
ID NAME ID NAME
---------- ---------- ---------- ----------
8 安慶
1 dave 1 dave
2 bl 2 bl
1 bl 1 dave
2 dave 2 bl
3 dba 3 big bird
4 sf-express 4 exc
5 dmm
最初由 ghc_x 釋出
[B]有兩個表T1和T2,兩個表除了主鍵索引外均無其他索引,這兩個表由T1.F1(主鍵),T2.F2(主鍵)進行左連線,SQL語句有兩種寫法:
1. SELECT * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
當檢視1的執行計劃時發現T1為全表掃描,T2為索引掃描。
當檢視2的執行計劃時發現兩個表均為全表掃描。
有人知道這是為什麼嗎? [/B]
我一直以來也是認為這兩種寫法是一樣的,沒想到樓主特意去看了它們的執行計劃,而且發現了它們的不同,這使得我比較驚訝。
按照書上的講法,這兩種寫法是沒有什麼區別的,後一種寫法只不過是前一種寫法的新版本。
為什麼兩者的執行計劃會不一樣呢?
我仔細看了一下兩者的執行計劃,發現了為什麼後一種要兩個表都全表 掃描,而前一個表有一個索引掃描。
原來前者選擇的優化器是RULE,而後者選擇的優化器是CBO的ALL ROWS。
不過,似乎要後者的效率高。
1. SELECT /*+RULE*/ * FROM T1,T2 WHERE T1.F1=T2.F2(+)
2. SELECT /*+RULE*/ * FROM T1 LEFT JOIN T2 ON T1.F1=T2.F2
這樣再看下執行計劃吧
相關推薦
SQL 中的左外連線和+號的用法
Oracle 外連線 (1)左外連線 (左邊的表不加限制) (2)右外連線(右邊的表不加限制) (3)全外連線(左右兩表都不加限制) 外連線(Outer Join) outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯接的行。它還返
oracle左外連線、右外連線、完全外連線以及(+)號用法
準備工作 oracle連線分為: 左外連線:左表不加限制,保留左表的資料,匹配右表,右表沒有匹配到的行中的列顯示為null。右外連線:右表不加限制,保留右表的資料。匹配左表,左表沒有匹配到的行中列顯
sql左外連線和右外連線的區別
兩個表:A(id,name)資料:(1,張三)(2,李四)(3,王五)B(id,name)資料:(1,學生)(2,老師)(4,校長)左連線結果:select A.*,B.* from A left join B on A.id=B.id;1 張三 1 學生2 李四 2 老師
mySql內連線,左外連線和右外連線,
1.使用連線查詢的場景 將多張表進行記錄的連線查詢(按照某個欄位指定的條件進行資料的拼接); 進行資料的拼接(兩張表的內容顯示在一個結果表中 使用連線查詢) 最終的結果是:記錄數有可能變化,欄位數一定會增加(至少兩張表的合併) 意義:在使用者檢視資料的時候,顯示的資料
(轉貼)SQL 左外連線,右外連線,全連線,內連線
http://www.blogjava.net/zolly/archive/2007/10/23/SQLJION.html 聯接條件可在 FROM 或 WHERE 子句中指定,建議在 FROM 子句中指定聯接條件。WHERE 和 HAVING 子句也可以包含搜尋條件,以進一步篩
徹底搞懂Oracle的左外連線和右外連線(以資料說話)
Employees表: Department表: select e.last_name,e.department_id,d.department_name from employees e left outer join departments d
內連線、外連線和全連線的區別
舉例說明 假設您有兩個表,每個表只有一個列,表資料如下 A B - - 1 3 2 4 3 5 4 6 注意,(1,2)是A表唯一的,(3,4)是公共的,並且(5,6)是B表獨有的 內連線 內連線是A表的所有行交上B
mysql 資料庫查詢語句 左外連線 右外連線 和內連線區別
左外連結查詢:A left join B on conidtion where condition 用A表 的全部資料去匹配 B表 B表無匹配資料時用null代替 左聯左不丟資料 右外連線查詢:A ri
關於SQL語句外連線中的過濾條件
使用左外連線時,注意以下兩點 第一張表的過濾條件寫在where子句中其餘各張表的過濾條件寫在on子句中假設有以下兩張表 A表 id active 1 1 2 1 3 1 4 0 B表 id aid active 11 1 1 12 1 0 22 2 1 23 2 1 這
SQL 左外連線,右外連線,全連線,內連線
連線條件可在FROM或WHERE子句中指定,建議在FROM子句中指定連線條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選連線條件所選的行。 連線可分為以下幾類: 內連線。(典型的連線運算,使用像 = 或 <> 之類的比較
利用native SQL實現外連線查詢
String sql ="select s.serviceid as serviceid ,s.servicename,count(o.id) as amount from service as s left join orderrelation as o on (s.se
Hibernate中的迫切左外連線和左外連線
前邊我們講過了Hibernate的檢索方式及它的四個細節,常見的五中檢索方式是物件導航圖語言(customers.getOrders())、通過OID獲取物件(session.get(Department.class,1))、HQL查詢語句、QBC、本地SQL。我們詳細
自連線、外連線和自連線查詢
表1:teacher +----+--------+ | id | name | +----+--------+ | 1 | 劉德華 | | 2 | 張學友 | | 4 | 黎明 | +----+--------+ 表2:student +----+-----
SQL 左外連線,右外連線,全連線,內連線 4種連線的區別
?連線條件可在FROM或WHERE子句中指定,建議在FROM子句中指定連線條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選連線條件所選的行。 連線可分為以下幾類: 內連線。(典型的連線運算,使用像 = 或 <> 之類的比較運算子)。包括相等連線和自然連線。 內連線使用比較運算
SQL 內連線和外連線區別
資料庫的資料: 資料分級: 100 定義的是鎖,110 定義的是門鎖,111定義的是門鎖的種類例如光交門鎖。 那麼 門鎖的種類就是110~190 9 種,具體細分,鎖的種類就是總共:9*9=81種。夠用了。 這種型別的表,適合做自連線。 左外連結:連線2次。左側的資
10、Oracle:左連線、右連線、全外連線以及(+)號用法
回到目錄 1、準備工作 Oracle 外連線(OUTER JOIN)包括以下: 左外連線(左邊的表不加限制)右外連線(右邊的表不加限制)全外連線(左右兩表都不加限制) 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER關鍵字,
sql多表操作-內連線inner join、外連線left/right (out) join和交叉連線
1 內連線、外連線和交叉連線的區別 內連線:匹配2個表中的相同欄位,沒有的不加入結果集。 外連線:匹配2個表中共有的欄位。分為3種: 左連線——以左邊的為基準,右表中沒有的(相同欄位值)為null; 右連線——以右邊的為基準,左表中沒有的為null;
內連線、外連線、子查詢(exists用法,關聯/非關聯子查詢)、課堂練習(行列轉換)、rownum和rowid
笛卡爾積 和內連線 外連線 實際上是兩張表的乘積,查詢結果沒有實際意義 select * from emp,dept; 內連線-等值內連線(隱式) select * from emp,dept where emp.deptno = dept.deptno
Oracle左連線、右連線、全外連線以及(+)號用法
回到目錄 1、準備工作 Oracle 外連線(OUTER JOIN)包括以下: 左外連線(左邊的表不加限制)右外連線(右邊的表不加限制)全外連線(左右兩表都不加限制) 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER關鍵字, 寫成:LEFT/RIGHT/FULL
述 SQL 中的 distinct 和 row_number() over() 的區別及用法
表示 第一個 字段值 格式 這樣的 操作數 col 例如 from 1 前言 在咱們編寫 SQL 語句操作數據庫中的數據的時候,有可能會遇到一些不太爽的問題,例如對於同一字段擁有相同名稱的記錄,我們只需要顯示一條,但實際上數據庫中可能含有多條擁有相同名稱的記錄,從