between 在 sql 中是闭区间查询,包含边界值,等价于 col >= low and col = '2024-01-01' and col

BETWEEN 在 SQL 中是闭区间查询,包含边界值,不是“大于等于且小于等于”的简单替代,而是语法糖,但行为完全等价。
WHERE col BETWEEN low AND high 的实际含义
它等价于 col >= low AND col ,但要求 <code>low 必须 ≤ high。如果写成 BETWEEN 10 AND 5,多数数据库(如 PostgreSQL、SQL Server)直接报错或返回空结果;MySQL 虽不报错,但逻辑上无匹配行。
- 日期范围:用
BETWEEN '2024-01-01' AND '2024-01-31'包含首尾两天,注意时分秒默认为00:00:00,若字段含时间,末尾日期可能漏掉当天下午的数据 - 字符串比较:按字典序,
BETWEEN 'A' AND 'C'会包含'AB'、'B',但不包含'CA' - NULL 不会被匹配:任何与
NULL的比较结果都是UNKNOWN,所以col BETWEEN NULL AND 10永远不成立
日期范围查询最容易踩的坑
当字段类型是 DATETIME 或 TIMESTAMP,而只传日期字符串时,数据库会自动补 00:00:00,导致 BETWEEN '2024-01-01' AND '2024-01-31' 实际查的是 2024-01-01 00:00:00 到 2024-01-31 00:00:00,丢掉 31 号全天数据。
- 安全写法:用
col >= '2024-01-01' AND col (推荐) - 或显式指定时间:
BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59',但要注意秒精度和时区问题 - PostgreSQL 支持
col::date BETWEEN '2024-01-01' AND '2024-01-31',但会丢失索引下推能力
BETWEEN 和 IN、LIKE 的性能与语义区别
BETWEEN 是范围谓词,优化器通常能利用 B-tree 索引做范围扫描;IN 是离散值匹配,适合少量枚举;LIKE 带通配符时往往无法走索引(除非前缀固定)。
- 数值连续区间(如 ID 100–200):优先用
BETWEEN - 非连续值(如状态码 1,3,5):用
IN (1,3,5),别硬套BETWEEN - 想查 “以 ABC 开头”:必须用
LIKE 'ABC%',BETWEEN 'ABC' AND 'ABD'会漏掉'ABCA'这类值 - 某些旧版 SQLite 对
BETWEEN的优化不如显式>= AND ,实测慢 10%~20%
真正关键的不是会不会写 BETWEEN,而是意识到它背后仍是两个独立比较操作——一旦涉及时区、隐式类型转换、NULL 或索引失效场景,就得退回到显式写法来控制行为。










