溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL利用UNION連接2個查詢排序失效詳解

發(fā)布時間:2020-08-26 02:46:02 來源:腳本之家 閱讀:488 作者:試著奔跑的菜鳥 欄目:MySQL數(shù)據(jù)庫

概述

UNION

連接數(shù)據(jù)集關鍵字,可以將兩個查詢結(jié)果集拼接為一個,會過濾掉相同的記錄

UNION ALL

連接數(shù)據(jù)集關鍵字,可以將兩個查詢結(jié)果集拼接為一個,不會過濾掉相同的記錄

今天在接到一個需求的時候使用了UNION進行查詢后發(fā)現(xiàn),如果兩個查詢分別使用ORDER BY后拼接居然無法成功排序,經(jīng)過了好一番折騰,記錄下

表結(jié)構(gòu)及數(shù)據(jù)

-- 創(chuàng)建表
CREATE TABLE test_user (
 ID int(11) NOT NULL AUTO_INCREMENT,
 USER_ID int(11) DEFAULT NULL COMMENT '用戶賬號',
 USER_NAME varchar(255) DEFAULT NULL COMMENT '用戶名',
 AGE int(5) DEFAULT NULL COMMENT '年齡',
 COMMENT varchar(255) DEFAULT NULL COMMENT '簡介',
 PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
 
-- 數(shù)據(jù)插入語句
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', '開心菜鳥', '18', '今天很開心');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('2', '222', '悲傷菜鳥', '21', '今天很悲傷');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('3', '333', '認真菜鳥', '30', '今天很認真');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('4', '444', '高興菜鳥', '18', '今天很高興');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('5', '555', '嚴肅菜鳥', '21', '今天很嚴肅');

默認表數(shù)據(jù)顯示如下

MySQL利用UNION連接2個查詢排序失效詳解

運行結(jié)果分析

-- 查詢1
SELECT
 *
FROM
 test_user u
ORDER BY AGE

結(jié)果集1

MySQL利用UNION連接2個查詢排序失效詳解

-- 查詢2
-- 使用UNION
(
 SELECT
  *
 FROM
  test_user u
 ORDER BY AGE
)
UNION
(
 SELECT
  *
 FROM
  test_user u
 ORDER BY AGE
);
 
-- 查詢3
-- 使用UNION ALL
(
 SELECT
  *
 FROM
  test_user u
 ORDER BY AGE
)
UNION ALL
(
 SELECT
  *
 FROM
  test_user u
 ORDER BY AGE
)

結(jié)果集2:使用UNION

由于UNION會合并相同的記錄(與DISTINCT實現(xiàn)相同效果),因此此處顯示僅有5條記錄

MySQL利用UNION連接2個查詢排序失效詳解

結(jié)果集3:使用UNION ALL

MySQL利用UNION連接2個查詢排序失效詳解

如果需要使用UNION ALL又需要進行排序,則要將其作為一個子查詢來查

-- 查詢4
-- 將UNION ALL作為子查詢并進行排序
SELECT
 *
FROM
 (
 (
 SELECT
 *
 FROM
 test_user u
 ORDER BY
 AGE
 )
 UNION ALL
 (
 SELECT
 *
 FROM
 test_user u
 ORDER BY
 AGE
 )
 ) a
ORDER BY
 AGE;

結(jié)果集4

MySQL利用UNION連接2個查詢排序失效詳解

 改進

在經(jīng)過一番搜索相關的經(jīng)驗后發(fā)現(xiàn),是我之前有些畫蛇添足了,原來可以在不使用子查詢即可完成排序的方法:

-- 查詢5
-- 第一個查詢不使用排序,如果使用的話不加括號會報錯(這也是我之前為什么會想用子查詢的原因而沒有想過這種方式了)
SELECT
 *
FROM
 test_user u
 
UNION ALL
 
SELECT
 *
FROM
 test_user u
ORDER BY
 AGE

運行出來的結(jié)果集與結(jié)果集4是相同的,此處就不再粘出結(jié)果。

結(jié)論

當我們使用UNION(或者UNION ALL)語句時,如果UNION的兩個結(jié)果集在單獨排序后再拼接,則他們的ORDER BY是失效的。如果我們要進行排序有以下兩種方法:

  1. 將它們作為子查詢再ORDER BY查詢一次(還是建議使用方法2,子查詢太不簡潔了)
  2. 在第一個結(jié)果集中不使用排序,且不用括號分隔,而在第二個結(jié)果集后使用ORDER BY

參考鏈接

cnblogs:MySQL中UNION和UNION ALL的使用

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI