使用 BETWEEN 处理范围
使用 BETWEEN 处理包含边界的数值和日期范围,并了解何时应优先使用明确的 >= 和 < 比较来表示半开区间。
使用 BETWEEN 处理范围 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
BETWEEN 包含边界
BETWEEN a AND b 匹配满足 x >= a AND x <= b 的值。两个端点都包含在范围内。
SELECT * FROM orders WHERE total BETWEEN 100 AND 500;
-- equivalent to:
SELECT * FROM orders WHERE total >= 100 AND total <= 500;日期范围
BETWEEN 也适用于日期和时间戳:
SELECT * FROM orders
WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31';包含端点的陷阱
对 TIMESTAMP 列使用 BETWEEN 时,'2024-12-31' 会在 31 日午夜结束,而不是当天结束。12 月 31 日 14:00 创建的订单会被排除。
-- WRONG — misses orders later on Dec 31:
WHERE created_at BETWEEN '2024-12-01' AND '2024-12-31';
-- RIGHT — half-open interval:
WHERE created_at >= '2024-12-01'
AND created_at < '2025-01-01';时间范围优先使用半开区间
半开区间模式 >= start AND < next_period 没有歧义,适用于任何粒度,并且可以自然地连接连续时间段。
WHERE created_at >= date_trunc('month', NOW())
AND created_at < date_trunc('month', NOW()) + INTERVAL '1 month';NOT BETWEEN
BETWEEN 的反向形式,用于排除该范围:
SELECT * FROM products WHERE price NOT BETWEEN 10 AND 20;
-- equivalent to: price < 10 OR price > 20范围查询与索引
B-tree 索引有助于范围查询。对于复合索引,最好将范围列放在最后,以获得更好的选择性:
CREATE INDEX orders_user_total_idx ON orders (user_id, total);
-- Efficient: equality on user_id, range on total
SELECT * FROM orders
WHERE user_id = 42 AND total BETWEEN 100 AND 500;字符串与 BETWEEN
BETWEEN 按字典序比较字符串。请注意大小写:
SELECT * FROM users WHERE last_name BETWEEN 'A' AND 'C';
-- Includes 'Adams' and 'Bond', excludes 'C' itself only if 'C' < 'Ca...'范围类型(PostgreSQL)
PostgreSQL 为半开区间提供了专用的范围类型:
SELECT int4range(10, 20) @> 15; -- true (15 in [10,20))
SELECT tsrange('2024-01-01', '2025-01-01') @> NOW()::TIMESTAMP;使用 CHECK 验证范围
确保插入时 start <= end:
CREATE TABLE bookings (
id BIGSERIAL PRIMARY KEY,
start_at TIMESTAMPTZ NOT NULL,
end_at TIMESTAMPTZ NOT NULL,
CHECK (start_at < end_at)
);数值分桶
将 BETWEEN 与 CASE 结合起来创建分桶:
SELECT id, total,
CASE
WHEN total BETWEEN 0 AND 99 THEN 'small'
WHEN total BETWEEN 100 AND 999 THEN 'medium'
ELSE 'large'
END AS bucket
FROM orders;BETWEEN SYMMETRIC
SQL 标准扩展,不关心哪一端较小:
SELECT 5 BETWEEN SYMMETRIC 10 AND 1; -- TRUE回顾
BETWEEN 是简便的包含边界范围简写。
- 注意时间戳端点,优先使用半开区间
>= start AND < end - 复合索引可以加速范围查询
- CHECK 约束可以强制范围有效
快速检查
在标准 SQL 中,BETWEEN a AND b 的两个端点都包含在范围内吗?
常见问题解答
「使用 BETWEEN 处理范围」课时是免费的吗?
是的 — 「使用 BETWEEN 处理范围」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「使用 BETWEEN 处理范围」这节课中我会学到什么?
使用 BETWEEN 处理包含边界的数值和日期范围,并了解何时应优先使用明确的 >= 和 < 比较来表示半开区间。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 BETWEEN 处理范围」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- LIKE 模式与通配符
- 使用 IN 和 NOT IN 处理集合
- 使用 BETWEEN 处理范围
- IS NULL、IS NOT NULL 与 COALESCE