mysql数据库order by语句 null 处理
2016-06-03 11:05
471 查看
转自:http://blog.csdn.net/oxcow/article/details/6554168
order by 语句对null字段的默认排序
在使用order by语句进行查询结果排序时,不同的数据库对于被排序字段数据行为null的情况,处理方式有所不同,这里我们主要考虑oracle和MySQL数据库。
首先我们直接给出结论:
leeyee 写道
【Oracle 结论】
order by colum asc 时,null默认被放在最后
order by colum desc 时,null默认被放在最前
nulls first 时,强制null放在最前,不为null的按声明顺序[asc|desc]进行排序
nulls last 时,强制null放在最后,不为null的按声明顺序[asc|desc]进行排序
【MySql 结论】
order by colum asc 时,null默认被放在最前
order by colum desc 时,null默认被放在最后
ORDER BY IF(ISNULL(update_date),0,1) null被强制放在最前,不为null的按声明顺序[asc|desc]进行排序
ORDER BY IF(ISNULL(update_date),1,0) null被强制放在最后,不为null的按声明顺序[asc|desc]进行排序
注:以上结果是在oracle11g及mysql5下的测试结果。
因此当我们在order by时,为了强制说明对于null的排序顺序就必须使用到:
针对【oracle】我们就需要使用以下语法:
[sql] view
plain copy
order by order_col [asc|desc] nulls [first|last]
而针对【mysql】我们则需要使用以下语法:
[sql] view
plain copy
order by IF(ISNULL(my_field),1,0),my_field;
下面在oracle11g下做个测试:
测试数据:
【无排序/默认排序】
[sql] view
plain copy
select update_date from table_name ;
leeyee 写道
[结果]
1 18-6月 -11
2
3 20-6月 -11
【asc排序】
[sql] view
plain copy
select update_date from table_name order by update_date;
leeyee 写道
[结果]
1 20-6月 -11
2 18-6月 -11
3
【desc排序】
[sql] view
plain copy
select update_date from table_name order by update_date desc;
leeyee 写道
[结果]
1
2 18-6月 -11
3 20-6月 -11
【asc排序,强制null放在最前】
[sql] view
plain copy
select update_date from table_name order by update_date nulls first;
leeyee 写道
[结果]
1
2 20-6月 -11
3 18-6月 -11
【asc排序,强制null放在最后】
[sql] view
plain copy
select update_date from table_name order by update_date nulls last;
leeyee 写道
[结果]
1 20-6月 -11
2 18-6月 -11
3
mysql5.0测试
[sql] view
plain copy
select update_date from table_name order by IF(ISNULL(update_date),0,1),update_date;
order by 语句对null字段的默认排序
在使用order by语句进行查询结果排序时,不同的数据库对于被排序字段数据行为null的情况,处理方式有所不同,这里我们主要考虑oracle和MySQL数据库。
首先我们直接给出结论:
leeyee 写道
【Oracle 结论】
order by colum asc 时,null默认被放在最后
order by colum desc 时,null默认被放在最前
nulls first 时,强制null放在最前,不为null的按声明顺序[asc|desc]进行排序
nulls last 时,强制null放在最后,不为null的按声明顺序[asc|desc]进行排序
【MySql 结论】
order by colum asc 时,null默认被放在最前
order by colum desc 时,null默认被放在最后
ORDER BY IF(ISNULL(update_date),0,1) null被强制放在最前,不为null的按声明顺序[asc|desc]进行排序
ORDER BY IF(ISNULL(update_date),1,0) null被强制放在最后,不为null的按声明顺序[asc|desc]进行排序
注:以上结果是在oracle11g及mysql5下的测试结果。
因此当我们在order by时,为了强制说明对于null的排序顺序就必须使用到:
针对【oracle】我们就需要使用以下语法:
[sql] view
plain copy
order by order_col [asc|desc] nulls [first|last]
而针对【mysql】我们则需要使用以下语法:
[sql] view
plain copy
order by IF(ISNULL(my_field),1,0),my_field;
下面在oracle11g下做个测试:
测试数据:
rownum | create_date | update_date |
1 | 20-3月 -11 | 18-6月 -11 |
2 | 20-4月 -11 | |
3 | 20-5月 -11 | 20-6月 -11 |
[sql] view
plain copy
select update_date from table_name ;
leeyee 写道
[结果]
1 18-6月 -11
2
3 20-6月 -11
【asc排序】
[sql] view
plain copy
select update_date from table_name order by update_date;
leeyee 写道
[结果]
1 20-6月 -11
2 18-6月 -11
3
【desc排序】
[sql] view
plain copy
select update_date from table_name order by update_date desc;
leeyee 写道
[结果]
1
2 18-6月 -11
3 20-6月 -11
【asc排序,强制null放在最前】
[sql] view
plain copy
select update_date from table_name order by update_date nulls first;
leeyee 写道
[结果]
1
2 20-6月 -11
3 18-6月 -11
【asc排序,强制null放在最后】
[sql] view
plain copy
select update_date from table_name order by update_date nulls last;
leeyee 写道
[结果]
1 20-6月 -11
2 18-6月 -11
3
mysql5.0测试
[sql] view
plain copy
select update_date from table_name order by IF(ISNULL(update_date),0,1),update_date;
相关文章推荐
- 14.2.1 MySQL and the ACID Model
- 14.2.1 MySQL and the ACID Model
- 14.2.1 MySQL and the ACID Model
- MySQL主从复制原理
- mysql The InnoDB memory heap is disabled 问题决解
- 关系型数据库之Mysql引擎-日志-用户管理(三)
- MySQL UPDATE与REPLACE差异
- MySQL数据慢优化
- 从一个MySQL left join优化的例子加深对查询计划的理解
- mysql的审计功能
- mysql自身运行日志文件详解
- Postfix+Courier-Authlib+MySQL+Webmail搭建邮件服
- ubuntu mysql
- Mysql数据库调优和性能优化的21条最佳实践
- mysql自定义函数random_str,产生随机字符串
- Ubuntu の MySQL 数据库服务配置和远程连接使用教程
- Mysql判断表字段或索引是否存在
- 21条最佳MySQL性能优化
- MySQL5.6.24的安装配置,配图
- mysql ERROR 1044 (42000): Access denied for user '