0Pricing
SQL Academy · 课时

WHERE 过滤器:比较与逻辑运算符

使用 =、<>、 、AND、OR、NOT 过滤行,并理解运算符优先级和括号的作用。

WHERE 过滤器:比较与逻辑运算符 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

WHERE 的作用

WHERE 会在分组或聚合之前筛选行。只有谓词为 TRUE 的行才会返回。

比较运算符

标准比较适用于所有可比较的类型:

SELECT * FROM products WHERE price > 100;
SELECT * FROM products WHERE price >= 100;
SELECT * FROM products WHERE price < 50;
SELECT * FROM products WHERE price <= 50;
SELECT * FROM products WHERE category = 'books';
SELECT * FROM products WHERE category <> 'books';   -- != also works

AND、OR、NOT

使用逻辑运算符组合谓词:

-- Both true:
SELECT * FROM products
WHERE category = 'books' AND price < 50;

-- Either true:
SELECT * FROM products
WHERE category = 'books' OR category = 'music';

-- Negation:
SELECT * FROM products
WHERE NOT (category = 'books');

运算符优先级

优先级(从高到低):NOT → AND → OR。为了清晰起见,请始终为复杂谓词加上括号:

-- Without parens — almost certainly wrong:
SELECT * FROM orders
WHERE status = 'open' OR status = 'pending' AND total > 100;
-- means:  status = open  OR  (status = pending AND total > 100)

-- With parens — clearer:
SELECT * FROM orders
WHERE (status = 'open' OR status = 'pending') AND total > 100;

IN 和 NOT IN

多个 OR 条件的简写:

SELECT * FROM users
WHERE country IN ('US', 'CA', 'GB', 'AU');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR country = 'AU';

BETWEEN

包含边界的范围检查:

SELECT * FROM orders
WHERE total BETWEEN 100 AND 500;

-- Equivalent to:  total >= 100 AND total <= 500

NULL 安全的筛选

与 NULL 比较的结果是 NULL(而不是 FALSE),包含 NULL 的行会被 WHERE 丢弃。需要时,请明确使用 IS NULL / IS NOT NULL:

-- Returns users where deleted_at is unknown:
SELECT * FROM users WHERE deleted_at IS NULL;

-- IS DISTINCT FROM treats NULL as a comparable value:
SELECT * FROM events WHERE status IS DISTINCT FROM 'closed';

布尔列

BOOLEAN 列不需要进行比较:

SELECT * FROM tasks WHERE done;       -- = TRUE
SELECT * FROM tasks WHERE NOT done;    -- = FALSE or NULL
SELECT * FROM tasks WHERE done IS NOT TRUE;  -- FALSE or NULL only

使用 LIKE 进行模式匹配

% 匹配任意字符串,_ 恰好匹配一个字符:

SELECT * FROM users WHERE email LIKE '%@gmail.com';
SELECT * FROM products WHERE sku LIKE 'A_-___';

-- Case-insensitive in PostgreSQL:
SELECT * FROM users WHERE email ILIKE '%@GMAIL.com';

过滤条件与性能

WHERE 子句是索引发挥作用的地方。对已建立索引的列使用等值过滤条件(=)和范围过滤条件(<、BETWEEN),可以将全表扫描转变为毫秒级查找。

求值顺序

从逻辑上看,数据库按以下顺序求值:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。因此,WHERE 看到的是原始行;SELECT 中的列别名此时还没有定义。

-- This fails — alias not visible in WHERE:
SELECT total * 0.9 AS discounted
FROM orders WHERE discounted > 100;     -- ERROR

-- Repeat the expression instead, or wrap in a subquery.

回顾

WHERE 是选择行的主要工具。

  • 使用标准的比较运算符和逻辑运算符
  • 混合使用 AND/OR 时加上括号
  • 使用 IS NULL,绝不要使用 = NULL
  • 针对已建立索引的列使用 WHERE,速度很快

快速检查

哪个谓词只保留 age 大于或等于 18 且 country 为 US 的行?

常见问题解答

「WHERE 过滤器:比较与逻辑运算符」课时是免费的吗?

是的 — 「WHERE 过滤器:比较与逻辑运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「WHERE 过滤器:比较与逻辑运算符」这节课中我会学到什么?

使用 =、<>、 、AND、OR、NOT 过滤行,并理解运算符优先级和括号的作用。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「WHERE 过滤器:比较与逻辑运算符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 选择列与表达式
  2. WHERE 过滤器:比较与逻辑运算符
  3. 按单列与多列 ORDER BY
  4. LIMIT、OFFSET 与分页基础
← 返回 SQL Academy