Skip to content

MySQL - BETWEEN 运算符

MySQL 中的 BETWEEN 运算符是一个逻辑运算符,用于 WHERE 子句中,以选择指定范围内的值。它是包含性的,这意味着它包括范围的起始值和结束值。

使用 BETWEEN 是一种更具可读性和简洁性的方式来编写“大于或等于”与“小于或等于”条件的组合。表达式 column_name BETWEEN value1 AND value2 等同于 column_name >= value1 AND column_name <= value2。

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

这里,value1 是范围的下限,value2 是上限。两者都包含在搜索中。

让我们使用 customers 表进行演示。首先,回顾一下数据:

SELECT * FROM customers;
-- Result:
-- +----+----------+-----+-----------+----------+
-- | id | name | age | address | salary |
-- +----+----------+-----+-----------+----------+
-- | 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
-- | 2 | Khilan | 25 | Delhi | 1500.00 |
-- | 3 | Kaushik | 23 | Kota | 2000.00 |
-- | 4 | Chaitali | 25 | Mumbai | 6500.00 |
-- | 5 | Hardik | 27 | Bhopal | 8500.00 |
-- | 6 | Komal | 22 | Hyderabad | 4500.00 |
-- | 7 | Muffy | 24 | Indore | 10000.00 |
-- +----+----------+-----+-----------+----------+

让我们找出年龄在 25 到 30 之间(含 25 和 30)的客户。

SELECT * FROM customers
WHERE age BETWEEN 25 AND 30;
idnameageaddresssalary
2Khilan25Delhi1500.00
4Chaitali25Mumbai6500.00
5Hardik27Bhopal8500.00

要选择超出指定范围的值,您可以使用 NOT BETWEEN 运算符。

示例:过滤数字范围之外的数据

Section titled “示例:过滤数字范围之外的数据”

让我们找出薪水不在 2000.00 到 8000.00 之间的客户。

SELECT * FROM customers
WHERE salary NOT BETWEEN 2000.00 AND 8000.00;
idnameageaddresssalary
2Khilan25Delhi1500.00
5Hardik27Bhopal8500.00
7Muffy24Indore10000.00

您可以将 BETWEEN 与 AND、OR 和 IN 等其他逻辑运算符结合使用,以创建更复杂的过滤器。

查找薪水在 4000 到 10000 之间,并且居住在 ‘Hyderabad’ 或 ‘Bhopal’ 的客户。

SELECT * FROM customers
WHERE (salary BETWEEN 4000 AND 10000)
AND address IN ('Hyderabad', 'Bhopal');
idnameageaddresssalary
5Hardik27Bhopal8500.00
6Komal22Hyderabad4500.00

在 UPDATE 和 DELETE 语句中使用 BETWEEN

Section titled “在 UPDATE 和 DELETE 语句中使用 BETWEEN”

BETWEEN 运算符对于修改或删除特定范围内的记录也非常有用。

示例:UPDATE 与 BETWEEN 的结合使用

Section titled “示例:UPDATE 与 BETWEEN 的结合使用”

让我们给所有年龄在 22 到 24 岁之间的客户增加薪水。

UPDATE customers
SET salary = salary * 1.10 -- 涨薪 10%
WHERE age BETWEEN 22 AND 24;

要验证更改,您可以运行 SELECT 查询。您会看到 Komal (22)、Kaushik (23) 和 Muffy (24) 的薪水已增加。

使用 BETWEEN 处理 DATETIME 或 TIMESTAMP 列时,一个常见的陷阱是:BETWEEN '2023-10-01' AND '2023-10-31' 这样的查询会被解释为 BETWEEN '2023-10-01 00:00:00' AND '2023-10-31 00:00:00'。这将排除 10 月 31 日午夜之后发生的任何记录。

对于日期范围,更安全、推荐的方法是结合使用 >= 和 <:

-- 日期范围的安全方法
SELECT * FROM events
WHERE event_timestamp >= '2023-10-01' AND event_timestamp < '2023-11-01';

从应用程序代码中使用 BETWEEN 运算符

Section titled “从应用程序代码中使用 BETWEEN 运算符”

在应用程序中使用 BETWEEN 时,关键是使用预处理语句来传递范围值。这可以防止 SQL 注入。

示例:在 Python 中安全地查询范围

Section titled “示例:在 Python 中安全地查询范围”
import mysql.connector
from mysql.connector import Error
def find_customers_in_age_range(min_age, max_age):
try:
connection = mysql.connector.connect(
host='localhost',
database='TUTORIALS',
user='root',
password='password'
)
cursor = connection.cursor(dictionary=True)
sql_query = "SELECT id, name, age FROM customers WHERE age BETWEEN %s AND %s"
# 将值作为元组传递给 execute 方法进行参数化
cursor.execute(sql_query, (min_age, max_age))
records = cursor.fetchall()
print(f"Found {cursor.rowcount} customers between ages {min_age} and {max_age}:")
for row in records:
print(row)
except Error as e:
print(f"Error: {e}")
finally:
if connection and connection.is_connected():
cursor.close()
connection.close()
# Call the function with a specific age range
find_customers_in_age_range(25, 30)