Skip to content

SQLite - AND 和 OR 子句

AND 和 OR 运算符是在 WHERE 子句中使用的连接运算符,用于根据多个条件过滤数据。它们是构建强大而精确查询的基础。

AND 运算符仅在所有指定条件都评估为 true 时才返回一行。它通过添加连续的要求来缩小搜索范围。

SELECT column_list
FROM table_name
WHERE [condition1] AND [condition2] AND ... [conditionN];

使用我们的 employees 表,我们来查找所有年龄大于 25 岁并且在 ‘Sales’ 部门工作的员工。

SELECT * FROM employees WHERE age > 25 AND department = 'Sales';
id | name | age | address | salary
---|------|-----|------------|--------
1 | Paul | 32 | California | 50000.0

此查询仅返回 ‘Paul’,因为他是唯一同时满足这两个条件的员工。

OR 运算符在任何指定条件评估为 true 时返回一行。它通过包含符合多个条件中任意一个的行来扩大搜索范围。

SELECT column_list
FROM table_name
WHERE [condition1] OR [condition2] OR ... [conditionN];

我们来查找所有年龄大于 30 岁或者薪资大于 60000.00 的员工。

SELECT * FROM employees WHERE age > 30 OR salary > 60000;
id | name | age | address | salary
---|------|-----|------------|--------
1 | Paul | 32 | California | 50000.0
4 | Mark | 25 | Rich-Mond | 65000.0
5 | David| 27 | Texas | 85000.0

‘Paul’ 被包含进来是因为他的年龄超过 30 岁。‘Mark’ 和 ‘David’ 被包含进来是因为他们的薪资超过 60000,即使他们的年龄没有超过 30 岁。

最佳实践:使用括号组合 AND 和 OR

Section titled “最佳实践:使用括号组合 AND 和 OR”

常见的 Bug 来源是误解运算符优先级。SQLite 在评估 OR 运算符之前会评估 AND 运算符。为了确保您的逻辑正确执行并提高可读性,请始终使用括号 () 来明确分组您的条件。

假设您想查找所有来自 ‘Texas’ 或 ‘California’ 且年龄大于 25 岁的员工。没有括号,查询是模糊的。

-- Incorrect and ambiguous query
SELECT * FROM employees WHERE address = 'Texas' OR address = 'California' AND age > 25;

正确的写法是分组 OR 条件:

-- Correct and clear query
SELECT * FROM employees
WHERE (address = 'Texas' OR address = 'California') AND age > 25;
id | name | age | address | salary
---|------|-----|------------|--------
1 | Paul | 32 | California | 50000.0
5 | David| 27 | Texas | 85000.0

使用括号消除了所有歧义,并确保您的查询行为完全符合预期。