sql-where-clause
SQL - WHERE 子句
Section titled “SQL - WHERE 子句”SQL WHERE 子句
Section titled “SQL WHERE 子句”SQL WHERE 子句是该语言最基本、最强大的部分之一。它用于过滤记录并仅提取满足指定条件的记录。它与数据操作语言(DML)语句(如 SELECT、UPDATE 和 DELETE)一起使用,以指定应受影响的行。
基本语法是将 WHERE 子句放在 FROM 子句(在 SELECT 中)或表名(在 UPDATE / DELETE 中)之后。
SELECT column1, column2, ...FROM table_nameWHERE 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 employeesWHERE department = 'Engineering';
-- UPDATE:将“销售”部门所有员工的工资提高10%。UPDATE employeesSET salary = salary * 1.10WHERE department = 'Sales';
-- DELETE:删除指定ID的员工。DELETE FROM employeesWHERE employee_id = 3;关键:除非您打算修改或删除表中的每一行,否则永远不要忘记在 UPDATE 或 DELETE 语句上使用 WHERE 子句。这是一个常见且具有破坏性的错误。
比较运算符和逻辑运算符
Section titled “比较运算符和逻辑运算符”您可以使用各种运算符构建复杂的条件。
- 比较运算符:
=、!=或<>、>、<、>=、<= - 范围运算符:
BETWEEN ... AND ...(包含) - 逻辑运算符:
AND、OR、NOT
示例:组合运算符
Section titled “示例:组合运算符”查找“工程”部门中薪资超过 $86,000 的所有员工,或在 2022 年雇佣的任何员工。请注意使用括号来控制操作顺序(AND 在 OR 之前评估)。
SELECT first_name, department, salary, hire_date FROM employeesWHERE (department = 'Engineering' AND salary > 86000) OR hire_date BETWEEN '2022-01-01' AND '2022-12-31';| 名 | 部门 | 薪水 | 雇佣日期 |
|---|---|---|---|
| Alice | Engineering | 90000.00 | 2020-03-15 |
| Diana | Sales | 79200.00 | 2022-05-30 |
IN 和 NOT IN 运算符
Section titled “IN 和 NOT IN 运算符”IN 运算符提供了一种简洁的方式来检查值是否与列表中的任何值匹配。它通常比多个 OR 条件更具可读性。
-- 查找HR或销售部门的员工。SELECT first_name, department FROM employeesWHERE department IN ('HR', 'Sales');使用 NOT IN 与 NULL 的陷阱
Section titled “使用 NOT IN 与 NULL 的陷阱”当使用 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 进行模式匹配
Section titled “使用 LIKE 进行模式匹配”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 值
Section titled “处理 NULL 值”NULL 表示缺失或未知的值。您不能使用标准比较运算符(如 = 或 !=)来测试 NULL。您必须使用 IS NULL 或 IS NOT NULL。
-- 这是不正确的,不会返回任何行。SELECT * FROM employees WHERE salary = NULL;
-- 这是查找薪水未知的员工的正确方法。SELECT * FROM employees WHERE salary IS NULL;