最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于MySQL的ORDER BY排序詳解

 更新時間:2023年05月10日 08:50:41   作者:索碼理  
這篇文章主要介紹了關(guān)于MySQL的ORDER BY排序詳解,如果沒有使用排序操作,默認情況下查詢返回的數(shù)據(jù)是按照添加數(shù)據(jù)的順序顯示的,需要的朋友可以參考下

前言

工作中常常會使用ORDER BY進行排序,了解ORDER BY多種排序方式是非常有必要的。

ORDER BY 排序可以分為靜態(tài)排序和動態(tài)排序,當然這個靜態(tài)和動態(tài)是我自己取的名字,其他地方找不到。

ORDER BY 語法

ORDER BY column1 ASC/DESC, column2 ASC/DESC.....

column代表一個列字段,ORDER BY可以允許多個字段進行排序,當字段后面顯式說明是升序(ASC)或者降序(DESC)時,默認是ASC。

實踐出真知

實踐準備

先準備一張orders表

CREATE TABLE `orders` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
  `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '狀態(tài)',
  `is_deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否刪除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

表里存放著9條數(shù)據(jù)

靜態(tài)排序

所謂靜態(tài)排序就是ORDER BY后面排序的字段是固定不變的,不會根據(jù)排序字段的值的變化而變化。

舉個栗子:

SELECT * FROM orders ORDER BY id

上面這條SQL語句不會根據(jù)id的值變化字段id隨之變化。這類排序就是靜態(tài)排序。

ORDER BY后面排序字段可以跟1個或者多個,1個排序字段的就是單字段排序,多個字段的就是多字段排序。單字段排序比較簡單,上面的SQL就是單字段排序。

多字段排序中要特別注意一點的是有時選擇了多個字段進行排序,但并沒有達到期望的結(jié)果,因為多字段排序是分組排序。

舉個栗子說明一下:

列1:

SELECT * FROM orders ORDER BY id , create_date DESC 

運行結(jié)果如下:

上面這條SQL語句看似是按id升序,create_date降序,通過運行結(jié)果可以看到實則create_date排序并沒有起作用。

在ORDER BY排序中是根據(jù)第一個字段先排序,然后在第一個字段的基礎上再排序,如果第一個字段的值是不重復的,排序后后面的字段就失去了作用了。

列2:

SELECT * FROM orders ORDER BY `status` , create_date DESC 

運行結(jié)果:

列2的SQL中我們把id字段排序換成了status字段排序,由于status字段的值是重復的,從結(jié)果中我們可以看到在status字段排序完成之后,create_date字段的排序就起作用了,就按照我們指定的DESC進行排序了。

所以多字段進行排序,實則是分組排序,排序的第一個字段的值如果不重復,后面的排序字段將失效。第一個字段的值如果重復,第二個字段將會在第一個字段重復組內(nèi)進行排序,第三個字段會在前兩個字段排好序的基礎上排序,以此類推。

動態(tài)排序

動態(tài)排序和靜態(tài)排序相反(這就是一句廢話???)。所謂動態(tài)排序就是ORDER BY后面的排序字段會根據(jù)值的變化而變化。工作中應該會常常用到,比如在a=1時根據(jù)b字段進行排序,在a=2時根據(jù)c字段進行排序。這種的就稱之為動態(tài)排序。

動態(tài)排序一般都會搭配著判斷條件進行排序的,比如 Case when、if等。下面就分別使用Case和if條件判斷進行排序。

  • CASE WHEN 動態(tài)排序
SELECT
	*
FROM
	orders
ORDER BY `status` DESC, 
	CASE
WHEN `status` = 2 THEN
	create_date
END DESC,
 CASE
WHEN `status` = 4 THEN
	update_date
END

運行結(jié)果如下:

當status=2時根據(jù)create_date降序,當status=4時根據(jù)update_date升序。從結(jié)果中也可以看到達到了我們想要的效果。

  • IF 動態(tài)排序

IF 動態(tài)排序跟使用CASE WHEN排序類似,也是對字段進行判斷。

SELECT
	*
FROM
	orders
ORDER BY
IF (`status` = 3, '0', '1'),
 `status`,
 create_date DESC

運行結(jié)果:

在這段SQL中,運行結(jié)果可以分為兩部分status=3是一部分,其余是另一部分,此時IF判斷其實是附加了一個隱藏字段,status=3時返回0,否則返回1,然后再根據(jù)返回結(jié)果進行升序排序。從下面這段SQL看會更清晰。

SELECT
	id,
	`status`,
IF (`status` = 3, '0', '1') hidden_column,
 create_date,
 update_date,
 is_deleted
FROM
	orders
ORDER BY
IF (`status` = 3, '0', '1'),
 `status`,
 create_date DESC

就是對hidden_column進行排序之后,再對status進行升序排序,接著再對create_date降序排序,結(jié)果也是一樣的。

ORDER BY為什么支持動態(tài)排序呢?是因為ORDER BY執(zhí)行順序優(yōu)先級比較低,它是在獲取到結(jié)果之后才進行排序的,在獲取到結(jié)果集之后可以進行一些其他操作,就像我們從數(shù)據(jù)庫獲取結(jié)果集對其進行排序一樣,所以它可以支持動態(tài)排序。除此之后ORDER BY后面可以搭配其他函數(shù)或者查詢條件使用,比如LIKE、CONCAT、IN或者一些其他的函數(shù)都可以,感興趣的自己可以試一試,下面就拿CONCAT做個測試。

比如可以將兩個字段拼接后排序:

SELECT
 `status` , id ,CONCAT(`status` , id) 
FROM orders
ORDER BY
	CONCAT(`status`, id) DESC

結(jié)果:

總結(jié)

  1. mysql 中排序默認是按照升序ASC進行排序的
  2. 在多字段進行排序時,實則是分組排序。多字段排序會將每個分組劃分為一個個小的單元,在這一個個小的單元內(nèi)再進行排序。
  3. ORDER BY的執(zhí)行順序優(yōu)先級相對較低,是在查詢結(jié)果出來以后再進行排序。
  4. ORDER BY可以搭配函數(shù)或者一些查詢條件使用。

到此這篇關(guān)于關(guān)于MySQL的ORDER BY排序詳解的文章就介紹到這了,更多相關(guān)MySQL的ORDER BY排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • K8S搭建MySQL一主一從集群詳細步驟

    K8S搭建MySQL一主一從集群詳細步驟

    在k8s上命名空間是用于隔離不同應用的一種機制,我們可以使用命名空間來組織和管理MySQL集群,這篇文章主要給大家介紹了關(guān)于K8S搭建MySQL一主一從集群的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • MySQL 8.0數(shù)據(jù)字典緩存管理機制解析

    MySQL 8.0數(shù)據(jù)字典緩存管理機制解析

    MySQL 8.0中的數(shù)據(jù)字典,通過對兩級緩存的逐級訪問,以及精妙的對緩存未命中情況的處理方式,有效的加速了在不同場景下數(shù)據(jù)庫對DD的訪問速度,顯著的提升了數(shù)據(jù)庫訪問元數(shù)據(jù)信息的效率,這篇文章主要介紹了解讀MySQL 8.0數(shù)據(jù)字典緩存管理機制,需要的朋友可以參考下
    2024-07-07
  • linux系統(tǒng)中mysql數(shù)據(jù)庫的導入和導出

    linux系統(tǒng)中mysql數(shù)據(jù)庫的導入和導出

    本文給大家簡單記錄了一下在linux系統(tǒng)中mysql數(shù)據(jù)庫的導入和導出的方法,有相同需求的小伙伴可以參考下
    2016-02-02
  • MySQL表的增刪改查基礎教程

    MySQL表的增刪改查基礎教程

    這篇文章主要給大家介紹了關(guān)于MySQL表的增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • mysql 5.5.27 winx64安裝配置方法圖文教程

    mysql 5.5.27 winx64安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql5.5.27 winx64安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • IDEA連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句使用數(shù)據(jù)圖文詳解

    IDEA連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句使用數(shù)據(jù)圖文詳解

    使用idea連接本地MySQL數(shù)據(jù)庫,就可以很方便的看到數(shù)據(jù)庫的內(nèi)容,還可以進行基本的增加,刪除,修改操作,下面這篇文章主要給大家介紹了關(guān)于IDEA連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句使用數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • MySQL字符之char、varchar類型簡析

    MySQL字符之char、varchar類型簡析

    varchar和char是MySQL中的兩種數(shù)據(jù)類型,都是用來存儲字符串的,下面這篇文章主要給大家介紹了關(guān)于MySQL字符之char、varchar類型的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • InnoDB引擎數(shù)據(jù)庫主從復制同步新的分享

    InnoDB引擎數(shù)據(jù)庫主從復制同步新的分享

    近期將公司的MySQL架構(gòu)升級了,由原先的一主多從換成了DRBD+Heartbeat雙主多從,所以這里也將其心得歸納總結(jié)了一下
    2012-11-11
  • 分析MySQL拋出異常的幾種常見解決方式

    分析MySQL拋出異常的幾種常見解決方式

    在本文中,總結(jié)了開發(fā)過程中最為常見的幾種 MySQL 拋出的異常以及如何解決,包括高版本驅(qū)動的問題、時區(qū)配置問題、SSL 連接問題等。于我個人而言,這一篇足以解決目前項目中所有遇到的MySQL問題。同時,也希望本文能對 MySQL 數(shù)據(jù)庫初學者有一定的引導入門作用。
    2021-05-05
  • 通過實例解析MySql CURRENT_TIMESTAMP函數(shù)

    通過實例解析MySql CURRENT_TIMESTAMP函數(shù)

    這篇文章主要介紹了通過實例解析MySql CURRENT_TIMESTAMP函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09

最新評論

晋中市| 即墨市| 博乐市| 舒城县| 商河县| 方正县| 睢宁县| 凉城县| 军事| 栾城县| 哈巴河县| 油尖旺区| 澜沧| 峨山| 奉节县| 恩平市| 文成县| 彰化县| 崇阳县| 固阳县| 自贡市| 甘南县| 德阳市| 双鸭山市| 玛多县| 桂阳县| 石林| 淮滨县| 澎湖县| 寻乌县| 金塔县| 梅河口市| 普定县| 元氏县| 杨浦区| 大埔县| 清水县| 乐安县| 兴业县| 西乌| 高淳县|