SQL 語法 - UNION、NOT EXISTS、CASE

March 14, 2021

這篇文章介紹 UNIONUNION ALL 語法的作用與範例,NOT EXISTSCASE 語法的簡介,以及其它的 SQL 語法,包含註解的使用,以及如何取得目前時間。

UNION 和 UNION ALL

UNION 可以將上下兩句 SQL 語法的查詢結果合併起來,使用 SELECT 查詢的結果欄位需要完全相同。如下範例:


CREATE TABLE Person (
    Name VARCHAR(50),
    Sex VARCHAR(10),
    City VARCHAR(50)
);

CREATE TABLE Member (
    Name VARCHAR(50),
    Sex VARCHAR(10),
    Account VARCHAR(50),
    City VARCHAR(50)
);

INSERT INTO Person (Name, Sex, City) VALUES
('John', 'Male', 'New York'),
('Alice', 'Female', 'Los Angeles'),
('Bob', 'Male', 'Chicago'),
('Emily', 'Female', 'Houston');

INSERT INTO Member (Name, Sex, Account, City) VALUES
('Alice', 'Female', 'alice123', 'Los Angeles'),
('David', 'Male', 'david456', 'San Francisco'),
('Emily', 'Female', 'emily789', 'Houston'),
('Frank', 'Male', 'frank012', 'Seattle');

接著執行合併資料的 SELECT 語法:

SELECT [Name] FROM Person
UNION
SELECT [Name] FROM Member

結果如下:

Name
-----
Alice
Bob
David
Emily
Frank
John

可以看見重複的 Alice 和 Emily 只會出現一次。

UNION ALL: 與 UNION 的作用類似,上下兩句查詢結果合併在一起,差異在於 UNION ALL 會列出包含重複資料的所有結果,而 UNION 僅列出不重複的所有結果。

因為 UNION ALL 不需要排序、找出重複的資料並刪除,效率會比 UNION 更好。如果確認要合併的資料不會重複,或是重複了也沒關係,就可以使用 UNION ALL

以上面的範例資料為例:

SELECT [Name] FROM Person
UNION ALL
SELECT [Name] FROM Member

結果如下:

Name
-----
John
Alice
Bob
Emily
Alice
David
Emily
Frank

參考資料:SQL UNION ALL - 1Keydata SQL 語法教學

NOT EXISTS 與 CASE

  • NOT EXISTS 可以將不存在於子查詢中的資料列出來,其用法範例如下:
SELECT 資料欄位
FROM 資料表1
WHERE NOT EXISTS (
    SELECT 1
    FROM 資料表2
    WHERE 資料表1.欄位 = 資料表2.關聯欄位
);
  • CASE 是類似其它程式語言中 if 的寫法,其格式如下:
CASE
    WHEN 條件成立 THEN 結果
    [其它的 WHEN ...]
    [ELSE 結果]
END;

其它