UNION的語法結構:html
SELECT ...mysql
UNION [ ALL | DISTINCT ] SELECT ....sql
[ UNION [ ALL | DISTINCT ] SELECT .....]優化
UNION 用於將多個SELECT語句中的結果組合到單個結果集中。spa
1 第一個SELECT語句用的列名稱用做返回結果的列名稱code
其中第一個select中查詢的列名爲user_name,第二個select中查詢的列名爲password,但顯示的結果列名稱只有user_namehtm
在多個select語句中,對應的列應該具備相同的數據類型,若是相應的select獵德數據類型不匹配,則union結果中列的類型和長度會考慮全部的select語句檢索的值blog
UNION DISTINCT 和 UNION ALL 排序
UNION DISTINCT 組合倆個輸入,並應用DISTINCT過濾重複的行,通常DISTINCT能夠省略,由於UNION默認是刪除結果中重複的行。UNION ALL不會刪除重複的行,結果包括全部SELECT語句中全部的匹配行token
SELECT * FROM T1 WHERE = 10 UNION ALL SELECT * FROM T1 WHERE a = 10;
查詢出來的結果會有倆分相同的數據(這裏就不作實際例子了)
UNION 中使用 ORDER BY 和 LIMIT
要對單個select語句應用ORDER BY 或 LIMIT ,請將子句放在括號括住的select語句中:
(select a from t1 where a = 10 order by a limit 10)
union
(select * from t2 where a = 11 order by a limit 10);
但要注意的是,ORDER BY 對於單個SELECT 語句的使用並不意味着在最終結果中進行排序,由於UNION默認狀況下會生成一組無序的結果集。所以這裏要使用ORDER BY 一般會結合LIMIT使用,來肯定要取出的行的數量,若是隻用了ORDER BY 沒有配合使用LIMIT,那麼ORDER BY 會被優化掉,由於它不會有任何效果
若是想整個結果集使用ORDER BY 或 LIMIT 進行排序或限制,請將各個SELECT語句括起來並把ORDER BY 或 LIMIT 放在最後:
(select a from t1 where a = 10 )
union
(select a from t2 where a = 11)
order by a limit 10;
但要注意上面的這種狀況ORDER BY引用的列名不能包含表名(例如:table_name.col_name)
此外,若是要排序的列是別名,則該ORDER BY
子句必須引用別名,而不是列名。如下第一個語句將起做用,但第二個語句將失敗並顯示 Unknown 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;
若是相在整個結果集中對每一個SELECT的結果集排序,請在每一個SELECT中選擇一個附加列用以排序,並ORDER BY在最後添加一下內容:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2 AS sort_col,col2a, col2b, ... FROM t2) ORDER BY sort_col;
要在單個SELECT
結果中另外維護排序順序 ,請在ORDER BY
子句中添加輔助列:
(SELECT 1 AS sort_col, col1a, col1b, ... FROM t1)
UNION
(SELECT 2, col2a, col2b, ... FROM t2) ORDER BY sort_col, col1a;