SQLite 中的 AND 和 OR 是逻辑运算符,用于在 WHERE、HAVING 等子句中组合多个条件,实现更复杂的过滤逻辑。
基本语法
WHERE 条件1 AND 条件2 [AND 条件3 ...]
WHERE 条件1 OR 条件2 [OR 条件3 ...]
AND:所有条件都为真才返回该行OR:任一条件为真就返回该行
示例表结构
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer TEXT,
product TEXT,
amount REAL,
status TEXT, -- 'pending', 'paid', 'shipped', 'cancelled'
order_date DATE
);
INSERT INTO orders (customer, product, amount, status, order_date) VALUES
('Alice', 'Laptop', 1200.00, 'paid', '2025-10-15'),
('Bob', 'Mouse', 25.00, 'pending', '2025-11-01'),
('Alice', 'Keyboard',150.00, 'shipped', '2025-10-20'),
('Charlie','Monitor',400.00, 'paid', '2025-11-05'),
('Bob', 'Webcam', 80.00, 'cancelled','2025-10-25'),
('Alice', 'USB Cable',10.00,'shipped', '2025-11-06');
1. AND 运算符(且)
-- 查找 Alice 且金额 > 100 的订单
SELECT * FROM orders
WHERE customer = 'Alice' AND amount > 100;
结果:
id | customer | product | amount | status | order_date
1 | Alice | Laptop | 1200 | paid | 2025-10-15
3 | Alice | Keyboard | 150 | shipped | 2025-10-20
AND要求两个条件同时成立
2. OR 运算符(或)
-- 查找金额 > 500 或 已取消的订单
SELECT * FROM orders
WHERE amount > 500 OR status = 'cancelled';
结果:
1 | Alice | Laptop | 1200 | paid | 2025-10-15
5 | Bob | Webcam | 80 | cancelled | 2025-10-25
OR只要任一条件成立即可
3. AND 与 OR 组合(必须加括号!)
-- 查找:(Alice 或 Bob) 且 (状态为 paid 或 shipped)
SELECT * FROM orders
WHERE (customer = 'Alice' OR customer = 'Bob')
AND (status = 'paid' OR status = 'shipped');
结果:
1 | Alice | Laptop | 1200 | paid | 2025-10-15
3 | Alice | Keyboard | 150 | shipped | 2025-10-20
优先级:
AND>OR
不加括号会导致逻辑错误!
错误示例(常见陷阱)
-- 错误:意图是 (A或B)且C,但实际是 A且(C或B)
WHERE customer = 'Alice' OR customer = 'Bob' AND status = 'paid';
-- 相当于:customer = 'Alice' OR (customer = 'Bob' AND status = 'paid')
4. 多条件组合实战
-- 查找:
-- 1. 金额 ≥ 100
-- 2. 状态是 paid 或 shipped
-- 3. 订单日期在 2025年10月之后
SELECT customer, product, amount, status, order_date
FROM orders
WHERE amount >= 100
AND (status = 'paid' OR status = 'shipped')
AND order_date > '2025-10-01';
5. 与其他运算符配合
| 运算符 | 示例 |
|---|---|
IN + AND | WHERE customer IN ('Alice', 'Charlie') AND amount > 200 |
BETWEEN + OR | WHERE amount BETWEEN 50 AND 200 OR status = 'cancelled' |
LIKE + AND | WHERE product LIKE '%book%' AND customer = 'Alice' |
6. 逻辑真值表(SQLite 风格)
| 条件 A | 条件 B | A AND B | A OR B |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 |
| 0 | 0 | 0 | 0 |
| NULL | 1 | NULL | 1 |
| NULL | NULL | NULL | NULL |
NULL参与逻辑运算通常返回NULL(未知)
-- 查找 status 不是 cancelled 且 amount > 0 的订单
-- NULL 值不会被匹配!
WHERE status != 'cancelled' AND amount > 0;
7. 性能提示
- 为
WHERE中常用于AND/OR的列建立复合索引:
CREATE INDEX idx_cust_status ON orders(customer, status);
CREATE INDEX idx_status_amount ON orders(status, amount);
AND条件越多,过滤越精准,性能通常越好OR可能导致全表扫描,建议用UNION替代复杂OR
-- 替代复杂 OR
SELECT * FROM orders WHERE customer = 'Alice'
UNION
SELECT * FROM orders WHERE amount > 1000;
总结:AND vs OR
| 特性 | AND | OR |
|---|---|---|
| 条件要求 | 全部满足 | 任一满足 |
| 结果集 | 更小 | 更大 |
| 优先级 | 高 | 低(需括号) |
| 索引利用 | 更容易 | 较难 |
需要我帮你写一个针对你表结构的 AND/OR 查询吗?
请提供表名和字段,我可以生成精准语句!