SQLite 的 WHERE 子句 用于过滤查询结果,只返回满足指定条件的行。它可用于 SELECT、UPDATE、DELETE 等语句。
基本语法
WHERE 表达式
表达式可以是:
- 比较运算
- 逻辑组合
- 函数调用
- 子查询
- 模式匹配
示例表结构
CREATE TABLE products (
id INTEGER PRIMARY KEY,
name TEXT,
category TEXT,
price REAL,
stock INTEGER,
discontinued INTEGER DEFAULT 0, -- 1=下架
created_at DATE
);
-- 插入测试数据
INSERT INTO products (name, category, price, stock, discontinued, created_at) VALUES
('iPhone 15', 'Electronics', 999.99, 50, 0, '2023-09-22'),
('T-Shirt', 'Clothing', 19.99, 200, 0, '2024-01-15'),
('Laptop Stand', 'Electronics', 45.50, 0, 0, '2023-12-01'),
('Coffee Mug', 'Home', 12.99, 150, 1, '2022-06-10'),
('Jeans', 'Clothing', 59.99, 80, 0, '2024-03-20');
1. 基本比较条件
| 运算符 | 示例 | 说明 |
|---|---|---|
= | WHERE category = 'Clothing' | 精确匹配 |
!= / <> | WHERE discontinued != 1 | 不等于 |
> / < / >= / <= | WHERE price > 50 | 数值比较 |
IS NULL | WHERE stock IS NULL | 判断空值 |
IS NOT NULL | WHERE name IS NOT NULL | 非空 |
-- 查找价格 ≥ 50 且有库存的在售商品
SELECT name, price, stock
FROM products
WHERE price >= 50 AND stock > 0 AND discontinued = 0;
2. 逻辑运算符组合
-- 电子产品 或 服装,且价格 < 100
WHERE (category = 'Electronics' OR category = 'Clothing')
AND price < 100
建议使用括号明确优先级:
NOT>AND>OR
3. 范围条件:BETWEEN 和 IN
-- 价格在 20 ~ 60 之间
WHERE price BETWEEN 20 AND 60
-- 类别是 Clothing 或 Home
WHERE category IN ('Clothing', 'Home')
等价写法:
WHERE price >= 20 AND price <= 60
WHERE category = 'Clothing' OR category = 'Home'
4. 模糊匹配:LIKE 和 GLOB
-- 名称包含 "phone"(不区分大小写)
WHERE name LIKE '%phone%'
-- 名称以 "i" 开头
WHERE name LIKE 'i%'
-- 名称正好 6 个字符,且第3个是 'f'
WHERE name LIKE '__f___'
GLOB(区分大小写,使用 * 和 ?)
WHERE name GLOB 'L*' -- 以大写 L 开头
5. 空值处理:IS NULL / COALESCE
-- 库存为空的商品
WHERE stock IS NULL
-- 库存为 0 或 NULL 都视为缺货
WHERE COALESCE(stock, 0) = 0
6. 日期时间条件
-- 2024年创建的商品
WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'
-- 或者使用函数
WHERE STRFTIME('%Y', created_at) = '2024'
7. 子查询在 WHERE 中
-- 价格高于平均价的商品
WHERE price > (SELECT AVG(price) FROM products)
-- 库存低于同类平均库存的商品
WHERE stock < (
SELECT AVG(stock)
FROM products p2
WHERE p2.category = products.category
)
8. 存在性检查:EXISTS
-- 有订单的商品(假设有 orders 表)
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.product_id = products.id
)
9. 复合条件实战示例
-- 查找:服装类、在售、有库存、价格 20~100、名称包含 "T" 或 "J"
SELECT * FROM products
WHERE category = 'Clothing'
AND discontinued = 0
AND stock > 0
AND price BETWEEN 20 AND 100
AND (name LIKE '%T%' OR name LIKE '%J%');
10. WHERE 在其他语句中使用
UPDATE
UPDATE products
SET price = price * 0.9
WHERE category = 'Electronics' AND created_at < '2024-01-01';
DELETE
DELETE FROM products
WHERE discontinued = 1 AND stock = 0;
性能优化建议
| 建议 | 说明 |
|---|---|
为 WHERE 中频繁使用的列建索引 | CREATE INDEX idx_cat_price ON products(category, price); |
| 避免在列上使用函数 | 差:WHERE UPPER(name) = 'IPHONE'好: WHERE name = 'iPhone' OR name = 'iphone' |
使用 EXPLAIN QUERY PLAN 检查执行计划 |
常见错误
-- 错误:NULL 不能用 =
WHERE stock = NULL -- 永远不成立!
-- 正确:
WHERE stock IS NULL
-- 错误:字符串忘记引号
WHERE category = Electronics
-- 正确:
WHERE category = 'Electronics'
快速参考表
| 条件类型 | 语法示例 |
|---|---|
| 等于 | col = 'value' |
| 范围 | col BETWEEN a AND b |
| 列表 | col IN (1,2,3) |
| 模糊 | col LIKE '%abc%' |
| 空值 | col IS NULL |
| 逻辑 | col1 > 10 AND (col2 = 'X' OR col3 < 5) |
| 子查询 | col > (SELECT ...) |
需要我根据你的表结构写 WHERE 查询吗?
请提供 CREATE TABLE 语句或字段说明!