Skip to content

sql-where-clause

SQL WHERE 子句是该语言最基本、最强大的部分之一。它用于过滤记录并仅提取满足指定条件的记录。它与数据操作语言(DML)语句(如 SELECT、UPDATE 和 DELETE)一起使用,以指定应受影响的行。

基本语法是将 WHERE 子句放在 FROM 子句(在 SELECT 中)或表名(在 UPDATE / DELETE 中)之后。

SELECT column1, column2, ...
FROM table_name
WHERE condition;

让我们为我们的示例设置一个示例表。

CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
department VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE
);
INSERT INTO employees VALUES
(1, 'Alice', 'Smith', 'Engineering', 90000, '2020-03-15'),
(2, 'Bob', 'Johnson', 'Engineering', 85000, '2021-07-22'),
(3, 'Charlie', 'Brown', 'HR', 65000, '2019-01-10'),
(4, 'Diana', 'Prince', 'Sales', 72000, '2022-05-30'),
(5, 'Ethan', 'Hunt', 'Sales', NULL, '2023-11-01');

在 SELECT、UPDATE 和 DELETE 中使用 WHERE

Section titled “在 SELECT、UPDATE 和 DELETE 中使用 WHERE”

WHERE 子句对于有针对性的数据操作至关重要。

-- SELECT:获取“工程”部门的所有员工。
SELECT first_name, last_name, salary FROM employees
WHERE department = 'Engineering';
-- UPDATE:将“销售”部门所有员工的工资提高10%。
UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';
-- DELETE:删除指定ID的员工。
DELETE FROM employees
WHERE employee_id = 3;

关键:除非您打算修改或删除表中的每一行,否则永远不要忘记在 UPDATE 或 DELETE 语句上使用 WHERE 子句。这是一个常见且具有破坏性的错误。

您可以使用各种运算符构建复杂的条件。

  • 比较运算符:=、!= 或 <>、>、<、>=、<=
  • 范围运算符:BETWEEN ... AND ...(包含)
  • 逻辑运算符:AND、OR、NOT

查找“工程”部门中薪资超过 $86,000 的所有员工,或在 2022 年雇佣的任何员工。请注意使用括号来控制操作顺序(AND 在 OR 之前评估)。

SELECT first_name, department, salary, hire_date FROM employees
WHERE (department = 'Engineering' AND salary > 86000)
OR hire_date BETWEEN '2022-01-01' AND '2022-12-31';
名部门薪水雇佣日期
AliceEngineering90000.002020-03-15
DianaSales79200.002022-05-30

IN 运算符提供了一种简洁的方式来检查值是否与列表中的任何值匹配。它通常比多个 OR 条件更具可读性。

-- 查找HR或销售部门的员工。
SELECT first_name, department FROM employees
WHERE department IN ('HR', 'Sales');

当使用 NOT IN 和可能返回 NULL 值的子查询时,请务必小心。与 NULL 的比较既不为真也不为假,而是“未知”。这可能导致意外的空结果集。

-- 如果任何员工的薪水为 NULL,这可能不会返回您期望的结果。
SELECT * FROM employees WHERE employee_id NOT IN (SELECT employee_id FROM employees WHERE salary IS NULL);
-- 更安全的替代方法通常是使用 NOT EXISTS。
SELECT * FROM employees e1 WHERE NOT EXISTS (SELECT 1 FROM employees e2 WHERE e2.salary IS NULL AND e1.employee_id = e2.employee_id);

LIKE 运算符用于字符串模式匹配。它使用两个主要的通配符:

  • %(百分号):表示零个、一个或多个字符。
  • _(下划线):表示单个字符。
-- 查找姓氏以“S”开头的员工。
SELECT * FROM employees WHERE last_name LIKE 'S%';
-- 查找姓氏以“n”结尾的员工。
SELECT * FROM employees WHERE last_name LIKE '%n';
-- 查找名字第二个字母是“o”的员工。
SELECT * FROM employees WHERE first_name LIKE '_o%';

NULL 表示缺失或未知的值。您不能使用标准比较运算符(如 = 或 !=)来测试 NULL。您必须使用 IS NULL 或 IS NOT NULL。

-- 这是不正确的,不会返回任何行。
SELECT * FROM employees WHERE salary = NULL;
-- 这是查找薪水未知的员工的正确方法。
SELECT * FROM employees WHERE salary IS NULL;