淺析union/union all/distinct的區別和用途、distinct如何進行排序優化


一、union、union all 、distinct 的區別和用途

1、從用途上講:它們都具有去重的效果

2、從效率上講:distinct 通常不建議使用,效率較低。union all 和 union 而言,union all 效率更高。

  原因是:union 相當於多表查詢出的數據,進行去重,然后再進行排序后返回,而 union all 是多表查詢合並后就直接返回

3、從單表還是多表上講:單表上有重復記錄只能使用distinct,多表查詢建議用 union all

二、distinct 排序優化(避免排序)- union all 代替 union、exists 代替 distinct

  大家都知道數據庫有些命令會對結果進行排序,當數據量較大時,排序會非常耗時。

1、會進行排序的SQL 命令 - 下面列舉會排序的代表性運算:

GROUP BY 子句

ORDER BY 子句

聚合函數(SUM,COUNT,AVG,MAX,MIN)

DISTINCT

集合運算(UNICON,INTERSECT,EXCEPT)

窗口函數(RANK,ROW_NUMBER等)

2、實例一:盡可能使用 union all 代替 union

SELECT * FROM TABLE_A UNION ALL SELECT * FROM TABLE_B;

  如果不在乎結果中存在重復數據,或預先知道結果中不會有重復數據。請使用 union all 代替 union,這樣就不會進行排序。

3、實例二:盡可能使用 exists 代替 distinct

  示例數據說明,下面有商品表 Items 和銷售記錄表 SalesHistory。

  需求:查找有銷售記錄的商品。

  可以使用 in 方式實現,但因為 in 會產生子查詢,不如使用連接查詢效率高。

SELECT DISTINCT I.item_no FROM Items I INNER JOIN SalesHistory S ON I.item_no = S.item_no;

  因為是一對多查詢,會產生重復記錄,所有使用DISTINCT過濾重復記錄。但更好的做法是使用exists方式:

SELECT DISTINCT I.item_no FROM Items I WHERE EXISTS ( SELECT * FROM SalesHistory S WHERE I.item_no = S.item_no);

  說明:因為使用 exists 查詢時不會進行排序,而且使用 exists 和使用連接效率一樣高。

三、union distinct - 當面試官問你UNION 和UNION ALL之間的區別時該怎么答

  MySQL數據庫支持兩種集合操作:UNION DISTINCT和UNION ALL。

  UNION DISTINCT組合兩個輸入,並應用DISTINCT過濾重復項,一般可以直接省略DISTINCT關鍵字,直接使用UNION。

  在多個SELECT語句中,對應的列應該具有相同的字段屬性,且第一個SELECT語句中被使用的字段名稱也被用於結果的字段名稱。

1、union distinct:其實 union 相當於 union distinct,個人覺得寫全比較好,不要偷懶。

  當A查詢中有數據a,B查詢中有數據a,對兩個查詢使用union distinct方法,那么查詢結果只有一條數據a記錄。

2、union all:當A查詢中有數據a,B查詢中有數據a,對兩個查詢使用 union all 方法,那么查詢結果會出現兩條數據a。

3、說明:

(1)當A查詢中有數據a,B查詢中有數據a,不管對兩個查詢使用union all/distinct方法,查詢結果的字段展示是根據union all/distinct前的查詢結果字段展示的。

-- 例如前面union all,查詢語句為:
(SELECT * from name2 where agend2 = '1') UNION ALL (select * from name where name = 'ck1' AND agend = '1'); -- 那么展示的字段是 name2 表中的字段。

(2)在使用UNION DISTINCT的時候,由於向臨時表中添加了唯一索引,插入的速度顯然會因此而受到影響。如果確認進行UNION操作的兩個集合中沒有重復的選項,最有效的辦法應該是使用UNION ALL。

(3)union 會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來,不管是不是重復。

  Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序。

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

  Union All:對兩個結果集進行並集操作,包括重復行,不進行排序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM