关于SQL1与SQL2执行时聚合逻辑差异的技术问询
SQL1与SQL2的聚合逻辑差异分析
已知SQL1返回按name字段聚合后的记录,SQL2返回未按name单独聚合的记录,以下是两段SQL的聚合逻辑差异分析:
SQL1 代码
SELECT name, CASE WHEN COUNT(CASE WHEN course = 'SQL' THEN 1 END) > 0 THEN 'o' END AS SQL, CASE WHEN COUNT(CASE WHEN course = 'UNIX' THEN 1 END) > 0 THEN 'o' END AS UNIX, CASE WHEN COUNT(CASE WHEN course = 'Java' THEN 1 END) > 0 THEN 'o' END AS Java FROM Courses GROUP BY name;
SQL2 代码
SELECT name, CASE WHEN course = 'SQL' THEN '○' ELSE NULL END s, CASE WHEN course = 'UNIX' THEN '○' ELSE NULL END u, CASE WHEN course = 'Java' THEN '○' ELSE NULL END j FROM Courses GROUP BY name,course;
建表语句与测试数据
CREATE TABLE Courses (name VARCHAR(32), course VARCHAR(32), PRIMARY KEY(name, course)); INSERT INTO Courses VALUES('Tom', 'SQL'); INSERT INTO Courses VALUES('Tom', 'UNIX'); INSERT INTO Courses VALUES('Jack', 'SQL'); INSERT INTO Courses VALUES('Mike', 'SQL'); INSERT INTO Courses VALUES('Mike', 'Java'); INSERT INTO Courses VALUES('Jane', 'UNIX'); INSERT INTO Courses VALUES('Mary', 'SQL');
聚合逻辑核心差异
1. 分组维度完全不同
- SQL1仅按
name分组:将同一个用户的所有选课记录合并为一行,不管该用户选了几门课,最终结果里每个name只出现一次。 - SQL2按
name+course组合分组:每个用户的每一门选课都会单独成为一行,选了2门课的用户会在结果里出现2次,和原始数据的唯一主键对应。
2. 数据处理逻辑不同
- SQL1借助
COUNT()聚合函数做统计:通过嵌套CASE判断每个用户是否选过某门课,只要选过就标记为'o',最终一行里集中展示该用户所有已选课程的标记,未选课程对应列则为NULL。比如选了SQL和UNIX的Tom,结果里他的SQL、UNIX列是'o',Java列是NULL。 - SQL2无聚合函数,仅做行级判断:分组后直接对每组的
course字段做匹配,每一行只会在对应课程列显示'○',其余列均为NULL。比如Tom的两条结果记录,一条是SQL列'○'、其余为NULL,另一条是UNIX列'○'、其余为NULL。
3. 结果集形态差异明显
以测试数据为例:
- SQL1的结果是5行(对应5个不同用户):
| name | SQL | UNIX | Java |
|---|---|---|---|
| Tom | o | o | NULL |
| Jack | o | NULL | NULL |
| Mike | o | NULL | o |
| Jane | NULL | o | NULL |
| Mary | o | NULL | NULL |
- SQL2的结果是7行(和原始数据行数一致):
| name | s | u | j |
|---|---|---|---|
| Tom | ○ | NULL | NULL |
| Tom | NULL | ○ | NULL |
| Jack | ○ | NULL | NULL |
| Mike | ○ | NULL | NULL |
| Mike | NULL | NULL | ○ |
| Jane | NULL | ○ | NULL |
| Mary | ○ | NULL | NULL |
内容的提问来源于stack exchange,提问作者useryy
相关产品推荐
相关产品推荐

