1. 什么是区间运算符
1.1 区间运算符的概念
区间运算符用于查询某个范围内的数据
可以替代多个AND连接的比较条件
使查询语句更简洁、易读
1.2 常用的区间运算符
BETWEEN...AND:在某个范围内
IN:在某个值列表中
比较运算符组合:>、<、>=、<=
2. BETWEEN...AND 运算符
2.1 基本语法
SELECT * FROM 表名
WHERE 列名 BETWEEN 值1 AND 值2;
2.2 数值范围查询
-- 创建示例表
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
price DECIMAL(10,2),
stock INT,
category VARCHAR(20)
);
-- 插入示例数据
INSERT INTO products VALUES
(1, '苹果手机', 5999.00, 50, '电子产品'),
(2, '华为平板', 3299.00, 30, '电子产品'),
(3, '小米手环', 199.00, 100, '电子产品'),
(4, '联想笔记本', 4599.00, 20, '电子产品'),
(5, '保温杯', 89.00, 200, '日用品');
示例1:查询价格在2000-5000之间的商品
SELECT * FROM products
WHERE price BETWEEN 2000 AND 5000;
示例2:查询库存量在30-100之间的商品
SELECT * FROM products
WHERE stock BETWEEN 30 AND 100;
2.3 日期范围查询
-- 创建员工表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
-- 插入示例数据
INSERT INTO employees VALUES
(1, '张三', '销售部', 5000.00, '2023-01-15'),
(2, '李四', '技术部', 6000.00, '2023-02-20'),
(3, '王五', '人事部', 4500.00, '2023-03-10'),
(4, '赵六', '财务部', 5500.00, '2023-04-05'),
(5, '钱七', '技术部', 6500.00, '2023-05-25');
示例3:查询2023年第一季度入职的员工
SELECT * FROM employees
WHERE hire_date BETWEEN '2023-01-01' AND '2023-03-31';
3. IN 运算符
3.1 基本语法
SELECT * FROM 表名
WHERE 列名 IN (值1, 值2, 值3, ...);
3.2 使用IN进行多值匹配
示例1:查询特定部门的员工
-- 查询技术部和销售部的员工
SELECT * FROM employees
WHERE department IN ('技术部', '销售部');
示例2:查询特定价格的商品
-- 查询价格为5999、3299、199的商品
SELECT * FROM products
WHERE price IN (5999, 3299, 199);
3.3 IN运算符的等价写法
-- 使用IN运算符
SELECT * FROM employees
WHERE department IN ('技术部', '销售部');
-- 等价的使用OR运算符(更繁琐)
SELECT * FROM employees
WHERE department = '技术部' OR department = '销售部';
4. NOT BETWEEN 和 NOT IN
4.1 NOT BETWEEN
作用:查询不在某个范围内的数据
-- 查询价格不在2000-5000之间的商品
SELECT * FROM products
WHERE price NOT BETWEEN 2000 AND 5000;
-- 查询不在第一季度入职的员工
SELECT * FROM employees
WHERE hire_date NOT BETWEEN '2023-01-01' AND '2023-03-31';
4.2 NOT IN
作用:查询不在指定值列表中的数据
-- 查询不是技术部和销售部的员工
SELECT * FROM employees
WHERE department NOT IN ('技术部', '销售部');
-- 查询不是特定价格的商品
SELECT * FROM products
WHERE price NOT IN (5999, 3299, 199);
5. 综合实战练习
5.1 创建学生成绩表
CREATE TABLE student_scores (
student_id INT PRIMARY KEY,
name VARCHAR(50),
class VARCHAR(20),
chinese INT,
math INT,
english INT,
total_score INT
);
INSERT INTO student_scores VALUES
(1, '张三', '计算机1班', 85, 92, 78, 255),
(2, '李四', '计算机2班', 76, 88, 90, 254),
(3, '王五', '计算机1班', 92, 95, 87, 274),
(4, '赵六', '计算机2班', 68, 72, 65, 205),
(5, '钱七', '计算机1班', 88, 84, 91, 263),
(6, '孙八', '计算机2班', 95, 98, 92, 285);
5.2 综合查询练习
练习1:查询总分在250-280之间的学生
SELECT * FROM student_scores
WHERE total_score BETWEEN 250 AND 280;
练习2:查询数学成绩在90分以上的学生
SELECT * FROM student_scores
WHERE math >= 90;
练习3:查询计算机1班和2班中英语成绩优秀(85分以上)的学生
SELECT * FROM student_scores
WHERE class IN ('计算机1班', '计算机2班')
AND english >= 85;
练习4:查询语文成绩不在70-90分之间的学生
SELECT * FROM student_scores
WHERE chinese NOT BETWEEN 70 AND 90;
6. 常见错误与注意事项
❌ 常见错误
-- 错误!BETWEEN的值顺序不能颠倒
SELECT * FROM products
WHERE price BETWEEN 5000 AND 2000; -- 不会返回结果
-- 错误!IN运算符中不能有NULL值
SELECT * FROM employees
WHERE department IN ('技术部', NULL, '销售部'); -- 可能产生意外结果
✅ 最佳实践
-- 正确:确保BETWEEN的小值在前
SELECT * FROM products
WHERE price BETWEEN 2000 AND 5000;
-- 正确:处理可能的NULL值
SELECT * FROM employees
WHERE department IN ('技术部', '销售部')
OR department IS NULL;
7. 性能优化建议
7.1 索引的使用
对经常用于范围查询的列创建索引
BETWEEN在索引列上效率很高
7.2 避免过度使用IN
-- 不推荐:IN列表过长影响性能
SELECT * FROM products
WHERE id IN (1,2,3,4,5,6,7,8,9,10,11,12,...);
-- 推荐:改用BETWEEN或其他条件
SELECT * FROM products
WHERE id BETWEEN 1 AND 50;
🎯 本章重点总结
💡 重要提醒
BETWEEN包含边界值:BETWEEN 100 AND 500 包含100和500
IN运算符适合离散值,BETWEEN适合连续范围
注意数据类型匹配,特别是日期类型
复杂的区间查询可以组合使用多个运算符
📝 课后作业
基础练习
创建商品表,包含价格、分类、库存等字段
使用BETWEEN查询价格在某个区间的商品
使用IN查询特定分类的商品
组合使用BETWEEN和IN进行复杂查询
进阶练习
查询价格不在100-500之间,且分类为'电子产品'或'图书'的商品
查询入职日期在去年,且薪资在5000-8000之间的员工
设计一个学生选课系统的查询,使用各种区间运算符
其他区间表示方法
-- 使用比较运算符组合
SELECT * FROM products
WHERE price >= 2000 AND price <= 5000;
-- 使用数学函数
SELECT * FROM products
WHERE ABS(price - 3500) <= 1500; -- 价格在2000-5000之间