SQL面试必备:经典GROUP BY题目解析
需积分: 33 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语言的关键在于理解和实践各种查询语法,以及灵活应用它们来满足特定的数据分析和业务需求。面试时,除了对基本语法的掌握,对性能优化、数据建模和数据库设计的理解也非常重要。
696 浏览量
403 浏览量
181 浏览量
238 浏览量
2023-05-17 上传
176 浏览量
273 浏览量
283 浏览量
135 浏览量
kanty_fly
- 粉丝: 3
- 资源: 10
最新资源
- 编程语言\java\大学课件JAVA\学习java\Java学习
- 编程新手真言(pdf)
- Struts+in+Action+中文修正版(pdf)
- Hibernate 开发指南(pdf)
- C#编程小技巧和注意事项
- C#完全手册 编程必备
- ibatis中文参考资料
- vs.net使用技巧
- Apress.Pro.Wicket.2006
- TurboCRM 客户关系管理系统解决方案的分析.doc
- jsp的上传与下载说明文档
- ASP.NET 复习
- linux 核心游记 1.0
- MyEclipse6中安装FLEX插件的过程.pdf
- MyEclipse 6 Java 开发中文教程
- CDMA基础资料NOKIA内部资料