SQL WHERE 子句:在 SQL 查询中过滤数据
第 2.2 课 · 阅读时间:约 6 分钟 · 练习题 ↓
SQL WHERE 子句通过对每条记录计算一个条件来过滤表中的行:只返回条件为真的行。在本课中,你将学习比较运算符、BETWEEN、IN、LIKE 模式匹配,以及处理 NULL 值的正确方法。
单独使用 SELECT 语句会返回表中的所有行。在实际场景中,你通常只需要满足特定条件的一部分数据,而 WHERE 子句正是用来表达这些条件的。
什么是 SQL WHERE 子句?
WHERE 子句在记录返回到结果集之前对其进行过滤,确保只包含满足指定条件的行。
基本语法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
条件是一个表达式,其结果为真、假或未知(涉及 NULL 值时)。只返回条件为真的行。
WHERE 中的 SQL 比较运算符
SQL 提供了一组在 WHERE 子句中比较列值的运算符:
| 运算符 | 说明 | 示例 |
|---|---|---|
= | 等于 | WHERE last_name = 'SMITH' |
<> 或 != | 不等于 | WHERE store_id <> 1 |
> | 大于 | WHERE rental_rate > 2.99 |
< | 小于 | WHERE length < 60 |
>= | 大于或等于 | WHERE replacement_cost >= 20.00 |
<= | 小于或等于 | WHERE amount <= 5.00 |
SELECT title, rental_rate, replacement_cost
FROM film
WHERE rental_rate = 4.99;
结果:租金恰好为 4.99 美元的所有电影。
SQL BETWEEN、IN 和 LIKE 运算符
SQL 提供了按范围、集合和模式过滤的强大运算符。
BETWEEN:范围过滤
过滤某个范围内的值(包含两端)。
SELECT payment_id, amount, payment_date
FROM payment
WHERE amount BETWEEN 5.00 AND 10.00;
结果:金额在 5.00 到 10.00 美元之间(含两端)的付款。
IN:匹配列表
匹配指定列表中的任意一个值,比多个 OR 条件更简洁。
SELECT first_name, last_name, store_id
FROM customer
WHERE store_id IN (1, 2);
结果:属于 1 号或 2 号门店的客户。
LIKE:模式匹配
使用通配符在文本列中查找模式:
%:零个、一个或多个字符。_:恰好一个字符。
-- Films whose title starts with 'A'
SELECT title
FROM film
WHERE title LIKE 'A%';
-- Films where the second letter is 'I'
SELECT title
FROM film
WHERE title LIKE '_I%';
如何在 SQL 中过滤 NULL 值
不能用 = 或 <> 来检查 NULL:这些比较总是返回未知,永远不会返回真。必须使用 IS NULL 或 IS NOT NULL。
-- Wrong: this returns no rows
-- WHERE return_date = NULL
-- Correct
SELECT rental_id, rental_date, return_date
FROM rental
WHERE return_date IS NULL;
结果:所有尚未归还的租赁记录。
要点:
WHERE子句在行返回到结果集之前对其进行过滤。- 字符串和日期值必须用单引号括起来(例如
'SMITH'),数值不需要引号。 BETWEEN包含两端:BETWEEN 5 AND 10包括 5 和 10。IN是多个OR条件的简洁替代写法。- 用
LIKE进行模式匹配:%表示任意字符序列,_表示单个字符。 - 永远不要用
=比较NULL,始终使用IS NULL或IS NOT NULL。
常见问题
SQL 中 WHERE 和 HAVING 有什么区别?
WHERE 在分组和聚合之前过滤行。HAVING 在之后过滤,它作用于 GROUP BY 的结果。用 WHERE 过滤单独的行,用 HAVING 过滤聚合后的组。
WHERE 子句中可以使用多个条件吗?
可以。用 AND(两个条件都必须为真)、OR(任一条件为真即可)或 NOT(取反)组合条件。还可以用括号控制求值顺序。
为什么 WHERE column = NULL 不返回任何结果?
因为 NULL 表示未知的值:用 = 把任何值与 NULL 比较,结果总是未知,既不是真也不是假。SQL 要求使用 IS NULL 或 IS NOT NULL 来检查值是否缺失。