Skip to content

sql-and-or-clauses

SQL 中的 AND 和 OR 运算符是复杂数据筛选的基础。它们在 WHERE 子句中用于组合多个条件,使你能够创建精确且功能强大的查询。

让我们为所有示例使用一个 customers 示例表:

CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age INT NOT NULL,
city VARCHAR(25),
salary DECIMAL(18, 2)
);
INSERT INTO customers VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

如果由 AND 分隔的所有条件都为 TRUE,AND 运算符就会显示一条记录。它用于缩小搜索结果范围。

SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;

让我们查找居住在“孟买”并且薪水大于 6000 的客户。

SELECT id, name, city, salary
FROM customers
WHERE city = 'Mumbai' AND salary > 6000;

此查询只返回“Chaitali”,因为她是唯一一个满足这两个条件的客户。

IDNAMECITYSALARY
4ChaitaliMumbai6500.00

如果由 OR 分隔的任何条件为 TRUE,OR 运算符就会显示一条记录。它用于扩大搜索结果范围。

SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;

示例:查找来自 Kota 或 Delhi 的客户

Section titled “示例:查找来自 Kota 或 Delhi 的客户”

让我们查找居住在“Kota”或“Delhi”的客户。

SELECT id, name, city
FROM customers
WHERE city = 'Kota' OR city = 'Delhi';

这将返回“Khilan”(来自 Delhi)和“Kaushik”(来自 Kota)。

IDNAMECITY
2KhilanDelhi
3KaushikKota

当你在同一个查询中组合 AND 和 OR 时,你必须控制操作的顺序。SQL 在 OR 之前评估 AND。为了确保你的逻辑正确且易读,请始终使用括号 () 来分组你的条件。

示例:查找来自大城市的年轻客户

Section titled “示例:查找来自大城市的年轻客户”

我们想查找年龄小于 25 岁并且居住在“孟买”或“德里”的客户。

SELECT id, name, age, city
FROM customers
WHERE age < 25 AND (city = 'Mumbai' OR city = 'Delhi');

如果没有括号,查询 WHERE age < 25 AND city = 'Mumbai' OR city = 'Delhi' 将被解释为 (age < 25 AND city = 'Mumbai') OR city = 'Delhi',这是一个不同的问题,会产生不同的结果。括号是必不可少的。

IDNAMEAGECITY

注意:在我们的示例数据中,没有 25 岁以下的人居住在孟买或德里,因此结果为空。如果“Khilan”是 24 岁,他将出现在这里。

在 UPDATE 和 DELETE 语句中使用 AND/OR

Section titled “在 UPDATE 和 DELETE 语句中使用 AND/OR”

这些运算符对于修改数据和查询数据同样重要。

给年龄大于 30 岁并且居住在“Ahmedabad”的客户涨工资。

UPDATE customers
SET salary = salary * 1.10 -- 涨薪 10%
WHERE age > 30 AND city = 'Ahmedabad';

删除年龄小于 23 岁或薪水小于 1600 的客户记录。

DELETE FROM customers
WHERE age < 23 OR salary < 1600;
**安全提示:** 在运行 `UPDATE` 或 `DELETE` 之前,始终使用相同的 `WHERE` 子句运行 `SELECT *` 来确认你正在操作正确的行。
  • 使用括号: 在混合使用 AND 和 OR 时,始终使用括号以避免歧义。
  • 对 OR 条件使用 IN: 对于同一列上的多个 OR 条件,IN 运算符更简洁,通常性能更好。WHERE city = 'Kota' OR city = 'Delhi' 可以改写为 WHERE city IN ('Kota', 'Delhi')。
  • 索引: WHERE 子句中的条件可以从数据库索引中受益匪浅。对两个索引列使用 AND 通常非常快。两个不同列之间的 OR 可能会慢得多,因为数据库可能无法有效利用索引。