一般所說的左連接,外連接是指左外連接,右外連接。做個簡單的測試你看吧。
先說左外連接和右外連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1;
ID NAME
---------- --------------------
1 aaa
2 bbb
[TEST1@orcl#16-12月-11] SQL>select * from t2;
ID AGE
---------- ----------
1 20
3 30
左外連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 left join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
2 bbb
右外連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 right join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
3 30
從上面的顯示你可以看出:左外連接是以左邊的表為基準。通俗的講,先將左邊的表全部顯示出來,然後右邊的表id與左邊表id相同的記錄就「拼接」上去,比如說id為1的記錄。如果沒有匹配的id,比如說t1中id為2的t2中就沒有。那邊就以null顯示。
右外連接過程正好相反。
再看內連接:
[TEST1@orcl#16-12月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
看到沒有? 只有一條記錄。內連接就是只取出符合過濾條件的記錄 也就是t1.id=t2.id 那麼符合t1.id=t2.id的記錄只有id=1這一條,所以只顯示一條。 不像外連接,是將你作為基準的表(左外連接就是左邊表為基準,右外連接就是右邊表為基準)的所有行都顯示出來。
綜上所述,你應該能明白了吧?如果不明白請留言。
⑵ 資料庫操作中,左連接,右連接是什麼意思,舉例說明
SQL JOIN 子句用於把來自兩個或多個表的行結合起來,基於這些表之間的共同欄位。
LEFT JOIN(左連接)返回包括左表中的所有記錄和右表中聯結欄位相等的記錄。
即使右表中沒有匹配,也從左表返回所有的行。
RIGHT JOIN(右連接)返回包括右表中的所有記錄和左表中聯結欄位相等的記錄。
即使左表中沒有匹配,也從右表返回所有的行。
示例表:表1和表2
注釋:表2中所有記錄被返回。
(2)sql左連接介紹擴展閱讀:
sql語句中left join的效率問題
sql語句中包含數據處理函數(nvl,case when函數);inner joinleft join等關聯;排序和分頁。
1、首先把排序去掉,速度確實很快,但排序是必須的,這樣做只是為了證明排序是很耗資源。2、將nvl,case when等函數去掉,結果速度幾乎沒有任何改變。
3、將inner join的表去除,速度稍微快了幾十毫秒。
4、將left join的表去掉,速度從原來的4秒提高到1秒內。
綜合所得,left join才是速度慢的元兇,於是將left join關聯關系欄位都加為索引,發現速度基本能保持在1秒左右。
結論:left join是相當耗資源的操作,如果關聯的欄位沒有索引的話,速度是很慢的,所以如果有left join的話,最好用索引欄位取關聯,或者給關聯的欄位加索引。
網路.Left join
網路.Right join
⑶ SQL中的左外連接和+號的用法
SQL中的左外連接和+號的用法
Oracle 左連接、右連接、全外連接、(+)號作用
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中左連接是什麼意思啊,有什麼作用啊能否給個例子,謝謝大家
左連接:Left Join 或 Left Outer Join
--Student表
--
1張三25
2李四26
3無名氏27
--BorrowBook表
--
1馬克思主義政治經濟學電子工業出版社
2***思想概論高等教育出版社
--SQL語句
Select
Student.StudentName,
Student.StudentAge,
BorrowBook.BorrowBookName,
BorrowBook.BorrowBookPublish
FromStudent
LeftJOINBorrowBook
OnStudent.StudentID=BorrowBook.StudentID
--運行的結果如下:
---------------------------------------------------------------------------------
--張三25馬克思主義政治經濟學電子工業出版社
--李四26***思想概論高等教育出版社
--無名氏27NULLNULL
查詢的結果是以左表Student為主,Student對應的StudentID在右表BorrowBook如果不存在的話,就會用NULL值來代替。
⑸ sql中的左聯接和右鏈接有什麼區別
左連接是以左邊的數據為依據,如果右邊的表中沒有的數據就用null顯示,右連接則相反。
⑹ sql左外連接和右外連接的區別
一、數據集合不同
1、左外連接:是A和B的交集再並上A的所有數據。
2、右外連接:是A和B的交集再並上B的所有數據。
二、語法不同
1、左外連接:SELECT *FROM aLEFT OUTER JOIN bON a.`ageId` = b.`id`。
2、右外連接:SELECT *FROM aright OUTER JOIN bON a.`ageId` = b.`id`。
三、運算方式不同
1、左外連接:其運算方式為:A左連接B的記錄=圖3公共部分記錄集C+表A記錄集A1。
2、右外連接:其運算方式為:A右連接B的記錄=圖3公共部分記錄集C+表B記錄集B1 。
⑺ SQL中的左連接與右連接有什麼區別,點解返回值會不同
1、意思不一樣
左連接:只要左邊表中有記錄,數據就能檢索出來,而右邊有的記錄必要在左邊表中有的記錄才能被檢索出來。
右連接:右連接是只要右邊表中有記錄,數據就能檢索出來。
2、用法不一樣
右連接與左連接相反,左連接A LEFT JOIN B,連接查詢的數據,在A中必須有,在B中可以有可以沒有。內連接A INNER JOIN B ,在A中也有,在B中也有的數據才能查詢出來。
3、空值不一樣
左連接是已左邊表中的數據為基準,若左表有數據右表沒有數據,則顯示左表中的數據右表中的數據顯示為空。
右聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。