电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

關于MySQL的ORDER BY排序詳解

瀏覽:170日期:2023-05-08 10:17:39
目錄
  • 前言
  • ORDER BY 語法
  • 實踐出真知
    • 實踐準備
  • 靜態排序
    • 動態排序
      • 總結

        前言

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

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

        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 "創建時間",  `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "修改時間",  `status` tinyint(2) NOT NULL DEFAULT "1" COMMENT "狀態",  `is_deleted` bit(1) NOT NULL DEFAULT b"0" COMMENT "是否刪除",  PRIMARY KEY (`id`)) ENGINE=InnoDB

        表里存放著9條數據

        靜態排序

        所謂靜態排序就是ORDER BY后面排序的字段是固定不變的,不會根據排序字段的值的變化而變化。

        舉個栗子:

        SELECT * FROM orders ORDER BY id

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

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

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

        舉個栗子說明一下:

        列1:

        SELECT * FROM orders ORDER BY id , create_date DESC 

        運行結果如下:

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

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

        列2:

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

        運行結果:

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

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

        動態排序

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

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

        • CASE WHEN 動態排序
        SELECT	*FROM	ordersORDER BY `status` DESC, 	CASEWHEN `status` = 2 THEN	create_dateEND DESC, CASEWHEN `status` = 4 THEN	update_dateEND

        運行結果如下:

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

        • IF 動態排序

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

        SELECT	*FROM	ordersORDER BYIF (`status` = 3, "0", "1"), `status`, create_date DESC

        運行結果:

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

        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

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

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

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

        SELECT `status` , id ,CONCAT(`status` , id) FROM ordersORDER BY	CONCAT(`status`, id) DESC

        結果:

        總結

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

        到此這篇關于關于MySQL的ORDER BY排序詳解的文章就介紹到這了,更多相關MySQL的ORDER BY排序內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

        標簽: MySQL
        相關文章:
        主站蜘蛛池模板: 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 谷梁科技 | 砂磨机_立式纳米砂磨机_实验室砂磨机-广州儒佳化工设备厂家 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 北京成考网-北京成人高考网| 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 大立教育官网-一级建造师培训-二级建造师培训-造价工程师-安全工程师-监理工程师考试培训 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 永嘉县奥阳陶瓷阀门有限公司| 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | FAG轴承,苏州FAG轴承,德国FAG轴承-恩梯必传动设备(苏州)有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 地磅-地秤-江阴/无锡地磅-江阴天亿计量设备有限公司_ | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 |