给字段排序时遇到的null值问题
当我们使用
order by
来为指定的字段进行排序时,如果db中该字段的值存在着null值,那么在排序时这些null值会不会参与排序呢?如果参与排序的话,又是以怎样的标准来排序?
在不同的DB中,对于null值的默认值不同。
在
PostgreSQL
中,null值默认最大
如果对一个学生表里的数据按照age字段进行顺序排序,如下:
select * from student order by age
如果name字段存在null值,那么这条sql的结果集就如下所示:
|id|student|age|
|1|小明|10|
|2|小红|12|
|3|小黑|null|
|4|小白|null|
因为null值默认是最大,所以在升序排列中null值的记录就会被排到最后。同样地,如果是降序排列,null值记录就会被排到最前面。
在
Oracle
中,null值默认最大
Oracle中同样认为null值最大,也就是说,升序排列时null值默认排在最后;降序排列时null值默认排在最前。
在
MySQL
和
SQLServer
中,null值默认最小
MySQL和SQLServer则相反,null值默认是最小。当升序排列时null值默认排在最前;降序排列时null值默认排在最后。
在实际的业务中,null值参与的排序这可能会造成一些不必要的问题,有时候甚至会造成一个bug并且难以被发现。
所以,在对这些有可能存在null值的字段进行排序时需要注意使用关键字
nulls last/first
。
nulls last/first
的具体用法
我们可以通过
nulls last
或者
nulls first
关键字来指定这些null值的record是排在最后还是最前,如下:
select * from student order by age desc nulls last;
该语句指定了降序排列时,null值排到最后;需要注意的是,该关键字只能搭配order by来使用。一共也就四种用法:
-
order by [asc] nulls first
-
order by [asc] nulls last
-
order by desc nulls first
-
order by desc nulls last
如果想了解更多关于db中的这些null值,可以看看下边的链接:
-
mysql 空值排序问题
-
PostgreSQL 数据库NULL值的默认排序行为与查询、索引定义规范 - nulls first\last, asc\desc
查询结果中有
NULL
值
,当进行升序
排序
时,
NULL
值
默认为“最大
值
”,排在最后面。要想改变
NULL
值
的显示顺序,只需要在
SQL
语句后面加上
NULLS
FIRST(排在前面),
NULLS
LAST(排在后面)。
转载自:https://blog.csdn.net/NextAction/article/details/62048536
值
,它们也会相应地被升序排列或降序排列;
值
,并控制其排在最前面还是最后面。
值
排到最前面或者最后面(像 Oracle 那样),否则你就得添加一个辅助列。辅助列(只存在于查询语句里,而不存在于表中)的目的是,让你能够识别出。根据你希望的
排序
方式(以及你所使用的数据库管理系统如何处理。表的 COMM 列对查询结果进行
排序
,但该字段可能为。这样一来,你就能在不影响非。
值
都放到最后面,那么你就要使用。
值
排序
问题
),你能够对可能为。的列进行升序排列或者降序排列。返回的
值
,你就能在不影响。
值
,例如,你可能想把非。
我们可以在
排序
添加加上 is
null
这个在加
排序
条件 空
值
就会排在后面,其他正常
排序
SELECT * FROM insure ORDER BY update_
如 select * from tableTest order by VISITS desc
将原来的
sql
语句改写为:select * from tableTest order by VISITS desc
nulls
last,"
nulls
last"控制将空
值
记录放在后面,当然,你...
在
排序
时,我们可能会遇到
排序
字段为
null
的情况,但是又需要该
null
数据(即不能限制该字段is not
null
),而一般情况下我们都希望非
null
数据在前面。我们来看下这两种情况:
升序
排序
(默认
排序
)时,
null
默认会放在最后面,当然如果我们需要
null
在前面,可以这样:ORDER BY tn_time ASC
NULLS
FIRST
降序时,
null
默认会放在最前面,我们可以使用 ORDER BY tn_time DESC
NULLS
LAST 将
null
放到最后面。
参考:https://b
7 rows selected.
2.不加“关照”的order by降序
排序
效果–
NULL
值
在前。
sec@ora10g> select * from t order...
关于in和exists的使用
1.当父查询结果集小于子查询结果集则选择exists,如果父查询结果集大于子查询结果集选择in。(可尝试等价改写)
in和exists都有子查询优化,提升子查询,有时候这两的执行计划一样。需要注意的是如果子查询包含了父查询里面的条件,in不会被优化。
2.in里面的
值
一般不超过100个
3.单表postgre
sql
的in和个数关系不大,都可以走索引。
4.当有连表并且...
<select id="selectScoreInfo" resultType="java.util.Map" parameterType="java.util.Map">
select DZShare.T_Y_SBBHDEVICE_SITE.* ,
ROUND(DZShare.T_Y_SCORE.actual_score ,2) as actual_score ,
ROUND(DZShare.T_Y_SCORE.total_score ...
处理方法:case语法
...order by if(IS
NULL
(age),1,0);
相当于创建新列,
值
是
null
时为1,
值
不是
null
时为0,先对新列
排序
再
对age列
排序
,这样
null
就变成了最大
值
asc时,
nulls
last为默认
desc时,
nulls
first为默认
from OADocument t order by t.addtime desc
nulls
last