MySQL UNION 查詢
UNION
用來合併多個 SELECT 結果。
考察如下兩個表:
# t1 +----+---------+ | id | pattern | +----+---------+ |1 | Divot| |2 | Brick| |3 | Grid| +----+---------+ # t2 +----+---------+ | id | pattern | +----+---------+ | 1| Divot| | A| Brick| | B| Grid| | C| Diamond | +----+---------+
一個 union 示例:
mysql> select * from t1 union select * from t2; +----+---------+ | id | pattern | +----+---------+ | 1| Divot| | 2| Brick| | 3| Grid| | A| Brick| | B| Grid| | C| Diamond | +----+---------+ 6 rows in set (0.00 sec)
預設情況下 UNION 結果中已經去重,所以無須指定 DISTINCT。如果想保留所有結果可指定ALL
。
mysql> SELECT * FROM t1 UNION ALL SELECT * FROM t2; +----+---------+ | id | pattern | +----+---------+ | 1| Divot| | 2| Brick| | 3| Grid| | 1| Divot| | A| Brick| | B| Grid| | C| Diamond | +----+---------+ 7 rows in set (0.00 sec)
查詢語句中可混合使用
UNION ALL
和
UNION DISTINCT
,右邊的UNION DISTINCT
替覆蓋掉左邊UNION ALL
。
結果中的列名將使用第一個 SELECT 語句中定義的列名。各 SELECT 結果中對應位置的列其資料型別應該保持一致。如果不一致,MySQL 會根據結果中的資料型別及長度進行相容的轉換。
UNION 語句中只最後一個 SELECT 可指定 INTO OUTFILE。但其實整個 UNION 查詢的結果都是存入這個檔案的。
UNION 中不能搭配使用 HIGH_PRIORITY。如果該關鍵詞指定在第一個 SELECT 身上,不會生效,指定在其他 SELECT 上會報語法錯誤。
結合使用ORDER BY
或LIMIT
時,應使用括號將 SELECT 語句包裹。
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
對 UNION 結果進行整體排序和數量限制:
(SELECT a FROM t1 WHERE a=10 AND B=1) UNION (SELECT a FROM t2 WHERE a=11 AND B=2) ORDER BY a LIMIT 10;
SELECT 中指定了別名時,ORDER BY 應該使用該別名,而不是真實的列名。
--:white_check_mark: (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b; -- :rotating_light: Unknown column 'a' in 'order clause' (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;