概述
UNION
連接數(shù)據(jù)集關(guān)鍵字,可以將兩個(gè)查詢(xún)結(jié)果集拼接為一個(gè),會(huì)過(guò)濾掉相同的記錄
UNION ALL
連接數(shù)據(jù)集關(guān)鍵字,可以將兩個(gè)查詢(xún)結(jié)果集拼接為一個(gè),不會(huì)過(guò)濾掉相同的記錄
今天在接到一個(gè)需求的時(shí)候使用了UNION進(jìn)行查詢(xún)后發(fā)現(xiàn),如果兩個(gè)查詢(xún)分別使用ORDER BY后拼接居然無(wú)法成功排序,經(jīng)過(guò)了好一番折騰,記錄下
表結(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ù)賬號(hào)',
USER_NAME varchar(255) DEFAULT NULL COMMENT '用戶(hù)名',
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ù)插入語(yǔ)句
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', '開(kāi)心菜鳥(niǎo)', '18', '今天很開(kāi)心');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('2', '222', '悲傷菜鳥(niǎo)', '21', '今天很悲傷');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('3', '333', '認(rèn)真菜鳥(niǎo)', '30', '今天很認(rèn)真');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('4', '444', '高興菜鳥(niǎo)', '18', '今天很高興');
INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('5', '555', '嚴(yán)肅菜鳥(niǎo)', '21', '今天很?chē)?yán)肅');
默認(rèn)表數(shù)據(jù)顯示如下
運(yùn)行結(jié)果分析
-- 查詢(xún)1
SELECT
*
FROM
test_user u
ORDER BY AGE
結(jié)果集1
-- 查詢(xún)2
-- 使用UNION
(
SELECT
*
FROM
test_user u
ORDER BY AGE
)
UNION
(
SELECT
*
FROM
test_user u
ORDER BY AGE
);
-- 查詢(xún)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è)子查詢(xún)來(lái)查
-- 查詢(xún)4
-- 將UNION ALL作為子查詢(xún)并進(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ò)一番搜索相關(guān)的經(jīng)驗(yàn)后發(fā)現(xiàn),是我之前有些畫(huà)蛇添足了,原來(lái)可以在不使用子查詢(xún)即可完成排序的方法:
-- 查詢(xún)5
-- 第一個(gè)查詢(xún)不使用排序,如果使用的話不加括號(hào)會(huì)報(bào)錯(cuò)(這也是我之前為什么會(huì)想用子查詢(xún)的原因而沒(méi)有想過(guò)這種方式了)
SELECT
*
FROM
test_user u
UNION ALL
SELECT
*
FROM
test_user u
ORDER BY
AGE
運(yùn)行出來(lái)的結(jié)果集與結(jié)果集4是相同的,此處就不再粘出結(jié)果。
結(jié)論
當(dāng)我們使用UNION(或者UNION ALL)語(yǔ)句時(shí),如果UNION的兩個(gè)結(jié)果集在單獨(dú)排序后再拼接,則他們的ORDER BY是失效的。如果我們要進(jìn)行排序有以下兩種方法:
- 將它們作為子查詢(xún)?cè)貽RDER BY查詢(xún)一次(還是建議使用方法2,子查詢(xún)太不簡(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ì)腳本之家的支持。
您可能感興趣的文章:- php7連接MySQL實(shí)現(xiàn)簡(jiǎn)易查詢(xún)程序的方法
- Mysql join連接查詢(xún)的語(yǔ)法與示例
- mysql連接查詢(xún)、聯(lián)合查詢(xún)、子查詢(xún)?cè)砼c用法實(shí)例詳解
- python針對(duì)mysql數(shù)據(jù)庫(kù)的連接、查詢(xún)、更新、刪除操作示例
- Mysql自連接查詢(xún)實(shí)例詳解
- 詳解MySQL數(shù)據(jù)庫(kù)--多表查詢(xún)--內(nèi)連接,外連接,子查詢(xún),相關(guān)子查詢(xún)
- mysql多表連接查詢(xún)實(shí)例講解
- mysql多個(gè)left join連接查詢(xún)用法分析
- JDBC連接MySql數(shù)據(jù)庫(kù)步驟 以及查詢(xún)、插入、刪除、更新等
- mysql連接查詢(xún)(左連接,右連接,內(nèi)連接)
- MySQL 連接查詢(xún)的原理和應(yīng)用