1.排序问题
在sql中,升序的时候null会被默认排在最前面。工作中有null这种数据的时候,有时候的需求是不管是升序还是降序都排到最后。 mysql 可以这样处理:
排到最后:select * from student order by IF(ISNULL(score),1,0), score asc
排到最前面:SELECT *student ORDER BY IF(ISNULL(score),0,1), score DESC
ORACLE、SQL Server、DB2等数据库:
SELECT * from student ORDER BY score NULLS LAST ----(排在最前面nulls first)
2.null会引发索引失效???
以下索引失效大家都知道吧
- 联合索引不满足最左匹配原则。
- 模糊查询最前面的为不确定匹配字符。
- 索引列参与了运算。
- 索引列使用了函数。
- 索引列存在类型转换。
这次主要通过explain分析字段为null的情况,因此不代表绝对的实际查询走的逻辑,(sql版本为8.0.23):
-
条件 is null 的时候 没有失效(但是当null值足够多的时候没有走索引了,测试数据90%是null)
2.索引列使用 is not null 查询和上面一样的和null占比有关,null数据很少的时候也不会走索引。
3.大于小于查询,也和null值占比有关,不同的数据使用explain 分析得出得结果不一样
4.等于的时候分析出来是走了索引的
总结:在查询null值的时候,可能会因为null占比的问题,走索引和从全盘扫描,可能全盘扫描效率更高。!=,not in也是类似的。因此得出不是null让索引失效了,只是搜索引擎认为全盘扫描效率更高一点。
3.统计行数的时候,如果使用count(fieldName)话,当某行的fieldName 等于null的时候这行不会统计
4.select distinct score from student2; 使用distinct的时候如果字段中有null的将不会查出来
5.使用!= 、>、<、not in、in 这些符号的时候null也不会查出来
如果还要把null查出来的话就加上or is null 吧