查询各分数段人数设计视图_MySQL多表查询学习

本文介绍了SQL多表查询的学习,包括表的联结、CASE WHEN表达式等,通过实际例子讲解如何查询各分数段人数、平均成绩、学生选课情况以及课程的及格和不及格人数。同时,提到了如何设计视图来统计各科成绩的分段人数。
摘要由CSDN通过智能技术生成

SQL多表查询学习主要包括下列知识点:

  • 表的加法
  • 表的联结(包括:交叉联结、内联结、左联结、右联结、全联结)
  • case when的表达式

36f9c6d1c3b6f6073d0c1c71b43fe22d.png
  • 内联结、左联结、右联结的示意文氏图:

935c62b20d19758a8ac753af60b88a39.png

联结练习:

1、查询所有学生的学号、姓名、选课数、总成绩

STEP1:翻译问题成大白话

  • 学号和姓名在student表中;
  • 选课数:每个学生所选课的数量,可在score表中按学号分组用count计数课程号;
  • 总成绩:每个学生的总成绩,在score表中按学号分组用sum计算成绩总和;

STEP2:分析思路

dd959ec8188f507bfff0fd40a3b45e54.png

STEP3:写出对应sql子句

select x.学号,x.姓名,count(y.课程号) as '选课数' ,sum(y.成绩) as '总成绩'
from student as x left join score as y 
on x.学号=y.学号
group by x.学号

3c04585f4b451fd9f786111a1c2c1640.png

2、查询平均成绩大于85的所有学生的学号、姓名和平均成绩

STEP1:翻译问题成大白话

查询所有学生的学号、姓名和平均成绩,且平均成绩是大于85的。

STEP2:分析思路

05813cb39f0decddfd536ed2ec74ed08.png

STEP3:写出对应sql子句

select x.学号,x.姓名,avg(y.成绩) as '平均成绩'
from student as x left join score as y 
on x.学号=y.学号
group by x.学号
having avg(y.成绩) >85

79718bf62ec3d9424084e568f5832841.png

3、查询学生的选课情况:学号,姓名,课程号,课程名称

STEP1:翻译问题成大白话

查询每个学生的学号、姓名、所选课程的课程号和课程名称。

STEP2:分析思路

85822a51bc139a6e28e253825bc1b127.png

STEP3:写出对应sql子句

select x.学号,x.姓名,y.课程号,z.课程名称
from student as x inner join score as y on x.学号=y.学号
inner join course as z on y.课程号=z.课程号

386d7bc248f1a8fe80ca84b426bd8f2a.png

4、查询出每门课程的及格人数和不及格人数

STEP1:翻译问题成大白话

查询出每门课程的及格人数和不及格人数

STEP2:分析思路

5241f640f6fdc7f73c2a28755c819f3b.png

及格人数=sum(case when 成绩>=60 then 1 else 0 end) as '及格人数'

不及格人数=sum(case when 成绩<60 then 1 else 0 end) as'不及格人数'

STEP3:写出对应sql子句

select 课程号,
sum(case when 成绩>=60 then 1 else 0 end) as '及格人数',
sum(case when 成绩<60 then 1 else 0 end) as '不及格人数'
from score
group by 课程号

15fe7881144934b1afb7c5022cff530e.png

5、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计:各分数段人数,课程号和课程名称

STEP1:翻译问题成大白话

查询每个课程号及课程名称的各分段人数

STEP2:分析思路

cb864426ecc27b3d88ae42efd19335c0.png

各分数段人数:

sum( case when 成绩 bet2een 85 and 100 then 1 else 0 end) as '[100-85]',

sum( case when 成绩>= 70 and 成绩<85 then 1 else 0 end) as '[85-70]',

sum( case when 成绩 >= 60 and 成绩<70 then 1 else 0 end) as '[70-60]',

sum( case when 成绩 <60 then 1 else 0 end) as '[<60]',

STEP3:写出对应sql子句

select x.课程号, y.课程名称,
sum(case when 成绩 between 85 and 100 then 1 else 0 end) as '[100-85]', 
sum(case when 成绩>= 70 and 成绩<85 then 1 else 0 end) as '[85-70]', 
sum(case when 成绩 >= 60 and 成绩<70 then 1 else 0 end) as '[70-60]', 
sum(case when 成绩 <60 then 1 else 0 end) as '[<60]'
from score as x RIGHT JOIN course as y 
on x.课程号=y.课程号
group by x.课程号,y.课程名称

1bcf4e8ed76a82de23e607dafee97d06.png

sqlzoo多表查询练习:

29e4b0ccbedb0db25195e3e01c0e413d.png

abd2c5373eaf10e8cfec60cc70f9716c.png

43671e785b29213e1b4f1e9d43867206.png

d9e0d8e2097bb220caf26858f6a88330.png

bdf33796a7c9a8c07c1c383c6139b259.png

ef3728d3b4d3ce61789d265728aafc2f.png

b294fea3bb7f7b9e2735a39307f5bc8b.png

74a40f68557e4c245d52bbd6db847ca4.png

7f7cfbf58f818c0403c7067bf6b82a41.png

1416cb67d9b42900c8171124e9c1d6a5.png

b569374a14e84f5e71e8e9b0c5b98aae.png

c851f032689b68addee19a0063542c0f.png

53a8351d87ccca03bc6d895adc4abc2b.png
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值