null 表示未知值或其缺失。但是没有价值并不意味着没有问题。
首先,当处理 null 值时,所有不同的DBMS的行为可能会有所不同(取决于SQL方言或体系结构)。但是我将专注于这个主题中的共同模式。让我们看看典型的障碍和根据两种主要情况(数据建模和查询数据)处理的典型障碍和方法。
数据建模
任何数据存储都始于数据建模。了解 null 值如何影响您的数据库设计将是有用的。
- 主键唯一地标识了表中的每个记录,并且不能包含 null 值。
- 当外键是 null 值时,请避免情况。这可能会导致表之间的关系破裂。您可以避免设置而不是null 约束。
- 并非所有DBMS都将 null 视为唯一值。因此,最好避免唯一的约束在列中可能具有 null 值。
- 通过列的分区可能具有 null 值的列可能会导致数据分布不均匀,从而降低了分区的益处。您可能会在 bucketing /聚类过程中遇到类似的问题。
查询数据
- 通常,涉及 null 的任何算术操作都将导致 null 。例如,120- null = null 。
- 当比较值可能包含 nulls 时,请小心。 null = null 不是真的, null <> null 也不是。相反,您应该使用是null 或不是null 运算符来检查 null value。
- 汇总函数通常忽略 null 值。但是,使用 count 函数counts null 值使用 count(*)。
- 逻辑操作涉及 null 值可能导致 null 。
- 当您 filter 包含 nulls 的列中的值时,您可能会丢失一些重要数据。例如,您有一个带有列名称和城市的桌子,您想从纽约和华盛顿以外的所有城市中选择所有名称。使用 City不在(“纽约”,“华盛顿”)将导致行变成行,而 null 城市丢失。
- 当您内联接表如果两个联接列包含一个空值,则该行将不包含在结果集中。
经典处理方法
处理的一般方法 null 值包括:
- 使用 colesce (或类似于dbms)的列可能具有 null 值。
- 使用是null 或不是null 用于比较操作。
- 使用外部JON 或在比较可能包含 null 值的列时使用coce处理联合子句。
- 创建单元测试和质量指标用于您的数据。
- 更多实验。知识是由实践带来的。