首页/数据/SQL 速查/非等值连接:范围与不等条件

非等值连接:范围与不等条件

连接条件可以用任何布尔表达式:价格落在区间、时间重叠等场景用范围连接,注意区间重叠会导致一行命中多条规则。

SQL 速查数据更新于 2026-10-13

非等值连接

连接条件不限于等号:价格落在区间、两段时间是否重叠,这类场景要用范围或不等条件连接。写法很自然,但非等值条件通常用不上等值索引,而且区间重叠时一行可能命中多条规则,结果行数会被放大。

基本信息

条件形式ON 支持 >=、<、BETWEEN 等任意布尔表达式
索引非等值条件难以走等值索引,大表要评估代价
边界统一左闭右开可避免相邻区间重复命中
结果行数取决于区间重叠程度
典型场景价格档位、时间段匹配、范围对照

典型使用场景

  • 按价格区间匹配优惠规则或费率档位
  • 判断两条记录的时间区间是否重叠
  • 把明细匹配到所属的统计区间
  • 按分数段对照评级
  • 核对区间划分里有没有空隙或重叠

示例

示例
-- 区间匹配:统一左闭右开,避免相邻区间重复命中
SELECT p.name, pr.level
FROM products p
JOIN price_rules pr
  ON p.price >= pr.min_price
 AND p.price <  pr.max_price
ORDER BY p.id;

-- 时间区间重叠:两段区间有交集就匹配
SELECT a.id, b.id
FROM appointments a
JOIN appointments b
  ON a.id < b.id
 AND a.room_id = b.room_id
 AND a.starts_at < b.ends_at
 AND b.starts_at < a.ends_at;

条件形态与代价

条件形态能否用索引典型代价
等值 a = b可以低
范围 a BETWEEN b AND c通常不能随区间重叠放大行数
不等 a <> b一般不能接近笛卡尔积,慎用
区间重叠两条件部分可借一侧索引过滤需评估放大倍数
区间边界不统一是最常见的错误:相邻区间两端都闭会重复命中,两端都开又会漏掉边界值。统一成「左闭右开」能省掉很多对账麻烦。
先把一侧数据过滤到尽量小再做区间连接:非等值连接的代价主要由候选对数量决定,缩小输入往往比调索引更有效。

易错点

  • 区间边界不统一:边界值可能命中两条规则或一条都不命中,规则对账时难以发现
  • 用不等条件连接大表:接近笛卡尔积,行数与耗时都会失控
  • 忽略区间重叠导致的行数放大:聚合口径从「商品」变成「商品乘规则」,统计结果偏大
  • 未评估索引利用情况:非等值条件在 MySQL 与 PostgreSQL 上都难以用等值索引,重要查询先看计划
  • 区间本身有空隙:规则表没覆盖全部取值,部分数据匹配不到任何规则,需用左连接兜底检查

数据来源与参考

  • MySQL 8.0 Reference Manual · JOIN Clause
  • PostgreSQL Documentation · Joined Tables
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌