比较运算符是什么
比较运算符把两个表达式比出 TRUE / FALSE / UNKNOWN 三种结果,是 WHERE、JOIN ON、HAVING 判定的基础。等值用 =,不等推荐 <>;字符串比较的大小写敏感性由排序规则(collation)决定,不是由运算符本身决定,这是跨库迁移最常见的意外之一。
基本信息
| 等值 | = 完全相等;比较前先按类型协商规则统一两侧类型 |
|---|---|
| 不等 | <> 与 != 等价,标准写法是 <> |
| 大小比较 | > >= < <= 适用于数字、日期与可排序字符串 |
| NULL 安全等值 | MySQL 用 <=>;PostgreSQL 用 IS NOT DISTINCT FROM |
| 判空 | IS NULL / IS NOT NULL,不要写 = NULL |
| 范围缩写 | BETWEEN a AND b 等价 a <= x AND x <= b,两端都为闭区间 |
示例与大小写
示例与大小写
SELECT * FROM users
WHERE level >= 3 AND level <> 9; -- 组合范围与不等
SELECT * FROM users WHERE name = BINARY 'Tom'; -- MySQL:强制按字节比较
SELECT 'a' = 'A'; -- MySQL 默认排序规则(utf8mb4_0900_ai_ci):1
SELECT 'a' = 'A'; -- PostgreSQL 默认排序规则:f
SELECT NULL <=> NULL; -- MySQL:1,NULL 之间视为相等结果差异对照
| 表达式 | MySQL 8 | PostgreSQL |
|---|---|---|
| 'a' = 'A' | 1(_ci 排序规则不区分大小写) | f(默认区分大小写) |
| NULL = NULL | NULL(不成立) | NULL |
| NULL <=> NULL | 1 | 不支持;用 IS NOT DISTINCT FROM |
| '10' = 10 | 1(字符串隐式转数字) | 报错:operator does not exist |
| 'Tom' IN ('tom') | 1 | f |
| col = BINARY 'Tom' | 按字节比较,区分大小写 | 不支持 BINARY 关键字;用 COLLATE "C" |
典型使用场景
- 范围过滤:金额、时间、等级的上下界判定
- 精确匹配枚举值:状态、类型这类低基数字段
- 判空与补空:IS NULL 找缺失数据,与 COALESCE 配合出报表
- 关联条件中比较两侧键,注意类型必须一致才能走索引
- 迁移校验时对比两库结果集,先确认排序规则是否会造成命中差异
- 范围写法二选一:BETWEEN a AND b 更短,x >= a AND x < b 能表达半开区间,取时间窗口时后者更常用
MySQL 排序规则后缀 _ci 不区分大小写、_cs 区分、_bin 按字节比较;PostgreSQL 用数据库或列的 collation,可在查询里用 COLLATE "C" 临时覆盖为字节序比较。排序规则也会影响索引:同一列上的索引按列自身的排序规则排序,改写查询的 COLLATE 可能让索引失效。
NOT IN 的列表里只要出现一个 NULL,整个条件就恒为 UNKNOWN,查询返回 0 行且不报错。子查询结果可能含 NULL 时要改用 NOT EXISTS,或在子查询里加 IS NOT NULL 过滤。