MYSQL中的UNIONmysql
UNION在進行表連接後會篩選掉重複的記錄,因此在表連接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。sql
舉例說明:數據庫
select * from table1 union select * from table2函數
這個SQL在運行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,若是表數據量大的話可能會致使用磁盤進行排序。 排序
MySQL中的UNION ALL
UNION ALL只是簡單的將兩個結果合併後就返回。這樣,若是返回的兩個結果集中有重複的數據,那麼返回的結果集就會包含重複的數據了。字符串
舉例說明:hash
select * from table1 union all select * from table2
注: 使用 UNION 時 前一個 select column的個數要等於後一個select column的個數
如: table1: (id,createDate,lastUpdateDate,desc,num,hashCode),
table2: (id,createDate,lastUpdateDate,desc)io
若是如今使用: select * from table1 UNION ALL select * from table2 則是不會成功的, 數據庫爲報:
Error
The used SELECT statements have a different number of columnstable
這是提示查詢的兩張表的字段不統一,若是table1比table2的字段內容多,能夠使用空字符串來代替ast
select id,createDate,lastUpdateDate,desc,num,hashCode from table1 UNION ALL select id,createDate,lastUpdateDate,desc,'','' from table2
若是裏面有不想要的,千萬要記住前面查詢內容要和後面查詢內容的字段個數要同樣,前面你查詢4個,後面也要相應的放4個,這樣就不會提示參數數量不一樣的錯誤了。
其實稍稍修改一下就能夠了
對於 'select id,createDate,desc,hasCode from table1' 能夠任意選擇4個field
從效率上說,UNION ALL 要比UNION快不少,因此,若是能夠確認合併的兩個結果集中不包含重複的數據的話,那麼就使用UNION ALL。
若是遇到兩張表數據不一樣來集合查詢,能夠使用union all這個函數進行操做
SELECT COUNT(c.a) FROM (
(SELECT UID a,ID,SERIAL,ParkName,CardNO,ScoreRealPay,PayFlag,PayType,Createtime FROM cp_consumption_record WHERE UID=761 AND PayFlag=1 ORDER BY Createtime DESC) UNION ALL (SELECT UID a,CpResID,CpParkID,ParkSERIAL,CarCode,Price,BusinessType,CardNO,CreateDate FROM cp_reservation WHERE UID=761 AND BusinessType IN(1,2,3) ORDER BY CreateDate DESC)
) c
這是查詢結果集共有多少條數據,
若是還有查詢條件,直接在c後面添加就能夠,好比按照時間進行查詢
SELECT c.UID,c.ScoreRealPay,c.PayFlag,c.PayType FROM (
(SELECT UID AS UID,ID AS ID,SERIAL AS SERIAL ,ParkName AS ParkName,CardNO CardNO,ScoreRealPay ScoreRealPay,PayFlag PayFlag,PayType PayType,Createtime Createtime FROM cp_consumption_record WHERE UID=761 AND PayFlag=1 ORDER BY Createtime DESC) UNION ALL (SELECT UID a,CpResID,CpParkID,ParkSERIAL,CarCode,Price,BusinessType,CardNO,CreateDate FROM cp_reservation WHERE UID=761 AND BusinessType IN(1,2,3) ORDER BY CreateDate DESC)
) c ORDER BY Createtime DESC/ASC
這裏強調一下,你要按照什麼樣的條件進行查詢時,要分別在select子查詢中添加上條件,最後在按照統一的時間倒序或者正序
注: 缺省的狀況下,UNION 子句不返回重複的記錄.若是想顯示全部記錄,能夠加ALL選項 UNION運算要求查詢具備相同數目的字段.可是,字段數據類型沒必要相同.