前言
學習到此內容是因為工作上的需求而接觸到的,起初是對單表進行操作,需要對某一字段下的值進行分組統計次數并排序,排序規則從次數逆序變更為指定分組順序。在翻閱資料以及同事的指導下,掌握了UNION和UNION ALL的用法。此文不僅會將工作上的需求已案例的形式給出,而且會將知識點擴展開來,以便自己鞏固記憶,同樣方便各位朋友參考。
Union:對兩個結果集進行并集操作,不包括重復行,同時進行默認規則的排序;
Union All:對兩個結果集進行并集操作,包括重復行,不進行排序;
工具
MySQL
案例
有一張學生選課表(部分信息)
學生選課表
要求如下:
- 統計同一位學生選了多少門課程,根據姓名(學生1,學生3,學生2,學生5,學生4)的順序排序;
UNION
首先看看 UNION 的用法
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生1'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生3'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生2'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生5'
UNION
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生4';
結果如圖所示:
根據特定組名排序
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生1'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生3'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生2'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生5'
UNION ALL
SELECT s.`name`, COUNT(*) AS count FROM test.student s WHERE s.`name` <> '' AND s.`name` = '學生4';
結果如圖所示:
與上結果一樣
由此可見,對于每條查詢都指定條件的操作,UNION 和 UNION ALL的作用是一樣的。
擴展
-
之前是對一條記錄,而并非結果集進行操作,在此對兩個結果集進行操作,合并操作。有一張表,如下所示:
學生表
UNION
SELECT s.id,s.`name` FROM test.student s WHERE s.id < 5
UNION
SELECT s.id,s.`name` FROM test.student s WHERE s.id BETWEEN 3 and 6;
結果如圖所示:
去重有序
最終結果是兩個結果集的并集,且去重和排序(默認是順序)。
UNION ALL
SELECT s.id,s.`name` FROM test.student s WHERE s.id < 5
UNION ALL
SELECT s.id,s.`name` FROM test.student s WHERE s.id BETWEEN 3 and 6;
結果如圖所示:
不去重無序
最終結果也是兩個結果集的并集,但是沒有做去重,也沒有排序。
小結
UNION對兩個結果集進行并集操作,重復數據只顯示一次,并且默認按順序排序;
UNION All,對兩個結果集進行并集操作,重復數據全部顯示,不對其排序。