SQL区间查询是数据库开发中非常基础也高频的需求。无论是统计某一段时间内的订单,还是筛选某个价格区间的商品,开发者经常会在 BETWEEN AND 和 >=、<= 组合之间做选择。这两种写法在标准闭区间场景下结果通常一致,但在边界表达、可读性、维护成本以及复杂条件组合方面存在明显差异。

闭区间查询的两种基础表达
BETWEEN AND 的语义非常直接:它表示字段值落在下限值与上限值之间,并且包含这两个边界值。也就是说,price BETWEEN 100 AND 200 等价于价格大于等于 100 且小于等于 200。对于价格、库存、评分、年龄等连续或离散数值字段,这种写法能够用一行条件表达完整的范围含义。
-- 查询价格在100到200之间的商品,包含边界 SELECT product_id, product_name, price FROM product WHERE price BETWEEN 100 AND 200;
如果希望使用比较运算符实现同样的闭区间效果,可以写下限条件与上限条件,并用 AND 连接。这种写法在结果上与 BETWEEN AND 等价,但条件更展开,便于后续修改为其他边界形式。
-- 与上一条等价的闭区间查询 SELECT product_id, product_name, price FROM product WHERE price >= 100 AND price <= 200;
从基础用法看,两者都可以完成闭区间筛选。真正需要权衡的地方,在于业务是否只需要包含两端边界的查询,还是需要表达更复杂的边界组合。
边界能力与表达灵活性的差异
BETWEEN AND 最大的限制是边界形式固定。它天然表示闭区间,无法直接表达“大于下限且小于上限”的开区间。如果业务要求排除边界值,例如价格不能等于 100 或 200,就必须改用比较运算符组合。
-- 查询价格大于100且小于200的商品,开区间查询 SELECT product_id, product_name, price FROM product WHERE price > 100 AND price < 200;
除开区间外,左开右闭、左闭右开也是常见需求。比如某些促销规则要求价格大于 100 且小于等于 200,或者价格大于等于 100 且小于 200。这类边界无法用单个 BETWEEN AND 直接表达,但用 >=、<=、>、< 组合可以清晰描述。
-- 左开右闭:价格大于100且小于等于200 SELECT product_id, product_name, price FROM product WHERE price > 100 AND price <= 200; -- 左闭右开:价格大于等于100且小于200 SELECT product_id, product_name, price FROM product WHERE price >= 100 AND price < 200;
当查询条件不是单一连续范围,而是多个不连续范围时,比较运算符组合的优势更明显。例如查询低价商品和高价商品,可以用 OR 连接两个条件。此时如果强行使用 BETWEEN AND,表达会变得别扭,也容易让读者误解业务意图。
-- 查询价格低于100或高于200的商品 SELECT product_id, product_name, price FROM product WHERE price < 100 OR price > 200;
可读性、性能与执行计划
在标准闭区间场景下,BETWEEN AND 通常更简洁,也更贴近自然语言中的“从某个值到某个值”。对于报表查询、运营取数、后台管理页面筛选等场景,这种简洁性能够降低阅读成本。尤其是在时间范围查询中,业务人员往往习惯说“从开始时间到结束时间”,使用 BETWEEN AND 可以让 SQL 更接近业务描述。
-- 闭区间时间查询:? 表示由应用传入的起止时间参数 SELECT order_id, order_time, total_amount FROM order_info WHERE order_time BETWEEN ? AND ?;
比较运算符组合虽然稍长,但边界意图更显式。当条件需要频繁调整,或者不同模块对边界包含规则不一致时,显式写出每个比较条件可以减少歧义。例如某些统计要求包含开始时间但不包含结束时间,使用 >= 和 < 就能直接体现左闭右开的规则。
-- 等价的闭区间时间查询 SELECT order_id, order_time, total_amount FROM order_info WHERE order_time >= ? AND order_time <= ?;
性能方面,在大多数主流数据库中,优化器通常会把 BETWEEN AND 与等价的大小于条件归一化为相同的范围条件。只要字段类型匹配、没有函数包裹、没有隐式转换,并且索引可用,两种写法的扫描范围与索引使用情况通常一致。因此,在相同条件下,不建议仅为了性能而机械选择某种写法。
-- 查看两种写法在相同索引条件下的执行计划 EXPLAIN SELECT product_id, product_name, price FROM product WHERE price BETWEEN 100 AND 200; EXPLAIN SELECT product_id, product_name, price FROM product WHERE price >= 100 AND price <= 200;
真正影响性能的因素往往不在写法本身,而在索引设计、数据类型一致性、排序规则、统计信息以及查询条件是否可被索引使用。如果字段上存在合适索引,并且条件没有破坏索引使用,两种写法通常都能获得稳定的执行效果。
选择策略与注意事项
使用 BETWEEN AND 时,首先要保证下限值小于或等于上限值。SQL 中 BETWEEN 200 AND 100 不会自动交换顺序,它表达的是大于等于 200 且小于等于 100 的条件,这个条件通常不可能成立,因此查询结果往往为空。为了避免这类低级错误,编写 SQL 时应明确检查范围顺序,或者在应用层先规范化参数。
-- 错误示例:上下限顺序颠倒,通常查询不到记录 SELECT product_id, product_name, price FROM product WHERE price BETWEEN 200 AND 100;
对于日期时间字段,边界处理尤其需要谨慎。若只关心某个自然日的数据,建议优先采用左闭右开的写法,将下界设为该日起始时间,将上界设为下一个自然日的起始时间。这样不会遗漏末尾秒,也不容易受到秒级精度、毫秒级精度或时区处理带来的影响。
-- 查询某个自然日订单:左闭右开写法更稳妥 SELECT order_id, order_time FROM order_info WHERE order_time >= ? AND order_time < ?;
综合来看,标准闭区间查询可以优先使用 BETWEEN AND,因为它简洁且可读性好;涉及开区间、半开区间或多个不连续范围时,应使用比较运算符组合;时间范围查询则建议统一采用左闭右开规则,以减少边界遗漏。性能上两者通常没有本质差异,选择重点应放在业务语义清晰、边界规则一致和后续维护方便。
在实际项目中,还可以将常用区间条件封装为统一的查询模板或参数化语句,让边界包含规则保持一致。只要团队对边界语义有明确约定,BETWEEN AND 与比较运算符组合都可以成为可靠且易读的区间查询工具。
SQL区间查询BETWEEN_AND大小于符号数据库查询修改时间:2026-07-13 16:15:41