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 應該使用該別名,而不是真實的列名。
-- ✅
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;
-- 🚨 Unknown column 'a' in 'order clause'
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;