文章目录
- 1.表一及相关题目
- 查询class1班级英语平均分与class2中英语平均分的差值
- 查询各班级法语成绩中低于班级法语平均分的人员个数
- 查询每个班级中英语成绩最好的同学,结果输出:班级、姓名、分数
- 对所有班级的同学英语成绩进行从高往低的排序,结果输出:排名 班级 姓名 分数
- 2.表二及相关题目
- 模块1>=60&模块2>=60 为通过,多次考试有一次通过为通过,查询结果显示如下(输出多次成绩中模块一加模块二成绩最高的)
- 3.表三及相关题目(两表联合查询)
- 查询订单申请时间在2020年4月份和5月份各申请人的合计订单总额,结果以订单总额降序排序
- 去除英国、法国的订单,查询各年月的订单申请总额
- 4.表四及相关题目(两表联合查询)
- 查询2020年,每月的销售额,以及同比环比,并按照年月进行升序排序
- 查询2020年起,每月的累计销售额
1.表一及相关题目
score表
查询class1班级英语平均分与class2中英语平均分的差值
SELECT score1-score2 差值 FROM
(SELECT ROUND(AVG(`GRADE`),2) score1 FROM `score` WHERE `COURSE`='English' AND `CLASSNO`='Class1') avgsc1,
(SELECT ROUND(AVG(`GRADE`),2) score2 FROM `score` WHERE `COURSE`='English' AND `CLASSNO`='Class2') avgsc2;
查询各班级法语成绩中低于班级法语平均分的人员个数
//创建只有法语成绩的视图
CREATE VIEW fren_score AS (SELECT * FROM score WHERE `COURSE`='French');
//根据fren_score视图进行查询
SELECT fren_score.`CLASSNO`,COUNT(1) FROM fren_score
JOIN (SELECT `CLASSNO`,AVG(`GRADE`) avgf FROM fren_score GROUP BY `CLASSNO`) fren01
ON fren_score.`CLASSNO`=fren01.`CLASSNO` AND fren_score.`GRADE`<fren01.avgf
GROUP BY fren_score.`CLASSNO`;
查询每个班级中英语成绩最好的同学,结果输出:班级、姓名、分数
//创建只有英语成绩的视图
CREATE VIEW eng_score AS (SELECT * FROM `score` WHERE `COURSE`='English');
SELECT e1.`CLASSNO` '班级',e1.`NAME` '姓名',e1.`GRADE` '分数' FROM eng_score e1
LEFT JOIN eng_score e2 ON e1.`CLASSNO`=e2.`CLASSNO` AND e2.`GRADE`>= e1.`GRADE`
GROUP BY e1.`STUDENTNO`
HAVING COUNT(1)=1;
对所有班级的同学英语成绩进行从高往低的排序,结果输出:排名 班级 姓名 分数
SELECT `CLASSNO` '班级',`NAME`'姓名',`GRADE` '分数',(@i:=@i+1) '排名' FROM eng_score,(SELECT @i:=0) i
ORDER BY `GRADE` DESC;
2.表二及相关题目
score2表
模块1>=60&模块2>=60 为通过,多次考试有一次通过为通过,查询结果显示如下(输出多次成绩中模块一加模块二成绩最高的)
查询结果
//分别查询通过并显示最高成绩和未通过显示最高成绩,并用连接
(SELECT sc2.`id` '考试编号',sc2.`name` '姓名',sc2.`score1` '模块1考试成绩',sc2.`score2` '模块2考试成绩',
'考试通过' AS '考试结果' FROM
(SELECT `name`,MAX(score1+score2) max_sc FROM score2 WHERE `score1`>=60 AND`score2`>=60 GROUP BY `name`) sc1
JOIN score2 sc2 ON sc1.`name`=sc2.`name` AND (sc1.max_sc=sc2.score1+sc2.score2)
)
UNION
(SELECT sc2.`id` '考试编号',sc2.`name` '姓名',sc2.`score1` '模块1考试成绩',sc2.`score2` '模块2考试成绩',
'考试未通过' FROM
(SELECT `name`,MAX(score1+score2) max_sc FROM score2 WHERE `name` NOT IN
(SELECT `name` FROM `score2` WHERE `score1`>=60 AND`score2`>=60 GROUP BY `name`)
GROUP BY `name`) sc1
JOIN score2 sc2 ON sc1.`name`=sc2.`name` AND (sc1.max_sc=sc2.score1+sc2.score2)
);
3.表三及相关题目(两表联合查询)
order_info表
sh_order表
查询订单申请时间在2020年4月份和5月份各申请人的合计订单总额,结果以订单总额降序排序
SELECT s.`or_customer` '申请人', SUM(`num`*`price`) '总价' FROM `order_info` o JOIN `sh_order` s ON o.`id`=s.`id` WHERE YEAR(`or_date`)='2020' AND MONTH(`or_date`) IN (4,5)
GROUP BY `or_customer`
ORDER BY SUM(`num`*`price`) DESC;
去除英国、法国的订单,查询各年月的订单申请总额
SELECT DATE_FORMAT(`or_date`,'%Y-%m'), SUM(`num`*`price`) '总价' FROM `order_info` o JOIN `sh_order` s ON o.`id`=s.`id` WHERE `country` NOT IN('英国','法国')
GROUP BY DATE_FORMAT(`or_date`,'%Y-%m')
ORDER BY SUM(`num`*`price`) DESC;
4.表四及相关题目(两表联合查询)
pro_info表
sale_info表
查询2020年,每月的销售额,以及同比环比,并按照年月进行升序排序
//创建以月份为维度的销售额视图
CREATE VIEW sale_month AS
(SELECT YEAR(s.`sale_time`) s_year,MONTH(s.`sale_time`) s_month,SUM(p.`price`*s.`num`) s_total
FROM `pro_info` p JOIN `sale_info` s ON p.`pid`=s.`pid`
GROUP BY DATE_FORMAT(s.`sale_time`,'%Y-%m') ORDER BY DATE_FORMAT(s.`sale_time`,'%Y-%m'));
SELECT CONCAT(s1.s_year,'-',s1.s_month) '时间', s1.s_total '销售额',((s1.s_total-s2.s_total)/s1.s_total) '环比',
((s1.s_total-s3.s_total)/s1.s_total)'同比' FROM sale_month s1
LEFT JOIN sale_month s2 ON (s1.s_year=s2.s_year AND s1.s_month=s2.s_month+1) OR(s1.s_year=s2.s_year+1 AND s1.s_month=s2.s_month-11)
LEFT JOIN sale_month s3 ON s1.s_year=s3.s_year+1 AND s1.s_month=s3.s_month;
查询2020年起,每月的累计销售额
//通过sql引用变量实现销售额累计
SELECT CONCAT(s_year,'-',s_month) '时间',(@sale_sum:=@sale_sum+s_total) '累计销售额' FROM sale_month ,(SELECT @sale_sum:=0) sale_sum WHERE s_year=2020;