婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL利用UNION連接2個查詢排序失效詳解

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

熱門標簽:巫師三血與酒地圖標注 在哪里申請400電話 走過哪個省地圖標注 銷售語音電話機器人 外呼系統電銷受騙 安徽ai電話電銷機器人有效果嗎 萊西市地圖標注 400電話申請信用卡 常州網絡外呼系統開發

概述

UNION

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

UNION ALL

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

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

表結構及數據

-- 創建表
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;
 
-- 數據插入語句
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', '今天很嚴肅');

默認表數據顯示如下


運行結果分析

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

結果集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
)

結果集2:使用UNION

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

結果集3:使用UNION ALL

如果需要使用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;

結果集4

 改進

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

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

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

結論

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

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

參考鏈接

cnblogs:MySQL中UNION和UNION ALL的使用

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • php7連接MySQL實現簡易查詢程序的方法
  • Mysql join連接查詢的語法與示例
  • mysql連接查詢、聯合查詢、子查詢原理與用法實例詳解
  • python針對mysql數據庫的連接、查詢、更新、刪除操作示例
  • Mysql自連接查詢實例詳解
  • 詳解MySQL數據庫--多表查詢--內連接,外連接,子查詢,相關子查詢
  • mysql多表連接查詢實例講解
  • mysql多個left join連接查詢用法分析
  • JDBC連接MySql數據庫步驟 以及查詢、插入、刪除、更新等
  • mysql連接查詢(左連接,右連接,內連接)
  • MySQL 連接查詢的原理和應用

標簽:煙臺 河北 鞍山 赤峰 果洛 黃石 來賓 陽江

巨人網絡通訊聲明:本文標題《MySQL利用UNION連接2個查詢排序失效詳解》,本文關鍵詞  MySQL,利用,UNION,連接,2個,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL利用UNION連接2個查詢排序失效詳解》相關的同類信息!
  • 本頁收集關于MySQL利用UNION連接2個查詢排序失效詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 莱阳市| 东乡族自治县| 班戈县| 通化县| 南江县| 嘉祥县| 通辽市| 康乐县| 娄烦县| 恩平市| 义乌市| 广元市| 吉安县| 通州区| 苏尼特左旗| 德昌县| 当雄县| 安阳县| 宿州市| 睢宁县| 南澳县| 康定县| 隆子县| 北安市| 贵德县| 铜梁县| 廉江市| 潼南县| 宁安市| 兴化市| 工布江达县| 新乐市| 德阳市| 宽甸| 耿马| 来宾市| 襄樊市| 连平县| 彭阳县| 曲麻莱县| 谷城县|