源自MySQL 5.7 官方手冊:13.2.9.3 UNION Syntaxhtml
1、UNION語法mysql
UNION用於將多個SELECT語句的結果合併到一個結果集中。sql
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
將會使用第一個SELECT語句中的列名稱做爲返回結果的列名稱。並且在每一個SELECT語句的相應位置中列出的選定列應具備相同的數據類型。函數
若是相應SELECT列的數據類型不匹配,則UNION結果中列的類型和長度會考慮全部SELECT語句檢索的值。示例以下:優化
mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10); /* +---------------+ | REPEAT('a',1) | +---------------+ | a | | bbbbbbbbbb | +---------------+ */
UNION涉及到的SELECT語句有以下限制:spa
UNION的默認會從結果中刪除重複的行,因此DINSTINCT關鍵字用不用都同樣。而ALL關鍵字就可讓結果包含全部符合條件的重複行。code
能夠在同一查詢中混合使用UNION ALL和UNION DISTINCT。MySQL對此的處理策略是:一個DISTINCT UNION句覆蓋它其左側的任何ALL UINON句。htm
要將ORDER BY或LIMIT應用於單個SELECT,請將子句放在包含SELECT的括號內:blog
(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);
在5.7中,括號是必須的。排序
對UNION中的單個SELECT語句使用ORDER BY並不影響行在最終結果中出現的順序,由於UNION默認生成一組無序行。所以,在此上下文中使用ORDER BY一般與LIMIT結合使用來獲取一個子集。
若是在SELECT中沒有LIMIT出現ORDER BY,它會被優化掉,由於它不管如何都不會產生任何影響。
若要對整個UNION的結果使用ORDER BY 或 LIMIT,使用括號把SELECT子句括起來,而後在最後一個SELECT子句後使用他們。以下:
(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子句上。
對UNION結果使用的ORDER BY,不能使用tb1_name.col_name形式的列引用。而是在第一個SELECT語句中提供列別名,並引用ORDER BY中的別名
此外,若是要進行排序的列擁有別名,則ORDER BY子句必須引用別名,而不是列名。下面的第一個條SQL會正常運行,可是第二條SQL會失敗報錯:Unknow column 'a' in order clause。
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b; (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;
若是想讓UNION的結果,按查詢語句中所列的SELECT語句的順序同樣進行排列,能夠爲每一個SELECT語句添加一個附加(常數)列做爲專門的排序列,並在最後一個SELECT後添加ORDER BY。作法以下:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1) UNION (SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col;
而後能夠繼續在ORDER BY後添加輔助排序列了,這意味着來自同一個SELECT語句的數據行按輔助排序行進行排序:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1) UNION (SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;
附加列也能夠提供其餘標識信息,例如表名的字符串。
在ORDER BY子句中使用聚合函數的UNION查詢將被拒絕,並報出ER_AGGREGATE_ORDER_FOR_UNION錯誤。