1. 程式人生 > >MYSQL中的union方法用法

MYSQL中的union方法用法

MYSQL中的UNION

UNION在進行錶鏈接後會篩選掉重複的記錄,所以在錶鏈接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。

舉例說明:

select * from table1 union select * from table2

這個SQL在執行時先取出兩個表的結果,再用排序空間進行排序刪除重複的記錄,最後返回結果集,如果表資料量大的話可能會導致用磁碟進行排序。  

MySQL中的UNION ALL
UNION ALL只是簡單的將兩個結果合併後就返回。這樣,如果返回的兩個結果集中有重複的資料,那麼返回的結果集就會包含重複的資料了。

舉例說明:

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)

如果現在使用: select * from table1 UNION ALL select * from table2 則是不會成功的, 資料庫為報: 
Error
The used SELECT statements have a different number of columns

這是提示查詢的兩張表的欄位不統一,如果table1比table2的欄位內容多,可以使用空字串來代替

select id,createDate,lastUpdateDate,desc,num,hashCode from table1 UNION ALL select id,createDate,lastUpdateDate,desc,'','' from table2 

如果裡面有不想要的,千萬要記住前面查詢內容要和後面查詢內容的欄位個數要一樣,前面你查詢4個,後面也要相應的放4個,這樣就不會提示引數數量不同的錯誤了。mysql中UNION ALL用法 - 小桃子 - 小桃子

其實稍稍修改一下就可以了
對於 '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運算要求查詢具有相同數目的欄位.但是,欄位資料型別不必相同.