SQL面试必备:经典题解析与CASE语句应用

需积分: 16 5 下载量 192 浏览量 更新于2024-10-26 收藏 47KB DOC 举报
"这篇资源是关于SQL面试题的解答,特别是涉及到使用CASE语句的情况。题目要求根据日期和胜负情况统计结果,给出三种不同的SQL解决方案。" 在SQL面试中,理解并熟练运用GROUP BY和CASE语句是非常重要的技能。GROUP BY用于对数据进行分组,而CASE语句则允许我们在SQL查询中实现条件判断,生成计算列或进行复杂的分类。以下是对给定面试题的解析和解答: 1. 第一个解决方案利用了CASE语句来计算每个日期的胜场和负场数量。首先,CASE语句会检查`shengfu`字段是否等于'胜',如果是,则返回1,否则返回0。然后,通过SUM函数对这些值进行求和,得到每个日期的胜场和负场总数。GROUP BY语句按日期`rq`对结果进行分组。 ```sql SELECT rq, SUM(CASE WHEN shengfu = '胜' THEN 1 ELSE 0 END) AS '胜', SUM(CASE WHEN shengfu = '负' THEN 1 ELSE 0 END) AS '负' FROM #tmp GROUP BY rq; ``` 2. 第二种方法使用了子查询和JOIN操作。首先,分别创建两个子查询,一个计算胜场,一个计算负场,然后通过INNER JOIN将这两个结果集连接在一起,基于相同日期`rq`匹配。 ```sql SELECT N.rq, N.勝, M.負 FROM ( SELECT rq, COUNT(*) AS '勝' FROM #tmp WHERE shengfu = '胜' GROUP BY rq ) N INNER JOIN ( SELECT rq, COUNT(*) AS '負' FROM #tmp WHERE shengfu = '负' GROUP BY rq ) M ON N.rq = M.rq; ``` 3. 第三个解答也是通过子查询实现,但这里使用了别名`a`和`b`来表示胜利和失败的计数。每个子查询分别计算了`col002`为'胜'和'负'时,对应的`col001`的计数。然后通过WHERE子句连接这两个结果。 ```sql SELECT a.col001, a.a1 AS '胜', b.b1 AS '负' FROM ( SELECT col001, COUNT(col001) AS a1 FROM temp1 WHERE col002 = '胜' GROUP BY col001 ) a, ( SELECT col001, COUNT(col001) AS b1 FROM temp1 WHERE col002 = '负' GROUP BY col001 ) b WHERE a.col001 = b.col001; ``` 这三种方法虽然结构不同,但都能达到同样的效果,即统计每个日期的胜场和负场。在实际面试中,应根据数据库设计、性能需求和习惯选择合适的解决方案。熟悉这些技术对于SQL开发者来说至关重要,因为它们可以应用于各种数据汇总和分析场景。