SQLite NULL 值

SQLite 中的 NULL 表示缺失或未知的值,不是空字符串 ''0。它是 SQL 三值逻辑(TRUEFALSEUNKNOWN)的核心。


1. NULL 的基本特性

特性说明
不是值NULL''(空字符串)
NULL0
任何运算返回 NULLNULL + 5NULL
'abc' || NULLNULL
比较结果为 UNKNOWNcol = NULLUNKNOWN(不是 FALSE
必须用 IS NULL 判断WHERE col IS NULL
-- 示例表
CREATE TABLE products (
    id INTEGER PRIMARY KEY,
    name TEXT,
    price REAL,
    stock INTEGER,
    description TEXT  -- 可为空
);

INSERT INTO products VALUES
(1, 'Laptop', 1200.00, 50, '15-inch display'),
(2, 'Mouse', 25.00, 200, NULL),
(3, 'Keyboard', 80.00, NULL, 'Mechanical'),
(4, 'Monitor', 350.00, 0, NULL);

2. 插入 NULL

-- 显式插入
INSERT INTO products (name, price, stock) VALUES ('Webcam', 90, NULL);

-- 省略列 = NULL(若无 DEFAULT)
INSERT INTO products (name, price) VALUES ('USB Hub', 45);

3. 查询 NULL 值

-- 查找 description 为空的商品
SELECT name FROM products WHERE description IS NULL;

-- 查找 stock 不为空的商品
SELECT name FROM products WHERE stock IS NOT NULL;

错误写法(永远不成立):

WHERE description = NULL   -- 返回 UNKNOWN

4. NULL 在聚合函数中的行为

函数对 NULL 的处理
COUNT(*)统计所有行
COUNT(col)跳过 NULL
SUM() / AVG()跳过 NULL
MAX() / MIN()跳过 NULL
-- 统计有库存的商品数量
SELECT COUNT(stock) AS in_stock_count FROM products;
-- 结果: 3(跳过 Keyboard 的 NULL)

5. NULL 排序规则

  • ASCNULL 排在最前
  • DESCNULL 排在最后
-- 让 NULL 排在最后(即使 DESC)
SELECT name, stock FROM products
ORDER BY stock DESC NULLS LAST;

SQLite 3.30.0+ 支持 NULLS FIRST/LAST


6. 处理 NULL:COALESCEIFNULL

函数说明示例
COALESCE(val1, val2, ...)返回第一个非 NULL 值COALESCE(description, 'No desc')
IFNULL(val, replacement)仅两个参数IFNULL(stock, 0)
-- 显示库存,缺货显示 0
SELECT name, IFNULL(stock, 0) AS display_stock FROM products;

-- 显示描述,无描述显示默认文本
SELECT name, COALESCE(description, 'Not available') AS info FROM products;

7. NULL 在逻辑表达式中

ABA AND BA OR B
1NULLNULL1
0NULL0NULL
NULLNULLNULLNULL
-- 查找 price > 100 且 stock > 0 的商品
-- 如果 stock 是 NULL,条件为 UNKNOWN → 不返回该行
WHERE price > 100 AND stock > 0

8. 约束与 NULL

约束是否允许 NULL
NOT NULL不允许
UNIQUE允许多个 NULL(SQLite 特性)
PRIMARY KEY不允许(隐式 NOT NULL
CREATE TABLE users (
    email TEXT UNIQUE  -- 允许多个 NULL
);
INSERT INTO users VALUES (NULL), (NULL);  -- 成功!

9. 实战示例

-- 1. 查找缺货或无描述的商品
SELECT name FROM products 
WHERE stock = 0 OR description IS NULL;

-- 2. 统计平均价格(排除 NULL)
SELECT ROUND(AVG(price), 2) AS avg_price FROM products;

-- 3. 导出 CSV 时替换 NULL
SELECT 
    name,
    COALESCE(description, ''),
    IFNULL(stock, 0) AS stock
FROM products;

10. 最佳实践

建议说明
IS NULL / IS NOT NULL不要用 = NULL
COALESCE 提供默认值提升可读性
聚合时注意 COUNT(col) vs COUNT(*)避免误统计
关键字段加 NOT NULL防止意外 NULL
导出数据时处理 NULL避免空值问题

快速参考

操作正确写法
判断 NULLcol IS NULL
判断非 NULLcol IS NOT NULL
替换 NULLCOALESCE(col, 'default')
统计非 NULL 行数COUNT(col)
排序 NULL 最后ORDER BY col DESC NULLS LAST

需要我帮你检查或修复表中的 NULL 问题吗?
请贴出 CREATE TABLE 或想处理的查询!

文章已创建 2305

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部