WHERE 子句用于过滤行,只返回满足条件的那些行。它是检索特定数据(而非整张表)的基础,并支持一组丰富的运算符和条件。
使用运算符进行基本过滤
sql
users age ;
users country ;
users age active ;
users country country ;
users active;
WHERE 子句用于过滤行,只返回满足条件的那些行。它是检索特定数据(而非整张表)的基础,并支持一组丰富的运算符和条件。
users age ;
users country ;
users age active ;
users country country ;
users active;
条件使用比较运算符,并通过 AND/OR/NOT 进行组合(在复杂条件中使用括号来控制优先级)。
-- BETWEEN — a range (inclusive)
WHERE age BETWEEN 18 AND 65
-- IN — match any value in a list
WHERE country IN ('US', 'CA', 'UK')
-- LIKE — pattern matching (% = any chars, _ = one char)
WHERE name LIKE 'A%' -- starts with A
WHERE email LIKE '%@gmail.com' -- ends with @gmail.com
WHERE code LIKE '_X_' -- exactly 3 chars with X in the middle
BETWEEN(范围)、IN(值列表)和 LIKE(使用 %/_ 通配符进行模式匹配)能够简洁地处理常见的过滤需求。
-- ❌ WRONG — you CANNOT compare to NULL with = (NULL is "unknown")
WHERE email = NULL -- returns NOTHING (never true)
-- ✅ use IS NULL / IS NOT NULL
WHERE email IS NULL
WHERE email IS NOT NULL
关键点: NULL 表示“未知”,你无法用 = 来与它比较(email = NULL 永远不为真)。你必须使用 IS NULL/IS NOT NULL——这是一个常见的错误。
WHERE conditions on INDEXED columns are fast; on un-indexed columns the database
must scan every row. For frequently-filtered columns, add an index.
Also: functions on a column (WHERE UPPER(name) = 'X') can prevent index use.
WHERE 子句是查询的基础——它是你检索特定数据(而非整张表)的方式,几乎每个真实查询都需要它,因此理解它是必备的日常知识。
了解这些运算符(比较运算符、具有正确优先级的 AND/OR/NOT)以及实用的特殊运算符(用于范围的 BETWEEN、用于值列表的 IN、用于模式匹配的 LIKE)涵盖了各类过滤需求。
一个尤为重要且常被弄错的要点是 NULL 处理:因为 NULL 意味着“未知”,你不能用 = 来与它比较(一个常见的 bug 是 WHERE col = NULL 会悄无声息地返回空结果),必须改用 IS NULL/IS NOT NULL——理解这一点可以避免一个常见且令人困惑的错误。
了解性能关联同样很有价值:对已建索引的列进行过滤很快,而未建索引的列则需要扫描每一行(因此频繁过滤的列会从索引中受益),并且在 WHERE 中对列使用函数会妨碍索引的使用。
由于用 WHERE 过滤数据是最常见的数据库操作之一,并且由于理解运算符、NULL 处理(一个常见陷阱)以及索引/性能影响是编写正确、高效查询的基础,掌握 WHERE 子句是使用 SQL 时核心的、必知的知识。