NULL概念
公司的DBA强制规定在创建表时,表中所有的字段必须都是NOT NULL,并根据业务需要给出默认值。
这个规定起初让开发人员有点难受,针对部分业务场景下的字段需要额外多做判断,但是慢慢的大家也适应了。
那么MySQL中NULL值是怎样的存在,要特殊对待呢?
很多人将NULL值类比为空字符串'',其实两者是完全不同的两个概念。
•
NULL值,表示未知的状态
。•
空字符'',表示一个确定的状态,是一个长度为0的字符串
。• 例如student的name字段如果为NULL,表明当前id下我们不知道名字。
• 如果name=='',表明我们知道当前id下没有名字。
NULL操作
上图中与NULL值进行的比较操作,包含NULL值的函数操作都返回NULL,即都为不确定,不为真。
那么在我们日常的SQL中就不能将这些操作应用到NULL上。例如,我们要查找课程号为NULL的数据:
使用
select * from student where classId = NULL;
是查不到数据的。因为
classId = NULL
返回的NULL,where 语句只有返回true才会返回符合条件的数据。
- • MySQL提供了
IS NULL
和IS NOT NULL
两个运算符和IFNULL()
函数来帮助处理NULL。
-
• 当字段中存在NULL值时,使用一些
聚合函数
需要注意,例如COUNT()、MIN()、SUM()会`忽略NULL值
student表中的数据总条数为7,但是count(classId)忽略掉了NULL值。
• 当使用DISTINCT、GROUP BY或 时ORDER BY,
所有 NULL值都被视为相等
。-
• 当使用时
ORDER BY
, NULL值会首先显示,如果指定DESC按降序排序,则值会最后显示。
•
NULL对使用索引查询效率的影响
:因为NULL值未知,无法使用比较操作,可能导致索引无法过滤数据,而查询最后不走索引。
在查询中使用IS NULL 或者 IS NOT NULL作为查询条件
,可以让索引得到利用。例如:
select * from student where classId = 102
变成select * from student where classId is not null and classId = 102
;• 在MySQL中的
记录结构
中,会使用额外空间
存储那些可能为NULL值的字段,因此带来空间上的开销。
NULL值在MySQL中的特殊性,需要开发人员在了解其特性的情况下正确使用
,避免调入NULL值的陷阱,导致不必要的错误。
为此DBA直接强制字段NOT NULL,保持一致的表结构设计规则。