SQLite Where 子句

SQLite 的 WHERE 子句 用于过滤查询结果,只返回满足指定条件的行。它可用于 SELECTUPDATEDELETE 等语句。


基本语法

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 NULLWHERE stock IS NULL判断空值
IS NOT NULLWHERE 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. 范围条件:BETWEENIN

-- 价格在 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. 模糊匹配:LIKEGLOB

-- 名称包含 "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 语句或字段说明!

文章已创建 2305

发表回复

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

相关文章

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

返回顶部