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 ALLUNION DISTINCT,右邊的 UNION DISTINCT 替覆蓋掉左邊 UNION ALL

結果中的列名將使用第一個 SELECT 語句中定義的列名。各 SELECT 結果中對應位置的列其數據類型應該保持一致。如果不一致,MySQL 會根據結果中的數據類型及長度進行兼容的轉換。

UNION 語句中只最后一個 SELECT 可指定 INTO OUTFILE。但其實整個 UNION 查詢的結果都是存入這個文件的。
UNION 中不能搭配使用 HIGH_PRIORITY。如果該關鍵詞指定在第一個 SELECT 身上,不會生效,指定在其他 SELECT 上會報語法錯誤。

結合使用 ORDER BYLIMIT 時,應使用括號將 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;

相關資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM