佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > MySQL利用UNION連接2個(gè)查詢排序失效詳解

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

熱門標(biāo)簽:地方門戶網(wǎng)站 Linux服務(wù)器 網(wǎng)站排名優(yōu)化 百度競價(jià)排名 服務(wù)外包 鐵路電話系統(tǒng) 呼叫中心市場需求 AI電銷

概述

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 '簡介',
 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)行排序有以下兩種方法:

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

參考鏈接

cnblogs:MySQL中UNION和UNION ALL的使用

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • php7連接MySQL實(shí)現(xiàn)簡易查詢程序的方法
  • Mysql join連接查詢的語法與示例
  • mysql連接查詢、聯(lián)合查詢、子查詢?cè)砼c用法實(shí)例詳解
  • python針對(duì)mysql數(shù)據(jù)庫的連接、查詢、更新、刪除操作示例
  • Mysql自連接查詢實(shí)例詳解
  • 詳解MySQL數(shù)據(jù)庫--多表查詢--內(nèi)連接,外連接,子查詢,相關(guān)子查詢
  • mysql多表連接查詢實(shí)例講解
  • mysql多個(gè)left join連接查詢用法分析
  • JDBC連接MySql數(shù)據(jù)庫步驟 以及查詢、插入、刪除、更新等
  • mysql連接查詢(左連接,右連接,內(nèi)連接)
  • MySQL 連接查詢的原理和應(yīng)用

標(biāo)簽:湘潭 黃山 蘭州 仙桃 衡水 崇左 銅川 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL利用UNION連接2個(gè)查詢排序失效詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    界首市| 卓资县| 阿拉尔市| 五莲县| 韶关市| 张家口市| 雷波县| 麻栗坡县| 明光市| 海兴县| 壶关县| 芦溪县| 宿松县| 桐庐县| 婺源县| 上栗县| 娱乐| 禹城市| 女性| 普兰县| 北海市| 晋江市| 新余市| 丹阳市| 滕州市| 浦东新区| 连州市| 虞城县| 嘉峪关市| 铜鼓县| 乌拉特后旗| 武陟县| 桐庐县| 黔江区| 宜章县| 东平县| 明溪县| 桐乡市| 嘉义县| 辉县市| 新绛县|