0Pricing
SQL Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. LIKE 模式与通配符
  2. 使用 IN 和 NOT IN 处理集合
  3. 使用 BETWEEN 处理范围
  4. IS NULL、IS NOT NULL 与 COALESCE
← 返回 SQL Academy