SQL中BETWEEN与IN的差异详解

BETWEENIN 是 SQL 中常用的条件运算符,但功能和适用场景有显著区别:


1. BETWEEN 运算符

  • 作用 :筛选连续范围的值(闭区间,包含边界)。

  • 语法

    sql 复制代码
    WHERE 列名 BETWEEN 值1 AND 值2
  • 等价于

    sql 复制代码
    WHERE 列名 >= 值1 AND 列名 <= 值2
  • 适用场景
    数字范围、日期范围等连续数据。
    示例

    sql 复制代码
    WHERE price BETWEEN 50 AND 100    -- 价格在 50 到 100(含)
    WHERE date BETWEEN '2023-01-01' AND '2023-12-31'  -- 2023年内日期

2. IN 运算符

  • 作用 :筛选离散值列表中的值。

  • 语法

    sql 复制代码
    WHERE 列名 IN (值1, 值2, ..., 值N)
  • 等价于

    sql 复制代码
    WHERE 列名 = 值1 OR 列名 = 值2 OR ... OR 列名 = 值N
  • 适用场景
    匹配多个不连续的特定值(如枚举值)。
    示例

    sql 复制代码
    WHERE country IN ('USA', 'Japan', 'Germany')  -- 国家为美/日/德
    WHERE id IN (101, 205, 307)                  -- 特定ID

核心区别总结

特性 BETWEEN IN
匹配方式 连续范围(闭区间) 离散值列表
边界处理 包含边界值(>= AND <= 仅匹配列表中的值
适用数据类型 数字、日期、时间等有序类型 任意类型(数字、文本、枚举等)
性能 对索引友好(范围扫描) 对大列表可能较慢(多值 OR 判断)
灵活性 只能指定一个范围 可指定任意离散值组合

示例对比

products
id price category
1 80 A
2 120 B
3 50 A
4 100 C
查询 1:使用 BETWEEN(连续范围)
sql 复制代码
SELECT * FROM products
WHERE price BETWEEN 50 AND 100;

结果

id price category
1 80 A
3 50 A
4 100 C
查询 2:使用 IN(离散值)
sql 复制代码
SELECT * FROM products
WHERE category IN ('A', 'C');

结果

id price category
1 80 A
3 50 A
4 100 C

使用建议

  • BETWEEN 时确保值有序(如 值1 <= 值2),否则无结果。

  • IN 可嵌套子查询,灵活性更强:

    sql 复制代码
    WHERE id IN (SELECT product_id FROM orders WHERE year=2023)
  • 两者可结合使用:

    sql 复制代码
    WHERE price BETWEEN 50 AND 100 
      AND category IN ('A', 'B')