一个简单的SQL面试题

最近面试遇到一个SQL题,复述如下:

SQL面试题

现在有两张表,结构如下:

学生表(student)

学号sid 姓名name
1 张三
2 李四
3 王五

成绩表(score)

序号id 学号sid 科目subject 分数score
1 1 语文 80
2 1 数学 90
3 2 语文 85
4 2 数学 100
5 3 语文 70
6 3 数学 60
  1. 写一个SQL,查出每个人的总分,并按倒序排列。输出字段如下:
姓名 总分
  1. 最近学校要举行乒乓球运动会,准备采用循环赛,即每个人都与其他人都要比赛。写一个SQL列出每一场比赛的参赛人员,按顺序输出。
A组 B组

解答

  1. 考虑到成绩表中都是单科成绩,这里需要查询总成绩,那就先汇总计算总成绩;输出还要显示姓名,就在外层查询中关联查询姓名:
SQL 复制代码
select s.name as '姓名', total as '总分' from student s left join (
   select sid, sum(score) as total from score group by sid
) t on s.id = t.sid order by total desc;

还可以直接关联查询:

SQL 复制代码
select name as '姓名', sum(`score`) as '总分' from student u, `score` s 
where u.id = s.sid group by s.sid order by sum(score) desc;

输出结果:

复制代码
+----+-----+
|name|total|
+----+-----+
|李四  |  185|
|张三  |  170|
|赵六  |  138|
|王五  |  130|
+----+-----+
  1. 既然要输出全部循环数据,那可以考虑使用join
SQL 复制代码
select a.name as 'A组', b.name as 'B组' from student a join student b on a.id!=b.id;

输出结果:

复制代码
+----+-----+
|A组|B组|
+----+-----+
|赵六  |张三  |
|王五  |张三  |
|李四  |张三  |
|赵六  |李四  |
|王五  |李四  |
|张三  |李四  |
|赵六  |王五  |
|李四  |王五  |
|张三  |王五  |
|王五  |赵六  |
|李四  |赵六  |
|张三  |赵六  |
+----+-----+

注意,上述输出中包含两条张三和李四的记录,即每个人作为A组比赛一次,作为B组再比赛一次。如果两个人只比赛一次,可以考虑利用id大小进行去重。

SQL 复制代码
select a.name as 'A组', b.name as 'B组' from student a join student b on a.id<b.id;

输出结果:

复制代码
+----+-----+
|A组|B组|
+----+-----+
|张三|李四|
|张三|王五|
|张三|赵六|
|李四|王五|
|李四|赵六|
|王五|赵六|
+----+-----+

平时使用join写SQL时一般使用的等值连接,即在on后面紧跟着表的主键等于另一个表的某一列,很少使用不等于或其他比较操作符判断。在语法上,可以使用等值连接以外的方式,这种类型的连接被称为非等值连接或范围连接。但在实际应用中,使用非等值连接可能会导致较大的中间结果集,特别是在数据量大的情况下,这可能会影响查询性能。故不推荐使用!!!

相关推荐
疯狂的挖掘机6 小时前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
奇树谦7 小时前
Qt | 利用map创建多个线程和定时器
网络·数据库·qt
用户47949283569157 小时前
性能提升 4000%!我是如何解决 运营看板 不能跨库&跨库查询慢这个难题的
数据库·后端·postgresql
电商API&Tina7 小时前
跨境电商 API 对接指南:亚马逊 + 速卖通接口调用全流程
大数据·服务器·数据库·python·算法·json·图搜索算法
robinson19887 小时前
验证崖山数据库标量子查询是否带有CACHE功能
数据库·oracle·cache·自定义函数·崖山·标量子查询
老华带你飞8 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
SelectDB8 小时前
5 倍性能提升,Apache Doris TopN 全局优化详解|Deep Dive
数据库·apache
JIngJaneIL9 小时前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
陈平安安9 小时前
设计一个秒杀功能
java·数据库·sql
isNotNullX9 小时前
数据处理的流程是什么?如何进行数据预处理?
数据库·数据资产管理·数据处理·企业数字化