SQL - UNION 與 UNION ALL



UNIONUNION ALL 運算子只是 SQL 對代數集合運算子的實現。兩者都用於從多個表中檢索行並將它們作為單個表返回。這兩個運算子之間的區別在於,UNION 僅返回不同的行,而 UNION ALL 返回表中存在的所有行。

但是,為了使這些運算子能夠在這些表上工作,它們需要遵循以下條件:

  • 要組合的表必須具有相同數量的列,並且資料型別相同。
  • 行數不必相同。

滿足這些條件後,UNION 或 UNION ALL 運算子將多個表中的行作為結果表返回。

第一個表的列名將成為結果表的列名,第二個表的內容將合併到具有相同資料型別的結果列中。

什麼是 UNION?

UNION 是 SQL 中的一種運算子/子句,其工作方式類似於關係代數中的並集運算子。它只是組合來自多個聯合兼容表的的資訊。

由於 UNION 自動消除所有重複記錄,因此只有來自表的不同行會被新增到結果表中。

語法

以下是 SQL 中 UNION 運算子的語法:

SELECT * FROM table1
UNION
SELECT * FROM table2;

示例

讓我們首先建立兩個表 COURSES_PICKED 和 EXTRA_COURSES_PICKED,它們具有相同數量的列,並且具有相同的資料型別。

使用以下查詢建立 COURSES_PICKED 表:

CREATE TABLE COURSES_PICKED(
   STUDENT_ID INT NOT NULL, 
   STUDENT_NAME VARCHAR(30) NOT NULL, 
   COURSE_NAME VARCHAR(30) NOT NULL
);

使用以下查詢將值插入 COURSES_PICKED 表:

INSERT INTO COURSES_PICKED VALUES
(1, 'JOHN', 'ENGLISH'),
(2, 'ROBERT', 'COMPUTER SCIENCE'),
(3, 'SASHA', 'COMMUNICATIONS'),
(4, 'JULIAN', 'MATHEMATICS');

該表將顯示如下:

學生 ID 學生姓名 課程名稱
1 約翰 英語
2 羅伯特 計算機科學
3 薩沙 傳播學
4 朱利安 數學

現在,讓我們使用以下查詢建立另一個表 EXTRA_COURSES_PICKED:

CREATE TABLE EXTRA_COURSES_PICKED(
   STUDENT_ID INT NOT NULL, 
   STUDENT_NAME VARCHAR(30) NOT NULL, 
   EXTRA_COURSE_NAME VARCHAR(30) NOT NULL
);

以下是將值插入 "EXTRA_COURSES_PICKED" 表的查詢:

INSERT INTO EXTRA_COURSES_PICKED VALUES
(1, 'JOHN', 'PHYSICAL EDUCATION'),
(2, 'ROBERT', 'GYM'),
(3, 'SASHA', 'FILM'),
(4, 'JULIAN', 'MATHEMATICS');

該表將建立如下:

學生 ID 學生姓名 課程選擇
1 約翰 體育
2 羅伯特 健身房
3 薩沙 電影
4 朱利安 數學

現在,讓我們使用以下 UNION 查詢組合這兩個表:

SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;

輸出

執行 UNION 操作後獲得的結果表如下:

學生 ID 學生姓名 課程名稱
1 約翰 英語
2 羅伯特 計算機科學
3 薩沙 傳播學
4 朱利安 數學
1 約翰 體育
2 羅伯特 健身房
3 薩沙 電影

什麼是 UNION ALL?

UNION ALL 也是 SQL 中的一種運算子/子句,用於將多個表合併成一個表。但是,此運算子還會保留結果表中的重複行。

假設有兩個表,一個表包含一名球員參加的國際比賽數量,另一個表包含一名球員參加的國家級比賽數量。

Union vs Unionall

如上表所示,科利在國際上打了 234 場比賽,在國內打了 234 場比賽。即使這些列中的資料相同,它們也都是獨立的比賽。需要在顯示球員總比賽場數的結果表中包含這兩行。因此,在這種情況下,我們使用 UNION ALL 運算子。

Union vs Unionall1

語法

以下是 SQL 中 UNION ALL 運算子的語法:

SELECT * FROM table1
UNION ALL
SELECT * FROM table2;

示例

在以下示例中,讓我們對上面給出的相同示例表:"COURSES_PICKED" 和 "EXTRA_COURSES_PICKED" 執行 UNION ALL 操作,使用以下查詢:

SELECT * FROM COURSES_PICKED
UNION ALL
SELECT * FROM EXTRA_COURSES_PICKED;

輸出

結果表顯示如下:

學生 ID 學生姓名 課程名稱
1 約翰 英語
2 羅伯特 計算機科學
3 薩沙 傳播學
4 朱利安 數學
1 約翰 體育
2 羅伯特 健身房
3 薩沙 電影
4 朱利安 數學
廣告

© . All rights reserved.