SQL面试必备:经典GROUP BY题目解析

需积分: 33 2 下载量 106 浏览量 更新于2024-10-15 收藏 50KB DOC 举报
"这篇资料是关于SQL语句面试题的总结,主要涵盖了如何在面试中解答涉及`GROUP BY`操作的问题。" 在SQL面试中,处理分组数据是常见的问题,这里提供了一个例子来说明如何根据日期(rq)和胜负(shengfu)字段进行统计。目标是得到每日期(rq)的胜场(胜)和负场(负)的总数。 首先,我们来看第一种解决方案: ```sql 1) SELECT rq, SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) '负' FROM #tmp GROUP BY rq; ``` 在这个查询中,我们利用了`CASE`表达式对`shengfu`字段进行条件判断,将每个“胜”转化为1,“负”转化为0,然后通过`SUM`函数对每种结果进行累加。`GROUP BY rq`语句确保了按日期进行分组,使得统计结果按日期分别显示胜和负的场次。 第二种方法采用的是子查询和内连接: ```sql 2) SELECT N.rq, N.勝, M.負 FROM ( SELECT rq, 勝 = COUNT(*) FROM #tmp WHERE shengfu = '胜' GROUP BY rq) N INNER JOIN ( SELECT rq, 負 = COUNT(*) FROM #tmp WHERE shengfu = '负' GROUP BY rq) M ON N.rq = M.rq; ``` 这个方法先分别计算出每个日期的胜场和负场,然后通过内连接将这两个子查询的结果合并,基于相同日期的`rq`匹配在一起。 第三种方式同样使用了子查询,但这次是在同一查询中处理胜场和负场的计数: ```sql 3) SELECT a.rq, a.a1 胜, b.b1 负 FROM ( SELECT rq, COUNT(rq) a1 FROM #tmp WHERE shengfu = '胜' GROUP BY rq) a, ( SELECT rq, COUNT(rq) b1 FROM #tmp WHERE shengfu = '负' GROUP BY rq) b WHERE a.rq = b.rq; ``` 这个查询与第二种方法类似,只是将两个子查询放在同一个SELECT语句中,然后通过`WHERE`子句确保子查询的结果可以正确匹配。 除了上述题目,面试中还可能遇到其他类型的SQL查询问题,例如涉及`JOIN`、`WHERE`、`HAVING`、`PIVOT`、`UNION`、`INTERSECT`、`EXCEPT`等操作,或者是复杂的联接、子查询嵌套、窗口函数等。理解并熟练运用这些SQL语句对于解决实际问题至关重要,也是面试中常被考察的技能。 在面对涉及表的AB、C三列的查询问题时,通常需要根据具体需求来设计SQL语句。例如,如果需要找出所有A列不为空且B列和C列都相同的行,可以使用如下查询: ```sql SELECT A, B, C FROM 表 WHERE A IS NOT NULL AND (B, C) IN ( SELECT B, C FROM 表 GROUP BY B, C HAVING COUNT(*) > 1 ); ``` 这将返回所有A非空且B、C值重复出现的记录。 掌握SQL语言的关键在于理解和实践各种查询语法,以及灵活应用它们来满足特定的数据分析和业务需求。面试时,除了对基本语法的掌握,对性能优化、数据建模和数据库设计的理解也非常重要。