MySQL SELECT語法(四)UNION語法詳解

  源自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

  • 只有最後一個SELECT語句可使用INTO OUTFILE,固然,所有UNION的結果會寫到文件中去。
  • HIGH_PRIORITY在UNION語句中使用沒有意義。由於對第一個SELECT使用,不產生什麼影響。在其它的SELECT中使用,會報錯。

 

  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錯誤。

相關文章
相關標籤/搜索