1. 程式人生 > >SQL中的內連線、左連線、右連線、全連線、交叉連線

SQL中的內連線、左連線、右連線、全連線、交叉連線

sql連線查詢可分為三大類:內連線、外連線、交叉連線。外連線又可分為左連線,右連線,全連線。

我們最常用的應該是內連線,多表聯合查詢的時候使用的諸如“select * from a,b where a.uid=b.uid;”這就是一個典型內連線查詢的例子,實際上這句與“select * form a inner join b on a.uid=b.uid”是等價的,後者逼格明顯高了許多。下面來詳細說一說。

舉例資料庫表如下:


1.內連線

獲取兩個表的公共部分,即右表中滿足與左表間查詢條件的對應項。

1.1.等值連線:在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。
1.2.不等值連線

:在連線條件使用除等於運算子以外的其它比較運算子比較被連線的列的列值。這些運算子包括>、>=、<=、<、!>、!<和<>。
1.3.自然連線:在連線條件中使用等於(=)運算子比較被連線列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連線表中的重複列。
總結:內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。

select * from book as a,stu as b where a.sutid = b.stuid
select * from book as a inner join stu as b on a.sutid = b.stuid     //這裡的join可省略

內連線查詢到滿足where 或者 on 後面查詢條件的並且不存在NULL值列的資料。

2.外連結

2.1.左聯接:左邊的表不加限制,即以左表為基準,將a.stuid = b.stuid的資料進行連線,查詢到的滿足條件的項全部顯示,而左表中存在,對應右表不存在的項,將左表資料顯示,對應右表中查不到的結果列設為NULL:

select * from book as a left join stu as b on a.sutid = b.stuid

2.2.右連線:右邊的表不加限制,即以右表為基準,將a.stuid = b.stuid的資料進行連線,查詢到滿足條件的項全部顯示,而右表中存在,對應左表中不存在的項,將右表資料顯示,對應的左表查中不到的結果列設為NULL:
select * from book as a right join stu as b on a.sutid = b.stuid

2.3.全連線:兩個表都不加限制,即完整外部聯接,返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列設為NULL。如果表之間有匹配行,則整個結果集行包含基表的資料值。實際上就是,顯示兩個表的所有對應的資料列,而在另一個表找不到對應資料的,就設為NULL。
select * from book as a full outer join stu as b on a.sutid = b.stuid


外連線允許NULL值,定好基準表後,基準表資料全部要查詢到,而不滿足在where 或 on 後查詢條件的非基準表資料也要返回,返回值為NULL。

3.交叉連線

交叉連線:交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。

select * from book as a cross join stu as b order by a.id

交叉連線好理解,就是左表每一項都與右表每一項做連線,不存在NULL值。