🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 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 NULLIS 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

在下一课中,我们将探讨如何 组合多个条件 以创建更强大的过滤器。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 识别长电影
  2. 按名称检索演员
  3. 通过商店ID检索员工
  4. 根据描述检索电影标题
  5. 识别活跃客户