mysql語法之union

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;

相關文章
相關標籤/搜索