MySQL 零基础教程

MySQL IN 与 BETWEEN 运算符

INBETWEEN 运算符通过使用简洁、易读的语法替换多个逻辑比较,极大地简化了复杂的 WHERE 子句。虽然在技术上你可以结合使用 OR 和诸如 >=<= 之类的比较运算符来达到相同的结果,但 INBETWEEN 可以有效缩短查询语句的长度,并最大程度地降低出现逻辑错误的风险。

1. 使用 IN 运算符进行过滤

IN 运算符允许你在 WHERE 子句中指定多个值。它本质上是多个 OR 条件的简写形式。当你需要检查某一列的值是否与你提供的列表中的任何一项相匹配时,使用 IN 是更清晰的选择。

考虑一个包含 customers(客户)表的数据库。如果你想检索所有位于德国 (Germany)、法国 (France) 或西班牙 (Spain) 的客户,使用 OR 的写法如下所示:

SELECT customer_name, country 
FROM customers 
WHERE country = 'Germany' OR country = 'France' OR country = 'Spain';

使用 IN 运算符后,查询语句的易读性得到了显著提升:

SELECT customer_name, country 
FROM customers 
WHERE country IN ('Germany', 'France', 'Spain');

IN 运算符处理数值也同样简单。要查找具有特定 ID 的订单,你可以使用:

SELECT order_id, total_amount 
FROM orders 
WHERE order_id IN (10248, 10250, 10255);

性能提示: 当提供给 IN 的列表是静态且相对较小时,MySQL 执行它的效率非常高。如果你发现自己需要与成千上万个值进行比对,请考虑使用子查询(将在后续模块中详细介绍)而不是在代码中硬编码长长的列表。

2. 使用 BETWEEN 运算符过滤范围

BETWEEN 运算符用于选择给定范围内的值。该范围是包含边界值 (inclusive) 的,这意味着你提供的起始值和结束值都会被包含在查询结果中。

如果你正在查询一个 products(产品)表,并且想要查找价格在 10 到 20 之间的商品,使用标准的比较运算符会是这样:

SELECT product_name, price 
FROM products 
WHERE price >= 10 AND price <= 20;

使用 BETWEEN 可以将其直接简化为一个单一的、基于范围的表达式:

SELECT product_name, price 
FROM products 
WHERE price BETWEEN 10 AND 20;

2.1 处理日期

当按日期进行过滤时,BETWEEN 显得尤为强大,因为它能够非常自然地处理时间顺序。要查找 2023 年第一季度下的所有订单:

SELECT order_id, order_date 
FROM orders 
WHERE order_date BETWEEN '2023-01-01' AND '2023-03-31';

3. 重要的细微差别

在使用这两个运算符时,请务必留意以下几点核心原则:

  • 包含边界 (Inclusivity): 永远记住 BETWEEN 是包含边界的。如果你设置的范围是 BETWEEN 10 AND 20,那么 10 和 20 这两个数字本身都会被包含在输出结果中。
  • 顺序很重要 (Order Matters): BETWEEN 语句中的第一个值必须小于第二个值。BETWEEN 20 AND 10 将返回一个空集,因为不可能有任何值同时大于 20 且小于 10。
  • 否定用法 (Negation): 你可以对这两个运算符进行逻辑反转。使用 NOT IN 来排除一组特定的值,使用 NOT BETWEEN 来排除一个特定的范围。

查询引擎的执行逻辑通常为:评估 WHERE 子句 -> 确定使用的运算符 -> 如果是 IN,则对照值列表进行检查;如果是 BETWEEN,则检查值是否在包含边界的范围内 -> 满足条件则返回行