日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL中order by中关于NULL值的排序问题

發布時間:2023/12/10 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL中order by中关于NULL值的排序问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL中order by 排序遇到NULL值的問題 MySQL數據庫,在order by排序的時候,如果存在NULL值,那么NULL是最小的,ASC正序排序的話,NULL值是在最前面的。 如果我們想讓NULL排在后面,讓非NULL的行排在前面該怎么做呢?


MySQL數據庫在設計的時候,如果字段允許NULL值,那么對該字段進行排序的時候需要注意那些值為NULL的行。


我們知道NULL的意思表示什么都不是,或者理解成“未知”也可以,它與任何值比較的結果都是false,


默認情況下,MySQL會認為NULL值比其他類型的數據小, 也就是說,在order by排序的時候,NULL是最小的,ASC正序排序的話,NULL值是在最前面的。 如果我們想讓NULL排在后面,讓非NULL的行排在前面該怎么做呢?


下面我們通過一個小例子,來說明這個情況。


首先,創建一個測試數據表 test_user,


mysql> create table test_user(

id int unsigned not null auto_increment,

username varchar(10) not null,

age int,

primary key (id))

engine=myisam default charset=utf8 ;

Query OK, 0 rows affected (0.14 sec)


填充6條數據,其中3條設置了age值,另外3條age值為NULL


mysql> insert into test_user values(1,'user1',28),(2,'user2',30);

Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0


mysql> insert into test_user(username) values('user3'),('user4'),('user5');

Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0


mysql> insert into test_user values(6,'user6',23);

Query OK, 1 row affected (0.00 sec)


mysql> select * from test_user;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 1 | user1 | 28 |

| 2 | user2 | 30 |

| 3 | user3 | NULL |

| 4 | user4 | NULL |

| 5 | user5 | NULL |

| 6 | user6 | 23 |

+----+-----------+------+ 6 rows in set (0.00 sec)


我們按照age字段從小到大排序,我們看到NULL值是最小的,排在了最前面


mysql> select * from test_user order by age;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 3 | user3 | NULL | | 4 | user4 | NULL |

| 5 | user5 | NULL |

| 6 | user6 | 23 |

| 1 | user1 | 28 |

| 2 | user2 | 30 |

+----+-----------+------+ 6 rows in set (0.00 sec)


按照age字段從大到小排序,我們看到NULL值確實是最小的,排在了最后面


mysql> select * from test_user order by age desc;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 2 | user2 | 30 |

| 1 | user1 | 28 |

| 6 | user6 | 23 |

| 3 | user3 | NULL |

| 4 | user4 | NULL |

| 5 | user5 | NULL |

+----+-----------+------+ 6 rows in set (0.00 sec)


這里有個需要注意的事項,就是NULL值本身是無法排序的,也就是說一個NULL是無法和另外一個NULL比較的。 你可能已經發現了,那三個NULL值的行,不管正序還是倒序,順序都是一致的,當然也可能不一致。


那如果在對age進行正序排序的時候,我們希望NULL值的記錄在最后面顯示,那該如何做呢?


1、重新生成一列,比如agenull,利用is null操作符,把NULL值的行變成1,非NULL值的行變成0,先對該字段排序,再對age排序


mysql> select *,age is null as agenull from test_user order by agenull,age; +----+-----------+------+---------+ | id | username | age | agenull | +----+-----------+------+---------+ | 6 | user6 | 23 | 0 | | 1 | user1 | 28 | 0 | | 2 | user2 | 30 | 0 | | 3 | user3 | NULL | 1 | | 4 | user4 | NULL | 1 | | 5 | user5 | NULL | 1 | +----+-----------+------+---------+ 6 rows in set (0.01 sec)


2、直接利用isnull函數對age列求值,跟第一種方法的道理是一樣的


mysql> select * from test_user order by isnull(age),age; +----+-----------+------+ | id | username | age | +----+-----------+------+ | 6 | user6 | 23 | | 1 | user1 | 28 | | 2 | user2 | 30 | | 3 | user3 | NULL | | 4 | user4 | NULL | | 5 | user5 | NULL | +----+-----------+------+ 6 rows in set (0.00 sec)


3、還可以利用MySQL中的一個小技巧,在字段前面加上一個負號,也就是減號,ASC改成DESC ,DESC改成ASC


mysql> select * from test_user order by -age desc; +----+-----------+------+ | id | username | age | +----+-----------+------+ | 6 | user6 | 23 | | 1 | user1 | 28 | | 2 | user2 | 30 | | 3 | user3 | NULL | | 4 | user4 | NULL | | 5 | user5 | NULL | +----+-----------+------+ 6 rows in set (0.00 sec)


所以,在設計數據庫的時候,如果某個字段要進行排序的話,最好不要為NULL。


來源:?http://www.th7.cn/db/mysql/201606/195206.shtml

來自為知筆記(Wiz)

轉載于:https://www.cnblogs.com/jeffen/p/6044764.html

總結

以上是生活随笔為你收集整理的MySQL中order by中关于NULL值的排序问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。