1. 程式人生 > >SQL中JOIN和UNION區別、用法及示例

SQL中JOIN和UNION區別、用法及示例

1.JOIN和UNION區別
join 是兩張表做交連后里麵條件相同的部分記錄產生一個記錄集,
union是產生的兩個記錄集(欄位要一樣的)並在一起,成為一個新的記錄集 。

JOIN用於按照ON條件聯接兩個表,主要有四種:
INNER JOIN:內部聯接兩個表中的記錄,僅當至少有一個同屬於兩表的行符合聯接條件時,內聯接才返回行。我理解的是隻要記錄不符合ON條件,就不會顯示在結果集內。
LEFT JOIN / LEFT OUTER JOIN:外部聯接兩個表中的記錄,幷包含左表中的全部記錄。如果左表的某記錄在右表中沒有匹配記錄,則在相關聯的結果集中右表的所有選擇列表列均為空值。理解為即使不符合ON條件,左表中的記錄也全部顯示出來,且結果集中該類記錄的右表字段為空值。
RIGHT JOIN / RIGHT OUTER JOIN:外部聯接兩個表中的記錄,幷包含右表中的全部記錄。簡單說就是和LEFT JOIN反過來。
FULL JOIN / FULL OUTER JOIN:完整外部聯接返回左表和右表中的所有行。就是LEFT JOIN和RIGHT JOIN和合並,左右兩表的資料都全部顯示。

JOIN的基本語法:
Select table1.* FROM table1 JOIN table2 ON table1.id=table2.id

sql寫法
內連線inner join:
SELECT msp.name, party.name
FROM msp JOIN party ON party=code

SELECT msp.name, party.name
FROM msp inner JOIN party ON party=code

左連線left join :
SELECT msp.name, party.name
FROM msp LEFT JOIN party ON party=code

右連線right join :
SELECT msp.name, party.name
FROM msp RIGHT JOIN party ON msp.party=party.code

全連線(full join):
SELECT msp.name, party.name
FROM msp FULL JOIN party ON msp.party=party.code

UNION運算子
將兩個或更多查詢的結果集組合為單個結果集,該結果集包含聯合查詢中的所有查詢的全部行。UNION的結果集列名與UNION運算子中第一個Select語句的結果集的列名相同。另一個Select語句的結果集列名將被忽略。
其中兩種不同的用法是UNION和UNION ALL,區別在於UNION從結果集中刪除重複的行。如果使用UNION ALL 將包含所有行並且將不刪除重複的行。

UNION和UNION ALL的區別:
union 檢查重複
union all 不做檢查
比如 select 'a' union select 'a' 輸出就是一行 a
比如 select 'a' union all select 'a' 輸出就是兩行 a

2. 通過下面的例子,可以清晰的看出和理解2者的區別
例項1 典型的二表連線演示

假定有兩個表Table1和Table2,其包含的列和資料分別如表1.1和表1.2所示。

表1.1 Table1資料庫表

ColumnA

ColumnB

ColumnC

X1

Y1

Z1

X2

Y2

Z2

X3

Y3

Z3

表1.2 Table2資料庫表

ColumnA

ColumnD

ColumnE

X1

D1

E1

X2

D2

E2

X3

D3

E3

Table1和Table2表共有的列為ColumnA,如果通過ColumnA列的值連線Table1和Table2兩個表,即連線條件為Table1.ColumnA=Table2.ColumnA,此時得到的連線結果如表1.3所示。

表1.3 連線Table1和Table2表

ColumnA

ColumnB

ColumnC

ColumnD

ColumnE

X1

Y1

Z1

D1

E1

X2

Y2

Z2

D2

E2

X3

Y3

Z3

D3

E3

上述連線過程的實現程式碼可表示如下:SELECT * FROM Table1 JOIN Table2 ON Table1.ColumnA=Table2.columnA

例項2 典型的二表記錄的UNION運算

假定有兩個表Table3和Table4,其包含的列和資料分別如表2.1和表2.2所示。

表2.1 Table3資料庫表

ColumnA

ColumnB

ColumnC

X1

Y1

Z1

X2

Y2

Z2

X3

Y3

Z3

表2.2 Table4資料庫表、

ColumnA

ColumnD

ColumnE

X4

Y4

Z4

X5

Y5

Z5

X6

Y6

Z6

Table3表和Table4表具有相同的列結構,列數也要相同,列名可以不同,以第一個表的列名為新表的列名,因此可以使用UNION運算子連線兩個表的記錄集,得到的連線結果如表2.3所示。

表2.3 使用UNION連線Table3表和Table4表的記錄

ColumnA

ColumnB

ColumnC

X1

Y1

Z1

X2

Y2

Z2

X3

Y3

Z3

X4

Y4

Z4

X5

Y5

Z5

X6

Y6

Z6

上述連線過程的實現程式碼可表示如下:SELECT *FROM Table3UNIONSELECT *FROM Table4

對比例項1和例項2,不難發現二者的區別。