1. 資料庫多個left join如何執行
煮個栗子吧:有表a,b,c,sql語句做左連接---
A left join B left join C
這樣多連接的順序是,先A和B進行左連接生成一個結果集AB(當然你看不到,要在腦子里想像),再用AB結果集和C再做左連接,形成最終的連接結果集
2. sql左連接、右連接、全連接、內連接有啥區別
左(外)連接(LEFT JOIN),以左表為基準,查詢出左表所有的數據和右表中連接欄位相等的記錄,如果右表中沒有對應數據,則在左表記錄後顯示為空(NULL).如果把兩個表分別看成一個集合的話,則顯示的結果為JOIN左邊的集合。
右(外)連接(RIGHT JOIN )是以右表為基準,查詢出右表所有的數據和左表中連接欄位相等的記錄,如果左表沒有對應數據則在右表對應數據行顯示為空(NULL).如果把兩個表分別看成一個集合的話,則顯示的結果為JOIN右邊的集合。
內連接(INNER JOIN )是查詢出兩個表對應的數據,如果把兩個表分別看成一個集合的話,內連接的結果即為兩個表的交集。
全連接(FULL JOIN )將兩個表的數據全部查出來,返回左右表中所有的記錄和左右表中連接欄位相等的記錄,如果把兩個表分別看成一個集合的話,全外連接的結果即為兩個表的並集。
3. SQL中的左連接與右連接有什麼區別,點解返回值會不同
1、意思不一樣
左連接:只要左邊表中有記錄,數據就能檢索出來,而右邊有的記錄必要在左邊表中有的記錄才能被檢索出來。
右連接:右連接是只要右邊表中有記錄,數據就能檢索出來。
2、空值不一樣
左連接是已左邊表中的數據為基準,若左表有數據右表沒有數據,則顯示左表中的數據右表中的數據顯示為空。
右聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
左連接實例
在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。如果基表的數據在另一張表沒有記錄。那麼在相關聯的結果集行中列顯示為空值(NULL)。
對於外連接, 也可以使用「(+) 」來表示。 關於使用(+)的一些注意事項:
1、(+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
2、當使用(+)操作符執行外連接時,如果在where子句中包含有多個條件,則必須在所有條件中都包含(+)操作符。
以上內容參考:網路-外連接
4. sql 多表查詢 內連接左連接右連接
2)左連接
select a. ,b. from a left join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
3 王武 null null null
3) 右連接
select a. ,b. from a right join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
null null 3 34 4
5. SQL中3個表的左連接
select
a.姓名,a.學號,b.成績,c.班級名稱
from
a,b,c
where
a.學號=b.學號
and
a.班級編號=c.班級編號
為什麼非要左連接呢?如果真想左連接的話
select
d.姓名,d.學號,d.成績,c.班級名稱
from
(select
a.姓名
姓名,a.學號
學號,b.成績
成績,a.班級編號
班級編號
from
a,b
where
a.學號=b.學號)
d
left
join
c
on
c.班級編號=d.班級編號
6. SQL中3個表的左連接
select a.姓名,a.學號,b.成績,c.班級名稱
from a,b,c where a.學號=b.學號
and a.班級編號=c.班級編號
為什麼非要左連接呢?如果真想左連接的話
select d.姓名,d.學號,d.成績,c.班級名稱 from
(select a.姓名 姓名,a.學號 學號,b.成績 成績,a.班級編號 班級編號 from a,b where a.學號=b.學號) d
left join
c
on c.班級編號=d.班級編號
7. 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 。
8. 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
這樣再看下執行計劃吧
9. sql 多表 左右多次鏈接
為什麼你那麼喜歡用left join?、
我們首先來看錶表間的關系,看看需不需要left join。
按照你的表格意思?
t_emp.name='張三'
的入職時間,團隊名稱和團隊所屬部門名稱。
一個員工,不管何時入職都有一個編號,和入職時間的,都有所屬團隊和所屬部門。
應該不會存在一個員工,沒有入職時間,沒有編號,不存在所屬團隊和部門的情況吧。
所以個人感覺覺得你這里的多次左右連接其實是增加了查詢的成本,很多應該是沒有必要的,直接用hash連接應該就可以。。
當然我並不知道你的業務結構,可能你的設計沒問題,如果這樣的話,上面的就當我沒說。
SELECT t_emp.name 員工名字,t_hr.Indate 入職日期,t_dept.name 團隊名稱,dept.name 部門名稱 from t_emp,t_hr,t_dept,t_dept dept where t_emp.name='張三' and t_emp.H_num=t_hr.num and t_emp.d_num=t_dept.num and t_dept.d_num=dept.num
其實你上面的查詢也可以,再套一層就行了,你已經查到所屬部門了,在你的結果中加一個t_dept.d_num,然後外面再套一層,讓這個t_dept.d_num=t_dept.num就能找到所屬部門了。
10. SQL:左連接,右連接是什麼概念啊
SQL中左連接和右連接都屬於外連接。
左連接是LEFT JOIN或LEFT OUTER JOIN,左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
右連接是RIGHT JOIN 或 RIGHT OUTER JOIN,右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
舉例:要查詢所有學生的選課情況,包括已經選課的和還沒有選課的學生,查詢語句為SELECT學生表.學號,姓名,班級,課程號,成績 FROM學生表LEFT OUTER JOIN選課表ON學生表.學號=選課表.學號,左外連接查詢中左端表中的所有元組的信息都得到了保留。
(10)sql多個左連接擴展閱讀
連接查詢是關系資料庫中最主要的查詢,主要包括內連接、外連接和交叉連接等。聯接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯接條件。WHERE和HAVING子句也可以包含搜索條件,以進一步篩選聯接條件所選的行。
內連接是INNERJOIN簡寫成JOIN,是典型的聯接運算,使用像 = 或 <> 之類的比較運算符。包括相等聯接和自然聯接。內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。
外聯接除了左右連接外,還有完整外部聯接FULL JOIN 或 FULL OUTER JOIN,完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。
交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。FROM 子句中的表或視圖可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。