班级表:class | 学生表:student | ||||||
---|---|---|---|---|---|---|---|
cid | caption | sid | sname | gender | class_id | ||
1 | 三年二班 | 1 | 张三 | 女 | 1 | ||
2 | 一年三班 | 2 | 李四 | 女 | 1 | ||
3 | 三年一班 | 3 | 王五 | 男 | 2 |
老师表:teacher | 课程表:course | ||||||
---|---|---|---|---|---|---|---|
tid | tname | cid | cname | teacher_id | |||
1 | 马云 | 1 | 生物 | 1 | |||
2 | 马化腾 | 2 | 体育 | 1 | |||
3 | 俞敏洪 | 3 | 物理 | 2 |
成绩表:score | |||
---|---|---|---|
sid | student_id | course_id | number |
1 | 1 | 1 | 58 |
2 | 1 | 2 | 68 |
3 | 2 | 2 | 89 |
AAA 查询课程2比课程1成绩低的学号
查询课程编号“2”的乘积比课程编号“1”低的所有同学的学号、姓名。
BBB 查询没有学全所有课的学生
查询没有学全所有课的同学的学号、姓名
思路分析
查询课程编号“2”的乘积比课程编号“1”低的所有同学的学号、姓名。
- 使用with语句,创建了一个名为t1的临时表,其中包含两个字段:学生id和体育成绩(如果课程id为2),以及生物成绩(如果课程id为1)。同时使用sum函数对成绩进行求和,并使用if函数进行条件判断。
- 在t1中使用group by语句对学生id进行分组,并使用having语句筛选出体育成绩小于生物成绩的学生。
- 最后使用join语句将t1与student视图进行关联,输出学生id和姓名。
查询没有学全所有课的同学的学号、姓名
- 首先使用with语句创建了一个名为t1的临时表,其中包含三个字段:学生id,姓名和选修课程数目。
- 在t1中使用left join语句将学生表和成绩表关联,通过学生id进行连接,统计每个学生选修的课程数目。注意使用left join而不是inner join,以便包含选修课程数为0的学生。
- 在t1中使用group by语句对学生id和姓名进行分组,以便统计每个学生选修的课程数目。
- 然后使用with语句创建了一个名为t2的临时表,其中包含一个字段:所有课程的数目。
- 在t2中使用count函数统计了所有课程的数目。
- 最后使用join语句将t1与t2进行关联,并使用where语句筛选出选修课程数目小于所有课程数目的学生,输出学生id和姓名。
答案获取
建议你先动脑思考,动手写一写再对照看下答案,如果实在不懂可以点击下方卡片,回复:大厂sql
即可。
参考答案适用HQL,SparkSQL,FlinkSQL,即大数据组件,其他SQL需自行修改。
加技术群讨论
点击下方卡片关注 联系我进群
或者直接私信我进群
文末SQL小技巧
提高SQL功底的思路。
1、造数据。因为有数据支撑,会方便我们根据数据结果去不断调整SQL的写法。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
战项目、大纲路线、讲解视频,并且后续会持续更新**