SQLite NULL 值
在 SQLite 中,
NULL是一种特殊值,表示 “未知” 或 “不存在”。它与0、''(空字符串)或FALSE并不相同。SQLite 提供了一些操作和函数来处理NULL值。
1. NULL 值的特点
NULL不是 0 或''(空字符串)。- 任何 涉及
NULL的计算结果都是NULL,比如:
SELECT NULL + 10; -- 结果是 NULL
SELECT NULL || 'text'; -- 结果是 NULL
NULL在比较时具有特殊行为,例如:
SELECT NULL = NULL; -- 结果是 NULL(不是 TRUE 或 FALSE)
SELECT NULL <> NULL; -- 结果是 NULL
2. NULL 值的插入
示例:创建表并插入 NULL
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25);
INSERT INTO users (id, name, age) VALUES (2, 'Bob', NULL);
INSERT INTO users (id, name, age) VALUES (3, NULL, 30);
这里:
Bob的age是NULL。第三行的name是NULL。
3. NULL 的比较
(1) 不能用 = 直接判断 NULL
错误示例:
SELECT * FROM users WHERE age = NULL;
这个查询不会返回任何结果,因为 NULL = NULL 不是 TRUE,而是 NULL。
(2) IS NULL & IS NOT NULL
正确的判断方式:
SELECT * FROM users WHERE age IS NULL; -- 查询 age 为 NULL 的行
SELECT * FROM users WHERE name IS NOT NULL; -- 查询 name 不为 NULL 的行
4. 处理 NULL 的函数
SQLite 提供了一些函数来处理 NULL 值。
(1) IFNULL():如果是 NULL,则返回默认值
SELECT name, IFNULL(age, 0) AS age FROM users;
如果 age 为 NULL,则返回 0,否则返回原始值。
(2) COALESCE():返回第一个非 NULL 值
SELECT name, COALESCE(age, 18, 20) AS age FROM users;
COALESCE(age, 18, 20):如果age是NULL,返回18,否则返回age。
(3) NULLIF():如果两个值相等,则返回 NULL
SELECT NULLIF(age, 30) FROM users;
- 如果
age是30,则返回NULL,否则返回age。
5. NULL 与 ORDER BY
NULL默认排序在最前:
SELECT * FROM users ORDER BY age;
- 让
NULL排在最后:
SELECT * FROM users ORDER BY age ASC NULLS LAST;
- 让
NULL排在最前:
SELECT * FROM users ORDER BY age DESC NULLS FIRST;
6. NULL 在 GROUP BY 和 HAVING 里的表现
GROUP BY视NULL为独立组:
SELECT age, COUNT(*) FROM users GROUP BY age;
NULL作为一组,单独计数。HAVING需要IS NULL判断:
SELECT age, COUNT(*) FROM users GROUP BY age HAVING age IS NULL;
7. NULL 在 JOIN 里的问题
如果 NULL 参与 JOIN,可能导致数据丢失:
SELECT * FROM users
LEFT JOIN orders ON users.id = orders.user_id;
- 如果
orders.user_id是NULL,则不会匹配。 - 解决方案:用
IFNULL()提供默认值。
总结
| 操作 | 说明 |
|---|---|
IS NULL | 判断值是否为 NULL |
IS NOT NULL | 判断值是否 不为 NULL |
IFNULL(x, y) | 如果 x 是 NULL,返回 y |
COALESCE(x, y, z, ...) | 返回第一个非 NULL 值 |
NULLIF(x, y) | 如果 x = y,返回 NULL,否则返回 x |
ORDER BY ... NULLS LAST/FIRST | 控制 NULL 在排序中的位置 |
更多详细内容请关注其他相关文章。