亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:99日期:2023-05-08 10:17:39
目錄
  • 前言
  • ORDER BY 語(yǔ)法
  • 實(shí)踐出真知
    • 實(shí)踐準(zhǔn)備
  • 靜態(tài)排序
    • 動(dòng)態(tài)排序
      • 總結(jié)

        前言

        工作中常常會(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 語(yǔ)法

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

        column代表一個(gè)列字段,ORDER BY可以允許多個(gè)字段進(jìn)行排序,當(dāng)字段后面顯式說(shuō)明是升序(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語(yǔ)句不會(huì)根據(jù)id的值變化字段id隨之變化。這類排序就是靜態(tài)排序。

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

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

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

        列1:

        SELECT * FROM orders ORDER BY id , create_date DESC 

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

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

        在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	ordersORDER BY `status` DESC, 	CASEWHEN `status` = 2 THEN	create_dateEND DESC, CASEWHEN `status` = 4 THEN	update_dateEND

        運(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	ordersORDER BYIF (`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_deletedFROM	ordersORDER BYIF (`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ù)庫(kù)獲取結(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 ordersORDER 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é)果出來(lái)以后再進(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)文章希望大家以后多多支持!

        標(biāo)簽: MySQL
        相關(guān)文章:
        主站蜘蛛池模板: 精品国产一区二区三区久久 | 一级毛片免费在线观看网站 | 全国精品影院 | 深夜欧美福利视频在线观看 | 九九热亚洲精品综合视频 | 综合图区亚洲 | 国产中文99视频在线观看 | 国产大学生一级毛片绿象 | 欧美日韩亚洲国产千人斩 | 国产美腿丝袜福利视频在线观看 | 日韩女同一区二区三区 | 欧美亚洲国产精品久久蜜芽 | 又硬又大又湿又紧a视频 | 一级做性色a爰片久久毛片免费 | 深夜你懂的在线网址入口 | 国产黄色免费观看 | 毛片自拍| 美国一级毛片免费视频观看 | 日韩小视频网站 | va毛片| 欧美三级大片在线观看 | 最新精品 | 国产麻豆入在线观看 | 国产精品久久久久久一区二区三区 | 国产精品久久新婚兰兰 | 丝袜足交在线播放 | 性生活免费大片 | 国产精品久久久久久久小唯西川 | 欧美成人亚洲欧美成人 | 91久久| 1024国产精品视频观看 | 国产a级男女性高爱潮片 | 女的被到爽的羞羞视频 | 日韩日韩日韩日韩 | 久久99精品久久久久久三级 | 亚洲欧美日韩国产精品久久 | 天天色天天碰 | 亚洲婷婷国产精品电影人久久 | 亚洲一级片在线观看 | 国产免费一级高清淫曰本片 | 综合色视频|