在SQL数据库的日常查询操作中,数值范围查询是非常高频的需求,比如统计某段时间的销售额、筛选特定价格区间的商品、查询符合年龄要求的用户等场景都需要用到范围筛选能力。BETWEEN与AND是SQL标准提供的专门用于范围查询的关键字组合,能够简洁地实现闭区间的数值筛选,大幅简化查询语句的编写。

BETWEEN与AND的基础语法
BETWEEN与AND的基本语法格式如下,用于判断某个字段的值是否在指定的两个边界值之间:
-- 基础语法 SELECT 列名1, 列名2, ... FROM 表名 WHERE 字段名 BETWEEN 下限值 AND 上限值;
这里的BETWEEN后面跟的是范围的下限,AND后面跟的是范围的上限,整个条件等价于字段名 >= 下限值 AND 字段名 <= 上限值,属于闭区间查询,也就是会包含上下限两个边界值本身。
数值范围查询的实际示例
假设我们有一张orders订单表,表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| order_id | INT | 订单ID |
| user_id | INT | 用户ID |
| order_amount | DECIMAL(10,2) | 订单金额 |
| create_time | DATETIME | 创建时间 |
如果要查询订单金额在100到500之间的所有订单,就可以使用以下查询语句:
-- 查询订单金额在100到500之间的订单 SELECT order_id, user_id, order_amount, create_time FROM orders WHERE order_amount BETWEEN 100 AND 500;
这条语句会返回所有order_amount大于等于100且小于等于500的订单记录,包含金额刚好是100和500的订单。
边界值与数据类型注意事项
使用BETWEEN与AND进行数值范围查询时,需要注意以下几点:
- 边界值的数据类型需要和查询字段的数据类型匹配,比如字段是整型,边界值就不能是字符串,否则可能导致隐式类型转换,影响查询性能甚至结果错误。
- BETWEEN的下限值必须小于等于上限值,如果下限值大于上限值,查询不会报错,但会返回空结果集,比如
WHERE order_amount BETWEEN 500 AND 100就不会匹配到任何记录。 - 对于浮点型数值的范围查询,由于浮点数的精度问题,可能会出现边界值匹配不符合预期的情况,建议对精度要求高的场景使用定点数类型,或者在查询时适当扩大范围边界。
与其他范围查询方式的对比
除了使用BETWEEN与AND,我们也可以用大于等于和小于等于的组合来实现范围查询,两种方式的区别如下:
| 查询方式 | 语法示例 | 特点 |
|---|---|---|
| BETWEEN与AND | WHERE num BETWEEN 1 AND 10 | 语法简洁,可读性强,默认是闭区间 |
| 比较运算符组合 | WHERE num >= 1 AND num <= 10 | 灵活性更高,可以自定义开闭区间,比如>1 AND <10就是开区间 |
如果只是需要闭区间查询,优先使用BETWEEN与AND,代码更简洁;如果需要开区间或者半开半闭区间,就需要使用比较运算符组合的方式。
不同数据库中的使用差异
BETWEEN与AND是SQL标准语法,主流数据库都支持,但在处理日期时间类型的范围查询时,不同数据库有细微差异:
MySQL中的使用
MySQL中BETWEEN可以用于日期时间类型,比如查询2024年1月1日到2024年1月31日的订单:
-- MySQL日期范围查询 SELECT order_id, order_amount FROM orders WHERE create_time BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59';
PostgreSQL中的使用
PostgreSQL中如果字段是DATE类型,使用BETWEEN查询时会自动包含整个日期,不需要手动拼接时间部分:
-- PostgreSQL日期范围查询 SELECT order_id, order_amount FROM orders WHERE create_time::DATE BETWEEN '2024-01-01' AND '2024-01-31';
常见使用误区
误区:BETWEEN与AND是开区间查询,不包含边界值。实际上BETWEEN与AND默认是闭区间,包含上下限两个边界值,如果需要排除边界值,需要使用比较运算符组合。
另外,不要在BETWEEN后面使用表达式或者函数处理查询字段,比如WHERE YEAR(create_time) BETWEEN 2023 AND 2024,这种写法会导致索引失效,查询性能下降,建议改为范围查询字段本身,比如WHERE create_time BETWEEN '2023-01-01' AND '2024-12-31 23:59:59'。
SQLBETWEEN_AND数值范围查询数据筛选修改时间:2026-07-21 09:30:32