BETWEEN是SQL中查询闭区间的操作符包含左右边界值如age BETWEEN 18 AND 25等价于age 18 AND age 25。WHERE子句里用BETWEEN查闭区间数据直接说结论BETWEEN是SQL里最常用也最容易写错的范围查询操作符——它查的是闭区间即包含左右边界值。比如age BETWEEN 18 AND 25等价于age 18 AND age 不是半开半闭也不是“大于等于18且小于25”。常见错误现象业务方反馈“25岁用户没查出来”结果发现前端传参把end值设成了24或者后端拼SQL时误用了逻辑还有人以为BETWEEN能自动处理NULL其实只要左值或右值是NULL整条条件就返回UNKNOWN该行直接被过滤掉。左右值类型必须兼容比如不能date BETWEEN 2023-01-01 AND 100MySQL会静默转成0PostgreSQL直接报错ERROR: operator does not exist: date BETWEEN text AND integer字符串比较按字典序name BETWEEN Alice AND Bob会包含Alicia但不包含Bobby因为Bobby Bob时间字段慎用BETWEEN配DATETIME如果想查“2023-01-01全天”写created_at BETWEEN 2023-01-01 AND 2023-01-01 23:59:59容易漏掉毫秒级数据更稳妥的是created_at 2023-01-01 AND created_at 2023-01-02PostgreSQL和MySQL对BETWEEN SYMMETRIC的支持差异BETWEEN SYMMETRIC是PostgreSQL特有语法允许左右值顺序颠倒仍能正确执行比如id BETWEEN SYMMETRIC 100 AND 1等价于id BETWEEN 1 AND 100而MySQL、SQL Server、SQLite都不支持这个关键词写了直接报错ERROR 1064 (42000): You have an error in your SQL syntax。使用场景当上下界来自用户输入且无法保证大小关系时比如前端两个可编辑日期框PostgreSQL可用SYMMETRIC省去判断逻辑其他数据库必须在应用层做MIN()/MAX()处理或用CASE兜底。MySQL中想模拟类似行为得手动写WHERE col LEAST(a, b) AND col GREATEST(a, b)SQL Server没有LEAST/GREATEST得用IIF(a b, a, b)配合嵌套所有数据库里BETWEEN本身都不支持表达式作为边界比如score BETWEEN avg_score - 5 AND avg_score 5在多数引擎里非法得先算出值再代入和IN、 AND 比BETWEEN有什么实际影响语义上三者常可互换但执行层面有差别优化器对BETWEEN通常识别为单个范围扫描节点而 AND 可能被拆成两个独立条件某些旧版本MySQL5.6之前甚至不会走联合索引的第二列IN则完全不适合范围只适用于离散值列表。 幻导航网 发现优质实用网站,开启网络探索之旅