SQL 中 BETWEEN 和 IN 的区别


一、BETWEEN 详细说明

1.1 用法

BETWEEN ... AND ... 用于判断某个字段的值是否在一段"连续区间"之内(包括区间的起点和终点)。

1.2 适用的数据类型

  • 数值类型(如 int, float)
  • 日期或时间类型(如 date, datetime, timestamp)
  • 字符串类型(会依据排序的字典序)

1.3 例子

1.3.1 数值
sql 复制代码
SELECT * FROM orders WHERE total_price BETWEEN 100 AND 200;

含义:所有 total_price 大于等于 100 且小于等于 200 的订单。

1.3.2 日期
sql 复制代码
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';

含义:所有下单日期在 1 月 1 日到 1 月 31 日之间的订单。

1.3.3 字符串
sql 复制代码
SELECT * FROM users WHERE username BETWEEN 'aaa' AND 'mmm';

含义:用户名在 'aaa' 到 'mmm' 字典序之间的用户。

1.4 注意事项

  • 包括边界值 ,即等价于 column >= a AND column <= b
  • 如果 a > b,结果可能为空或行为依赖于数据库实现。
  • 对字符串来说,排序由数据库字符集决定,不常用于字符串筛选。

1.5 不能乱用的场景

  • 非连续的多值筛选(如只要A、B、C,不要A到C之间全部),不适用。

二、IN 详细说明

2.1 用法

IN (value1, value2, ... valueN) 用于判断某个字段是否等于给定的若干个具体值(离散集合)。

2.2 适用的数据类型

  • 数值
  • 字符串
  • 日期/时间
  • 甚至支持子查询

2.3 例子

2.3.1 数值集合
sql 复制代码
SELECT * FROM employees WHERE department_id IN (1, 2, 5, 8);

含义:部门号为1、2、5、8的员工。

2.3.2 字符串集合
sql 复制代码
SELECT * FROM students WHERE name IN ('Alice', 'Bob', 'Cathy');

含义:名字是 Alice、Bob 或 Cathy 的学生。

2.3.3 子查询
sql 复制代码
SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE vip = 1);

含义:下单人是 "VIP 客户" 的订单。

2.4 注意事项

  • IN 里面的值,可以是任何类型,只要和字段类型对应即可。
  • 当集合内值较多时,内部会自动优化(但上千个值效率一般不如临时表)。
  • NOT IN 表示"不在这些值"。
  • IN 的筛选是**"任意一个匹配即可"**。

2.5 不能乱用的场景

  • 区间判断 (如 2 到 10 之间所有整数),不用 IN,应用 BETWEEN

三、扩展对比表

使用场景 推荐用法 代码示例
连续区间查找 BETWEEN ... AND ... score BETWEEN 80 AND 100
离散多个值查找 IN (...) city IN ('Beijing', 'Shanghai', 'Guangzhou')
排除某集合 NOT IN (...) user_id NOT IN (123, 456, 789)
区间筛选排除 不推荐用 IN,有风险 应使用区间条件 price < 100 OR price > 200
子集判断 IN (子查询) product_id IN (SELECT id FROM products WHERE ...)

四、举例说明区别

  1. 查找出生日期是 2000 年 1 月 1 日至 2000 年 12 月 31 日内的员工

    • 推荐 BETWEEN
    sql 复制代码
    SELECT * FROM employees WHERE birthday BETWEEN '2000-01-01' AND '2000-12-31';
  2. 查找部门在 1、3、5号的员工

    • IN
    sql 复制代码
    SELECT * FROM employees WHERE department_id IN (1, 3, 5);
  3. 错误用法举例

    sql 复制代码
    -- 错误,用 BETWEEN 查离散值,等价于 BETWEEN 1 AND 5,会返回 2、3、4 都被查出
    SELECT * FROM employees WHERE department_id BETWEEN 1 AND 5;

    实际只要 1、3、5应该用

    sql 复制代码
    SELECT * FROM employees WHERE department_id IN (1, 3, 5);

相关推荐
java_logo1 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
广州灵眸科技有限公司9 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手11 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh14 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z1234567898614 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD15 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo15 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
TlSfoward16 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记16 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘