讲解

比较运算符是 WHERE 条件的基本零件:=(等于)、!= 或 <>(不等于)、>、>=、<、<=。它们左右两边可以是列、常量或表达式,结果为真、假或 NULL 三种状态。数字比较按数值大小,直观易懂:WHERE price > 60、WHERE age <= 21。

字符串也能比较:默认按二进制排序规则逐字符对比,'abc' < 'abd' 成立。日期时间如果像本教程一样存成 'YYYY-MM-DD' 格式的文本,直接比较就是按时间先后——这是 ISO 格式字符串的额外福利:WHERE order_date >= '2025-02-01' 筛出二月以来的订单。但前提是格式严格统一,'2025-2-1' 这种不规范写法会让比较出错。

最重要的一条规则:任何值与 NULL 比较,结果既不是真也不是假,而是 NULL——在 WHERE 里效果等同于「不通过」。WHERE age != 20 查不出 age 为 NULL 的行,这是无数 bug 的来源。NULL 的判断必须用 IS NULL / IS NOT NULL,专门有一章展开讲。

示例

数字比较:价格在 60 到 80 之间的课程:

SELECT title, price FROM courses WHERE price > 60 AND price <= 80;

不等号的两种写法等价:

SELECT id, status FROM orders WHERE status != 'paid';

SELECT id, status FROM orders WHERE status <> 'paid';

日期字符串比较:2025 年 2 月 1 日(含)之后的订单:

SELECT id, order_date, amount FROM orders WHERE order_date >= '2025-02-01' ORDER BY order_date;

常见坑

  • 用 = NULL 或 != NULL 判断空值:这两个表达式的结果永远是 NULL,WHERE 里查不到任何行。判断空值只能写 IS NULL / IS NOT NULL。
  • 忽略 NULL 导致不等筛选「少数据」:WHERE city != '北京' 不会返回 city 为 NULL 的行。如果业务上「未知城市」也要算进来,要加 OR city IS NULL。
  • 数字与字符串混比:SQLite 有类型亲和机制,'20' > 8 在 SQLite 里会按数字比较得出真,但其他数据库行为不同(PostgreSQL 直接报错)。比较前确保两边类型一致。
  • 日期格式不统一:'2025-01-05' 与 '2025-1-5' 混存时,字符串比较的结果就不可信了。入库时统一成 ISO 格式,或用数据库的日期类型。

小结

=、!=/<>、>、>=、<、<= 覆盖数值、字符串和 ISO 日期的比较;与 NULL 比较得 NULL,WHERE 里等同不通过。下一节学习模糊匹配:LIKE。