课程 2.2 使用 WHERE 子句过滤数据
SELECT 语句本身返回表中的所有行。然而,在现实场景中,您通常只需要满足特定条件的数据子集。这就是 WHERE 子句的用武之地。
什么是 WHERE 子句?
WHERE 子句用于过滤记录。它确保只有满足指定条件的行被包含在结果集中。
基本语法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
条件是一个表达式,其结果为真、假或未知(如果涉及 NULL 值)。只有条件评估为 真 的行才会被返回。
比较运算符
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 |
示例 (Sakila 数据库)
要从 film 表中查找租金为 $4.99 的电影:
SELECT title, rental_rate, replacement_cost
FROM film
WHERE rental_rate = 4.99;
特殊过滤运算符
SQL 包含强大的运算符用于范围、集合和模式匹配。
1. BETWEEN
过滤在某个范围内的值(包含边界)。
-- 查找金额在 $5.00 和 $10.00 之间的付款
SELECT payment_id, amount, payment_date
FROM payment
WHERE amount BETWEEN 5.00 AND 10.00;
2. IN
匹配指定列表中的任何值。
-- 查找来自特定商店的客户
SELECT first_name, last_name, store_id
FROM customer
WHERE store_id IN (1, 2);
3. LIKE
使用通配符在列中搜索指定模式:
%代表零个、一个或多个字符。_代表一个字符。
示例 (Sakila 数据库)
-- 查找以 'A' 开头的电影
SELECT title
FROM film
WHERE title LIKE 'A%';
-- 查找第二个字母为 'I' 的电影
SELECT title
FROM film
WHERE title LIKE '_I%';
陷阱:过滤 NULL 值
正如我们在关于 NULL 的课程中所学,您不能使用 = 或 <> 来检查 NULL。您必须使用 IS NULL 或 IS NOT NULL。
示例 (Sakila 数据库)
-- 错误
-- WHERE return_date = NULL
-- 正确
SELECT rental_id, rental_date, return_date
FROM rental
WHERE return_date IS NULL;
本课的关键要点:
WHERE子句在行被返回到结果集之前过滤行。- 字符串和日期值必须用单引号括起来(例如,
'SMITH')。 - 数值不需要引号。
- 使用
LIKE进行模式匹配,使用IN进行列表匹配。 - 绝不要 将
=与NULL一起使用;始终使用IS NULL。
在下一课中,我们将探讨如何 组合多个条件 以创建更强大的过滤器。