🎯 本月只剩几天支持 SQLTest.online,帮助我们让 SQL 练习对每个人都免费。 今天捐赠 →
SQL 代码已复制到剪贴板

SQL WHERE 子句:在 SQL 查询中过滤数据

第 2.2 课 · 阅读时间:约 6 分钟 · 练习题 ↓

SQL WHERE 子句通过对每条记录计算一个条件来过滤表中的行:只返回条件为真的行。在本课中,你将学习比较运算符、BETWEEN、IN、LIKE 模式匹配,以及处理 NULL 值的正确方法。

单独使用 SELECT 语句会返回表中的所有行。在实际场景中,你通常只需要满足特定条件的一部分数据,而 WHERE 子句正是用来表达这些条件的。

SQL WHERE 子句:表中每一行都要与条件比较,只返回条件为 TRUE 的行;比较运算符、BETWEEN、IN、LIKE 和 IS NULL

什么是 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 来检查值是否缺失。

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

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