基于示例表计算SQL左/右/内连接返回行数并理解join原理
SQL自连接行数计算及原理解析
你提供的原始测试表数据如下:
| col_a | col_b |
|---|---|
| 0 | 0 |
| 1 | 0 |
| 0 | 0 |
| 1 | 1 |
| 1 | 1 |
| 2 | 0 |
我们先统计每个关联键组合(col_a, col_b)的出现次数:
(0,0):共2行(1,0):共1行(1,1):共2行(2,0):共1行
本次测试的自连接语句通用格式为(表名设为t):
-- 内连接 SELECT * FROM t t1 INNER JOIN t t2 ON t1.col_a = t2.col_a AND t1.col_b = t2.col_b; -- 左连接 SELECT * FROM t t1 LEFT JOIN t t2 ON t1.col_a = t2.col_a AND t1.col_b = t2.col_b; -- 右连接 SELECT * FROM t t1 RIGHT JOIN t t2 ON t1.col_a = t2.col_a AND t1.col_b = t2.col_b;
三种连接的返回行数
1. 内连接(INNER JOIN)
内连接规则是仅保留左右表关联键完全匹配的行,每个关联键组合的返回行数为「左表该键的行数 × 右表该键的行数」。
计算过程:2×2 + 1×1 + 2×2 + 1×1 = 4+1+4+1 = 10行
最终返回行数:10
2. 左连接(LEFT JOIN)
左连接规则是保留左表的所有行,右表没有匹配的行对应位置补NULL。
由于本次是同表自连接,左表所有的关联键组合在右表都存在,不存在匹配失败的情况,因此返回行数和内连接一致。
最终返回行数:10
3. 右连接(RIGHT JOIN)
右连接规则是保留右表的所有行,左表没有匹配的行对应位置补NULL。
同理,因为是同表自连接,右表所有的关联键组合在左表都存在,没有匹配失败的情况,返回行数和内连接、左连接一致。
最终返回行数:10
核心原理补充
如果不是自连接,左右表的关联键组合不完全重合的情况下,三种连接的行数会有明显差异:
- 内连接:仅保留两边都存在的键的匹配结果
- 左连接:内连接结果 + 左表有、右表没有的键对应的行(右表字段补NULL)
- 右连接:内连接结果 + 右表有、左表没有的键对应的行(左表字段补NULL)
内容的提问来源于stack exchange,提问作者Reema
相关产品推荐
相关产品推荐

