返回

小牛说SQL之高级查询范例

后端

高级 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 的理解,为你在数据分析和数据库管理方面的成功之路奠定坚实的基础。

常见问题解答

  1. 这些 SQL 查询可以用于哪些数据库?
    这些查询在支持窗口函数和分组的任何关系数据库管理系统(如 MySQL、PostgreSQL、Oracle)中都可以使用。
  2. 如何优化这些查询以提高性能?
    使用索引、窗口函数和分组优化器可以显著提高查询速度。
  3. 这些查询可以解决哪些实际问题?
    这些查询可用于从学生数据中提取有价值的见解,例如识别表现最好的学生、评估教师的绩效,或分析销售趋势。
  4. 我怎样才能进一步提高我的 SQL 技能?
    除了解决 SQL 难题,还要参加在线课程、阅读教程并参与社区讨论。
  5. 还有什么方法可以查询最高值或计算平均值?
    最高值可以使用 MAX() 函数查询,而平均值可以使用 AVG() 函数计算。