MySQL利用UNION連接2個(gè)查詢排序失效詳解
概述
UNION
連接數(shù)據(jù)集關(guān)鍵字,可以將兩個(gè)查詢結(jié)果集拼接為一個(gè),會(huì)過濾掉相同的記錄
UNION ALL
連接數(shù)據(jù)集關(guān)鍵字,可以將兩個(gè)查詢結(jié)果集拼接為一個(gè),不會(huì)過濾掉相同的記錄
今天在接到一個(gè)需求的時(shí)候使用了UNION進(jìn)行查詢后發(fā)現(xiàn),如果兩個(gè)查詢分別使用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 '用戶賬號(hào)', USER_NAME varchar(255) DEFAULT NULL COMMENT '用戶名', AGE int(5) DEFAULT NULL COMMENT '年齡', COMMENT varchar(255) DEFAULT NULL COMMENT '簡(jiǎn)介', 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', '認(rèn)真菜鳥', '30', '今天很認(rèn)真'); 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', '嚴(yán)肅菜鳥', '21', '今天很嚴(yán)肅');
默認(rèn)表數(shù)據(jù)顯示如下
運(yùn)行結(jié)果分析
-- 查詢1 SELECT * FROM test_user u ORDER BY AGE
結(jié)果集1
-- 查詢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會(huì)合并相同的記錄(與DISTINCT實(shí)現(xiàn)相同效果),因此此處顯示僅有5條記錄
結(jié)果集3:使用UNION ALL
如果需要使用UNION ALL又需要進(jìn)行排序,則要將其作為一個(gè)子查詢來查
-- 查詢4 -- 將UNION ALL作為子查詢并進(jìn)行排序 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
改進(jìn)
在經(jīng)過一番搜索相關(guān)的經(jīng)驗(yàn)后發(fā)現(xiàn),是我之前有些畫蛇添足了,原來可以在不使用子查詢即可完成排序的方法:
-- 查詢5 -- 第一個(gè)查詢不使用排序,如果使用的話不加括號(hào)會(huì)報(bào)錯(cuò)(這也是我之前為什么會(huì)想用子查詢的原因而沒有想過這種方式了) SELECT * FROM test_user u UNION ALL SELECT * FROM test_user u ORDER BY AGE
運(yùn)行出來的結(jié)果集與結(jié)果集4是相同的,此處就不再粘出結(jié)果。
結(jié)論
當(dāng)我們使用UNION(或者UNION ALL)語句時(shí),如果UNION的兩個(gè)結(jié)果集在單獨(dú)排序后再拼接,則他們的ORDER BY是失效的。如果我們要進(jìn)行排序有以下兩種方法:
- 將它們作為子查詢?cè)貽RDER BY查詢一次(還是建議使用方法2,子查詢太不簡(jiǎn)潔了)
- 在第一個(gè)結(jié)果集中不使用排序,且不用括號(hào)分隔,而在第二個(gè)結(jié)果集后使用ORDER BY
參考鏈接
cnblogs:MySQL中UNION和UNION ALL的使用
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SQL行列轉(zhuǎn)置以及非常規(guī)的行列轉(zhuǎn)置示例代碼
轉(zhuǎn)置即旋轉(zhuǎn)數(shù)據(jù)表的橫縱方向,常用來改變數(shù)據(jù)布局,以便用新的角度觀察,下面這篇文章主要給大家介紹了關(guān)于SQL行列轉(zhuǎn)置以及非常規(guī)行列轉(zhuǎn)置的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08MySql修改數(shù)據(jù)庫(kù)編碼為UTF8避免造成亂碼問題
mysql 創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定編碼很重要,很多開發(fā)者都使用了默認(rèn)編碼,亂碼問題可是防不勝防,下面與大家分享下通過修改數(shù)據(jù)庫(kù)默認(rèn)編碼方式為UTF8來減少數(shù)據(jù)庫(kù)創(chuàng)建時(shí)的設(shè)置,避免因粗心造成的亂碼問題2013-06-06MySQL中觸發(fā)器入門簡(jiǎn)單實(shí)例與介紹
本文章來mysql初學(xué)者介紹在mysql怎么創(chuàng)建觸發(fā)器及觸發(fā)器在mysql執(zhí)行順序,下面我來給大家詳細(xì)介紹2013-08-08Mysql查詢或?qū)С鼋Y(jié)果添加序號(hào)字段實(shí)現(xiàn)方法
這篇文章主要介紹了Mysql查詢或?qū)С鼋Y(jié)果添加序號(hào)字段實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04ubuntu20.04配置mysql8.0的實(shí)現(xiàn)步驟
本文主要介紹了ubuntu20.04配置mysql8.0的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05