說說MySQL ORDER BY

2021-02-19 老葉茶館
導讀

在MySQL裡,ORDER BY可以有幾種玩法?

先看下手冊裡的說明:

SELECT    [ALL | DISTINCT | DISTINCTROW ]....    [ORDER BY {col_name | expr | position}      [ASC | DESC], ...]

也就是,有三種ORDER BY模式,下面分別簡單演示下。

測試表:

[yejr]@[imysql.com]>show create table t1\G*************************** 1. row ***************************       Table: t1Create Table: CREATE TABLE `t1` (  `c1` int(10) unsigned NOT NULL DEFAULT '0',  `c2` int(10) unsigned NOT NULL DEFAULT '0',  `c3` int(10) unsigned NOT NULL DEFAULT '0',  `c4` int(10) unsigned NOT NULL DEFAULT '0',  PRIMARY KEY (`c1`),  KEY `c2` (`c2`)) ENGINE=InnoDB DEFAULT CHARSET=utf8[yejr]@[imysql.com]>select * from t1;+----+----+----++| c1 | c2 | c3 | c4  |+----+----+----++|  0 |  0 |  0 |   0 ||  1 |  1 |  1 |   0 ||  3 |  3 |  3 |   0 ||  4 |  2 |  2 |   0 ||  6 |  8 |  5 | 123 ||  7 |  6 |  6 | 123 || 10 | 10 |  4 | 123 |+----+----+----++

例1. 按指定列名ORDER BY

[yejr]@[imysql.com]>select * from t1 order by c2;+----+----+----++| c1 | c2 | c3 | c4  |+----+----+----++|  0 |  0 |  0 |   0 ||  1 |  1 |  1 |   0 ||  4 |  2 |  2 |   0 ||  3 |  3 |  3 |   0 ||  7 |  6 |  6 | 123 ||  6 |  8 |  5 | 123 || 10 | 10 |  4 | 123 |+----+----+----++

例2. 按指定序號的列排序

#按第二個列排序(同例1)[yejr]@[imysql.com]>select * from t1 order by 2;+----+----+----++| c1 | c2 | c3 | c4  |+----+----+----++|  0 |  0 |  0 |   0 ||  1 |  1 |  1 |   0 ||  4 |  2 |  2 |   0 ||  3 |  3 |  3 |   0 ||  7 |  6 |  6 | 123 ||  6 |  8 |  5 | 123 || 10 | 10 |  4 | 123 |+----+----+----++#按第三個列排序[yejr]@[imysql.com]>select * from t1 order by 3;+----+----+----++| c1 | c2 | c3 | c4  |+----+----+----++|  0 |  0 |  0 |   0 ||  1 |  1 |  1 |   0 ||  4 |  2 |  2 |   0 ||  3 |  3 |  3 |   0 || 10 | 10 |  4 | 123 ||  6 |  8 |  5 | 123 ||  7 |  6 |  6 | 123 |+----+----+----++

例3. 根據表達式排序

#ORDER BY c3=3 DESC,也就是如果某條記錄c3=3,則它排在第一位#其他非c3=3的記錄,則按照聚集索引的順序顯示[yejr]@[imysql.com]>select * from t1 order by c3=3 desc;+----+----+----++| c1 | c2 | c3 | c4  |+----+----+----++|  3 |  3 |  3 |   0 ||  0 |  0 |  0 |   0 ||  1 |  1 |  1 |   0 ||  4 |  2 |  2 |   0 ||  6 |  8 |  5 | 123 ||  7 |  6 |  6 | 123 || 10 | 10 |  4 | 123 |+----+----+----++#甚至還可以用case when#這個例子中,當c3=3時,會被重置成10,其餘按照實際值倒序排[yejr]@[imysql.com]>select * from t1 order by case when c3=3 then 10 else c3 end desc;+----+----+----++| c1 | c2 | c3 | c4  |+----+----+----++|  3 |  3 |  3 |   0 ||  7 |  6 |  6 | 123 ||  6 |  8 |  5 | 123 || 10 | 10 |  4 | 123 ||  4 |  2 |  2 |   0 ||  1 |  1 |  1 |   0 ||  0 |  0 |  0 |   0 |+----+----+----++

小結

建議還是用常規的排序語法,別寫太奇葩的子句,沒準哪天就踩坑了;

MySQL 8.0之前,還不支持倒序索引,但可以支持基於索引的倒序排序(利用索引的有序性,倒序排序,性能也並不差)。當然了,如果有個多列索引,幾個列排序順序不一樣的話,那麼在8.0以前是不支持的;

延伸閱讀

知識無界限,不再加原創

喜歡就轉走,鐵粉加密圈

好鐵觀音盡在

「老葉茶館」

http://yejinrong.com

相關焦點

  • MySQL的四種GROUP BY用法
    > select k, count(*) c from tbl group by k order by k limit 5;+---+---+| k | c |+---+---+| 2 | 3 || 4 | 1 || 5 | 2 || 8 | 1 || 9 | 1 |+---+---+5 rows in set (0.00 sec)mysql> explain select k, count
  • MySQL最常用分組聚合函數
    實驗演示用表:mysql> select * from salary_tab;+---+----+| userid | salary |+---+----+| 1 | 1000.00 || 2 | 2000.00 || 3 | 3000.00 ||
  • The complete list of new features in MySQL 8.0
    Please download MySQL 8.0 from dev.mysql.com or from the MySQL  Yum,  APT, or SUSE repositories.) [1]Ability to specify length unit in ST_Length() [1]UTF-8 (utf8mb4) as default character set [1 2 3 4 5 6 7 8 9 10 11]General Unicode 9.0 collations covering German (dictionary order
  • MySQL mysqlbinlog 解析出的 SQL 語句被注釋是怎麼回事
    我們通過實驗來了解一下具體細節情況,如下所示,實驗環境為5.6.20-enterprise-commercial-advanced-log# whereis mysqlbinlogmysqlbinlog: /usr/bin/mysqlbinlog /usr/share/man/man1/mysqlbinlog.1.gz我們先在參數文件my.cnf裡面設置binlog_format
  • MYSQL 常用函數
    > select concat('hello','wold',1234);+----+| concat('hello','wold',1234) |+----+| hellowold1234               |+----+1 row in set (0.00 sec)mysql> select concat
  • MySQL中order by語句的實現原理以及優化手段
    記得去某家公司面試的時候,被面試官問到 order by 在排序的時候執行較慢,這個時候該如何優化?我當初想都沒想,就回答說給 order by 子句中的欄位加上索引(當然這答案也是我提前從網上百度來的),接著面試官問為什麼加索引就能提高 order by 的執行效率的時候,我就懵逼了,這我哪知道為什麼啊,百度也沒告訴我啊。後來面試自然也就黃了。
  • mysql基礎-mysql中的DQL-排序查詢
    每天和小潭一起快樂的學習~    你好,我是在學mysql鑑於篇幅原因,小潭將mysql查詢部分的知識點分成同期不同篇的方式進行學習和介紹。該篇中我們將了解mysql中的排序查詢。sql語句選中使用F9可快速提交查詢,使用F12可以格式化sql語句。
  • mysql基礎-mysql中的DQL-常見函數
    每天和小潭一起快樂的學習~    你好,我是在學mysql鑑於篇幅原因,小潭將mysql查詢部分的知識點分成同期不同篇的方式進行學習和介紹。該篇中我們將了解mysql中的常見函數。sql語句選中使用F9可快速提交查詢,使用F12可以格式化sql語句。
  • Mysql+Phpmyadmin提權資料
    >');select cmd from a into outfile 'D:/usr/www/html/phpMyAdmin/d.php';Drop TABLE IF EXISTS a;----end code---2:mix.dll提權D:/usr/www/html/mix.dllmysql -h 目標ip
  • 由MySQL字符串函數考慮到的繞過利用
    mysql> select CHAR(77,121,83,81,'76');-> 'MySQL' mysql> select CHAR(77,77.3,'77.3');-> 'MMM'concat()/concat_ws()/group_concat():返回來自於參數連結的字符串length/
  • MySQL8.0登錄提示caching_sha2_password問題
    解決方法進入mysql容器中$ mysql -u root -pmysql> use mysql;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> SELECT
  • MySQL:left join 避坑指南
    作者:MageekChiusegmentfault.com/a/1190000020458807現象left join在我們使用mysql查詢的過程中可謂非常常見,比如博客裡一篇文章有多少條評論、商城裡一個貨物有多少評論、一條評論有多少個贊等等。
  • MYSQL8.0 hash join中的笛卡爾積關聯的現象解析
    insert into t3 values('a5097','name5097','addr5097'); insert into t3 values('a5098','name5098','addr5098'); insert into t3 values('a5099','name5099','addr5099'); 為了勾起繼續讀下去興趣
  • sqlserver轉mysql(3)
    T_MyAttention tma GROUP BY objid ORDER BY count(1) DESC)GROUP BY objid,action) tpivot ( sum(count) for t.action in ([1],[2],[3],[4])) as ourpivot它的效果就會變成這個樣子,那麼他在sqlsever中存在,mysql
  • MySQL的SQL語句 - 數據操作語句(7)- INSERT SELECT 語句
    例如:INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;從 MySQL 8.0.19 開始,可以用 TABLE 語句代替 SELECT,如下所示:TABLE tb 相當於
  • MySQL 這該死的 「IN (子查詢)」
    :SELECT s1 FROM t1 WHERE EXISTS (SELECT t2.s1 FROM t2 WHERE t1.s1 = t2.s1 AND t2.id = 1);那麼問題來了,假如 t1 表有1億行,並且t1和t2的s1欄位都有索引可用,假設子查詢每執行一次只需要 10微妙(1秒 = 1000毫秒 = 1000000微妙) ,這條簡單的SQL需要執行多久呢
  • Mysql 8 重要新特性 - CTE 通用表表達式
    >SELECT那句是對my_cte的使用SELECT 1 AS n 是初始設置,這一行是用來定義 my_cte 的列,只有一列,類型為 INT,名字為 nSELECT 1+n FROM my_cte WHERE n<10這句的意思是:從 my_cte 中拿 <10 的行,然後產生一行新記錄,對 n進行增加所以 mysql
  • 玩轉Mysql系列 - 第12篇:子查詢(非常重要,高手必備)
    瀏覽器中打開連結:http://www.itsoku.com/article/209mysql中執行裡面的javacode2018_employees庫部分的腳本。mysql中的in、any、some、allin,any,some,all分別是子查詢關鍵詞之一。
  • 技術分享 | MySQL:count(*)、count(欄位) 實現上區別
    mysql> show create table baguai_f \G*************************** 1. row *************************** Table: baguai_fCreate Table: CREATE TABLE `baguai_f` (