空值与三值逻辑
NULL 表示哪几种含义?
- 未知值: 确实存在但当前不知道的值;
- 不适用的值: 该属性对这一行本来就没有意义;
- 保留值: 有意留空、暂不填写的值;
NULL 参与运算会得到什么结果?
- 算术运算: 任何含 NULL 的算术表达式结果仍为 NULL;
- 比较运算: 任何与 NULL 的比较结果都不是 TRUE 或 FALSE, 而是 UNKNOWN;
- 原因: NULL 不代表某个具体值, 无法与它比大小或判等;
三值逻辑是什么?
| 取值 | 含义 |
|---|---|
| TRUE | 条件成立 |
| FALSE | 条件不成立 |
| UNKNOWN | 目前无法判断真假的中间态 |
- 来源: NULL 参与比较时产生;
- 过滤行为: WHERE 只保留条件为 TRUE 的元组, 条件为 FALSE 或 UNKNOWN 的元组都会被过滤;
- 易错点:
x <> 5对x IS NULL的行不成立, 需要显式写IS NULL;
聚集与分组遇到 NULL 怎么处理?
- 聚集: NULL 被聚集操作忽略, 相关结论见 重复与聚集;
- 分组: NULL 在分组时作为一般取值看待, 见 分组与 HAVING;
(source: 050-sql.md §简单查询/§空值/§布尔值)