mysql order by 排序技巧

2021-09-26 07:35:26 字數 2217 閱讀 3246

首先我們新建表test,如下:

create table `test` (

`id` int(11) not null auto_increment,

`name` varchar(255) default null,

primary key (`id`)

) engine=innodb auto_increment=7 default charset=utf8;

插入對應的資料如下:

1.當 order by 中欄位存在為null的字段時排序

asc 會將null 排在最前面 ,desc會將null排在最後面 ,這時如果我們想根據自己的想法在asc時將null排在最後或者在desc時將null排在最前方 我們可以如下操作:

select * from `test` order by name is null,name;

或select * from `test` order by isnull(name),name;

這裡的name is null 起到了乙個隱藏排序的作用,具體我們看下即可理解了

select isnull(name),t.* from test t;
查詢結果如下:

到這大家應該都清楚了,isnull 當為對應的資料為null時 返回1,不為null時返回0,所以在上面實現了乙個隱藏排序。

2.當我們需要排序的字串為純數字的時候,我們希望通過數值的大小進行排序的時候,有時候我們會發現一些奇怪的問題,如下:

select * from test order by isnull(name),name;
返回結果:

我們明明時按照name排序的,但是結果為什麼是這樣的呢? 這是由於mysql對字串進行排序的時候 先按最左邊的開始排序然後在一位一位比下去,所以就導致了如下現象的發生了。這時如果我們想按照我們最初的想法取實現排序,我們可以通過如下方案實現:

(1)在name前加--

(2)在name排序時新增 +0操作

**如下

select * from test order by isnull(name),--name;

或select * from test order by isnull(name),name+0;

或select * from test order by isnull(name),name*0;

結果如下:

這樣也就得到了我們想要的結果,這其中呢 *0 或者 +0 都是將name中的字段 從 varchar 轉換成 int 型別 然後就可以正常排序了

3.按日期排序,忽略年份

select date, description from table_name order by month(date),dayofmonth(date);
注意:單純使用dayofyear來排序會導致錯誤,如2-29與非閏年的3-1日同等級

4.排序點分式ip

select ip from table_name order by inet_aton(ip);
或者在設計表時就使用 int unsigned 來表示ip。

5.將某列中特定值排在最前

例如想把表中lulu的名字排在最前顯示,其他按字母排序

select name from table_name order by if(name='lulu',0,1),name ;
也可以把if的條件根據需要換成相應的語句。

由上我們可以看出,在進行order操作的時候 其實我們可以配合使用函式,邏輯判斷等一些特殊手段來實現我們的需求,函式還有很多,例如substring_index\cast\field\substring 等,在這裡就不一一枚舉了。

mysql order by 排序索引

接手別人的 遇到乙個客戶需求,說介面查詢較慢,需要進行優化。後面通過列印執行時間定位到是某一句sql執行較慢。sql如下 select from t base alarm tba where1 1and tba.rule type 1order by alarm status asc end ts ...

Mysql order by 多欄位排序

降序desc 由大到小 公升序asc 由小到大 mysql單個字段降序排序 select from table order by id desc mysql單個字段公升序排序 select from table order by id asc mysql多個字段排序 select from tabl...

mysql order by 排序的問題

參考部落格 mysql order by 的排序在今天時候遇到了問題 情景是 將排序的字段設定成varchar型別了,然後排序時候並沒有按從大到小的順序 按照圖中的順序應該是正序,9排在最上邊,但是實際上是666排在最上邊 解決辦法之一 實際情況是先按最左邊的開始排序然後在一位一位比下去,這裡在寫s...