top
Loading...
13.2.7.2.UNION語法
13.2.7.2. UNION語法
 
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]

UNION用于把來自許多SELECT語句的結果組合到一個結果集合中。

列于每個SELECT語句的對應位置的被選擇的列應具有相同的類型。(例如,被第一個語句選擇的第一列應和被其它語句選擇的第一列具有相同的類型。)在第一個SELECT語句中被使用的列名稱也被用于結果的列名稱。

SELECT語句為常規的選擇語句,但是受到如下的限定:

·         只有最后一個SELECT語句可以使用INTO OUTFILE

·         HIGH_PRIORITY不能與作為UNION一部分的SELECT語句同時使用。如果您對第一個SELECT指定了HIGH_PRIORITY,則不會起作用。如果您對其它后續的SELECT語句指定了HIGH_PRIORITY,則會產生語法錯誤。

如果您對UNION不使用關鍵詞ALL,則所有返回的行都是唯一的,如同您已經對整個結果集合使用了DISTINCT。如果您指定了ALL,您會從所有用過的SELECT語句中得到所有匹配的行。

DISTINCT關鍵詞是一個自選詞,不起任何作用,但是根據SQL標準的要求,在語法中允許采用。(在MySQL中,DISTINCT代表一個共用體的默認工作性質。)

您可以在同一查詢中混合UNION ALLUNION DISTINCT。被混合的UNION類型按照這樣的方式對待,即DISTICT共用體覆蓋位于其左邊的所有ALL共用體。DISTINCT共用體可以使用UNION DISTINCT明確地生成,或使用UNION(后面不加DISTINCTALL關鍵詞)隱含地生成。

如果您想使用ORDER BYLIMIT子句來對全部UNION結果進行分類或限制,則應對單個地SELECT語句加圓括號,并把ORDER BYLIMIT放到最后一個的后面。以下例子同時使用了這兩個子句:

(SELECT a FROM tbl_name WHERE a=10 AND B=1)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

這種ORDER BY不能使用包括表名稱(也就是,采用tbl_name.col_name格式的名稱)列引用。可以在第一個SELECT語句中提供一個列別名,并在ORDER BY中參閱別名,或使用列位置在ORDER BY中參閱列。(首選采用別名,因為不建議使用列位置。)

另外,如果帶分類的一列有別名,則ORDER BY子句必須引用別名,而不能引用列名稱。以下語句中的第一個語句必須運行,但是第二個會運行失敗,出現在'order clause'中有未知列'a'的錯誤:

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;
(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;

To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:   為了對單個SELECT使用ORDER BYLIMIT,應把子句放入圓括號中。圓括號包含了SELECT

(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

圓括號中用于單個SELECT語句的ORDER BY只有當與LIMIT結合后,才起作用。否則,ORDER BY被優化去除。

UNION結果集合中的列的類型和長度考慮了被所有SELECT語句恢復的數值。例如,考慮如下語句:

mysql> SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10);
+---------------+
| REPEAT('a',1) |
+---------------+
| a             |
| bbbbbbbbbb    |
+---------------+

(在部分早期版本的MySQL中,第二行已被刪節到長度為1。)

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html
北斗有巢氏 有巢氏北斗