欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

ORDER BY 語法

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

column代表一個(gè)列字段,ORDER BY可以允許多個(gè)字段進(jìn)行排序,當(dāng)字段后面顯式說明是升序(ASC)或者降序(DESC)時(shí),默認(rèn)是ASC。

實(shí)踐出真知

實(shí)踐準(zhǔn)備

先準(zhǔn)備一張orders表

CREATE TABLE `orders` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時(shí)間',
  `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后面排序的字段是固定不變的,不會(huì)根據(jù)排序字段的值的變化而變化。

舉個(gè)栗子:

SELECT * FROM orders ORDER BY id

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

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

多字段排序中要特別注意一點(diǎn)的是有時(shí)選擇了多個(gè)字段進(jìn)行排序,但并沒有達(dá)到期望的結(jié)果,因?yàn)槎嘧侄闻判蚴欠纸M排序。

舉個(gè)栗子說明一下:

列1:

SELECT * FROM orders ORDER BY id , create_date DESC 

運(yùn)行結(jié)果如下:

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

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

列2:

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

運(yùn)行結(jié)果:

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

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

動(dòng)態(tài)排序

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

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

  • CASE WHEN 動(dòng)態(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

運(yùn)行結(jié)果如下:

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

  • IF 動(dòng)態(tài)排序

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

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

運(yùn)行結(jié)果:

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

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

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

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

比如可以將兩個(gè)字段拼接后排序:

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

結(jié)果:

總結(jié)

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

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

相關(guān)文章

  • MySQL閃回(flashback)原理與實(shí)戰(zhàn)

    MySQL閃回(flashback)原理與實(shí)戰(zhàn)

    摘要: 本文將介紹閃回原理,給出筆者的實(shí)戰(zhàn)經(jīng)驗(yàn),并對(duì)現(xiàn)存的閃回工具作比較。這是目前為止,MySQL 閃回領(lǐng)域第一篇全面深入的實(shí)戰(zhàn)總結(jié)。
    2017-01-01
  • mysql 5.7.21 解壓版安裝配置方法圖文教程

    mysql 5.7.21 解壓版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.21 解壓版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • mysql數(shù)據(jù)庫中字段的注釋和類型長度獲取方式

    mysql數(shù)據(jù)庫中字段的注釋和類型長度獲取方式

    這篇文章主要介紹了mysql數(shù)據(jù)庫中字段的注釋和類型長度獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • mysql對(duì)于模糊查詢like的一些匯總

    mysql對(duì)于模糊查詢like的一些匯總

    這篇文章主要給大家介紹了關(guān)于mysql對(duì)于模糊查詢like的一些匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • MySQL中union和unionall區(qū)別

    MySQL中union和unionall區(qū)別

    本文主要介紹了MySQL中union和unionall區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Navicat中如何導(dǎo)入數(shù)據(jù)庫SQL腳本并執(zhí)行

    Navicat中如何導(dǎo)入數(shù)據(jù)庫SQL腳本并執(zhí)行

    這篇文章主要給大家介紹了關(guān)于Navicat中如何導(dǎo)入數(shù)據(jù)庫SQL腳本并執(zhí)行的相關(guān)資料,Navicat是一個(gè)強(qiáng)大的MySQL數(shù)據(jù)庫管理和開發(fā)工具,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 超詳細(xì)的mysql圖文安裝教程

    超詳細(xì)的mysql圖文安裝教程

    這篇文章主要為大家分享了一份超詳細(xì)的mysql圖文安裝教程,安裝步驟有詳細(xì)的說明,,需要的朋友可以參考下
    2016-05-05
  • mysql字符集和數(shù)據(jù)庫引擎修改方法分享

    mysql字符集和數(shù)據(jù)庫引擎修改方法分享

    使用虛擬主機(jī)空間上的phpmyadmin操作數(shù)據(jù)庫的時(shí)候,如果看到phpmyadmin首頁上顯示的MySQL 字符集為cp1252 West European (latin1),當(dāng)我們導(dǎo)入數(shù)據(jù)時(shí)就會(huì)出現(xiàn)亂碼
    2012-02-02
  • mysql導(dǎo)入sql文件報(bào)錯(cuò) ERROR 2013 2006 2002

    mysql導(dǎo)入sql文件報(bào)錯(cuò) ERROR 2013 2006 2002

    今天在做項(xiàng)目的時(shí)候遇到個(gè)問題,就是往mysql里導(dǎo)入sql文件的時(shí)候總是報(bào)ERROR 2013 2006 2002,研究了一番才找到解決辦法,這里記錄下來分享給大家
    2014-11-11
  • MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程詳解

    MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程詳解

    天天和數(shù)據(jù)庫打交道,一天能寫上幾十條 SQL 語句,但你知道系統(tǒng)是如何和數(shù)據(jù)庫交互的嗎?下面這篇文章主要給大家介紹了關(guān)于MySQL性能優(yōu)化之一條SQL在MySQL中執(zhí)行的過程的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論