每日一题-76(学生们参加各科测试的次数)

题76:

根据下表:写一段 SQL 语句,查询出每个学生参加每一门科目测试的次数,结果按 student_id 和 subject_name 排序。
在这里插入图片描述
其中:

  • Students表:主键为 student_id(学生ID),该表内的每一行都记录有学校一名学生的信息;
  • Subjects表:主键为 subject_name(科目名称),每一行记录学校的一门科目名称;
  • Examinations表:无主键,可能存在重复行;学生表里的一个学生修读科目表里的每一门科目,而这张考试表的每一行记录就表示学生表里的某个学生参加了一次科目表里某门科目的测试。

解题思路:
(1)现将Students表和Subjects表求笛卡尔积,得到一个新表;
(2)然后再左连接Examinations表;
(3)根据需要查询想要的字段;
(4)注意的是这里不能用COUNT(*),要用COUNT(c.subject_name),因为e.subject_name中才有NULL。

select a.student_id ,a.student_name ,b.subject_name,count(c.subject_name) attended_exams
from Students a 
cross join Subjects b
    left join Examinations c 
    on a.student_id = c.student_id and b.subject_name = c.subject_name
group by a.student_id , b.subject_name 
order by a.student_id , b.subject_name ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值