1. 程式人生 > >SQL 中的左外連線和+號的用法

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用法,關聯/非關聯子查詢)、課堂練習(行列轉換)、rownumrowid

笛卡爾積 和內連線 外連線 實際上是兩張表的乘積,查詢結果沒有實際意義 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 語句操作數據庫中的數據的時候,有可能會遇到一些不太爽的問題,例如對於同一字段擁有相同名稱的記錄,我們只需要顯示一條,但實際上數據庫中可能含有多條擁有相同名稱的記錄,從