SQLite AND/OR 运算符

SQLite 中的 ANDOR逻辑运算符,用于在 WHEREHAVING 等子句中组合多个条件,实现更复杂的过滤逻辑。


基本语法

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 + ANDWHERE customer IN ('Alice', 'Charlie') AND amount > 200
BETWEEN + ORWHERE amount BETWEEN 50 AND 200 OR status = 'cancelled'
LIKE + ANDWHERE product LIKE '%book%' AND customer = 'Alice'

6. 逻辑真值表(SQLite 风格)

条件 A条件 BA AND BA OR B
1111
1001
0101
0000
NULL1NULL1
NULLNULLNULLNULL

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

特性ANDOR
条件要求全部满足任一满足
结果集更小更大
优先级低(需括号)
索引利用更容易较难

需要我帮你写一个针对你表结构的 AND/OR 查询吗?
请提供表名和字段,我可以生成精准语句!

文章已创建 2305

发表回复

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

相关文章

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

返回顶部