返回
小牛说SQL之高级查询范例
后端
2023-08-11 17:38:26
高级 SQL 查询:牛客上的“高级查询之 SQL16、SQL17”
牛客网上“高级查询之 SQL16、SQL17”部分为 SQL 爱好者提供了宝贵的学习机会。这些题目不仅可以测试你的 SQL 知识,还能传授实用的技巧,让你在数据处理领域游刃有余。
SQL16:查询最高值
任务: 在 student 表中,找出 GPA 最高的那位同学及其个人信息。
挑战: 除了查找最高 GPA,你还需要获取该学生的其他详细信息,如姓名和学号。
解决方案:
SELECT * FROM student WHERE GPA = (SELECT MAX(GPA) FROM student);
这种方法简单明了,但效率不高。子查询必须扫描整个 student 表,才能找到 GPA 最高的那位同学。
更优解决方案(使用窗口函数):
SELECT * FROM (
SELECT *, RANK() OVER (ORDER BY GPA DESC) AS rnk
FROM student
) AS t
WHERE rnk = 1;
窗口函数 RANK() 可对 student 表中的同学按 GPA 降序排序,并分配排名。然后,我们筛选排名为 1 的同学,即 GPA 最高的那位。
SQL17:计算男生人数及平均 GPA
任务: 计算 student 表中男同学的人数和平均 GPA。
挑战: 你必须同时计算这两个值,并考虑学生可能存在多种性别的情况。
解决方案:
SELECT COUNT(*) AS male_count, AVG(GPA) AS male_avg_gpa
FROM student
WHERE gender = 'male';
这种方法只能计算男生数量和平均 GPA,但不能同时获得这两个值。
更优解决方案(使用分组):
SELECT gender, COUNT(*) AS student_count, AVG(GPA) AS avg_gpa
FROM student
GROUP BY gender
HAVING gender = 'male';
GROUP BY 按性别分组,并计算每个组的同学人数和平均 GPA。HAVING 子句用于过滤性别为 male 的组。
其他有趣的 SQL 查询
SQL16 和 SQL17 只是牛客上众多 SQL 查询题目中的两个例子。其他精彩的题目包括:
- 计算每门课程的最高分和最低分
- 查找在多门课程中获得 A+ 的学生
- 找出成绩位于班级前 10% 的学生
- 统计每个部门的平均工资
- 找出购买次数最多的客户
总结
牛客上的“高级查询之 SQL16、SQL17”部分是一个磨练 SQL 技能和掌握高级技巧的宝贵资源。通过解决这些难题,你可以增强对 SQL 的理解,为你在数据分析和数据库管理方面的成功之路奠定坚实的基础。
常见问题解答
- 这些 SQL 查询可以用于哪些数据库?
这些查询在支持窗口函数和分组的任何关系数据库管理系统(如 MySQL、PostgreSQL、Oracle)中都可以使用。 - 如何优化这些查询以提高性能?
使用索引、窗口函数和分组优化器可以显著提高查询速度。 - 这些查询可以解决哪些实际问题?
这些查询可用于从学生数据中提取有价值的见解,例如识别表现最好的学生、评估教师的绩效,或分析销售趋势。 - 我怎样才能进一步提高我的 SQL 技能?
除了解决 SQL 难题,还要参加在线课程、阅读教程并参与社区讨论。 - 还有什么方法可以查询最高值或计算平均值?
最高值可以使用 MAX() 函数查询,而平均值可以使用 AVG() 函数计算。