参考源:上海-悠悠的博客
非常重要的是:仅作为自己的笔记,笔者小白,思路蛮混乱的,轻易勿参考

创建表

create table if not exists student(
id int unsigned primary key auto_increment,
name char(32) not null,
age int(32) not null
)engine = innodb auto_increment = 1001 default charset = utf8;create table if not exists grade(
no int unsigned primary key auto_increment,
id int not null,
kemu char(32) not null,
score int not null
)engine = innodb default charset = utf8;

写入数据

insert student(name, age) values ("zhang3", 18), ("zhang4", 19), ("zhang5", 20), ("zhang6", 19);insert grade(id, kemu, score) values (1001, "语文", 85), (1001, "数学", 86), (1002, "英语", 98), (1002, "语文", 94), (1002, "数学", 98), (1003, "数学", 56), (1003, "语文", 69), (1003, "英语", 68), (1004, "英语", 99), (1004, "数学", 97);

表格效果:

学生表,表名:student

成绩表,表名:grade

下边开始都是题~~~~~~~都是哦~~~~~~~~~~

1. 查询所有学生的数学成绩,显示学生姓名name, 分数, 由高到低
/* 思路1:成绩表中选择数据,条件是科目等于数学,按照字段成绩进行排序desc,输出选择结果;学生表作为A表,和刚才输出结果连接 */
select s.name, temp.score from student s
left join
(select g.id, g.score from grade g where g.kemu = "数学") temp
on s.id = temp.id
order by temp.score desc;/* 思路2:从两个表里选择,条件是id相等,and科目等于数学,然后进行排序,再输出选择结果; */
select a.name, b.score
from student a, grade b
where a.id = b.id
and b.kemu = "数学"
order by b.score desc;

2. 统计每个学生的总成绩,显示字段:姓名,总成绩
/* 思路:成绩表中根据id字段分组求和,选择数据id以及求和后的值作为temp表;学生表和此表左连接 */
select a.name, temp.sum_score as 总分 from student a
left join
(select b.id, sum(b.score) as sum_score from grade b
group by b.id) temp
on a.id = temp.id

3. 统计每个学生的总成绩(由于学生可能有重复名字),显示字段:学生id,姓名,总成绩
select a.id 学生id, a.name 姓名, temp.sum_score 总成绩 from student a
left join
(select b.id, sum(b.score) as sum_score from grade b
group by b.id) temp
on a.id = temp.id;

4. 列出各门课程成绩最好的学生, 要求显示字段: 学号,姓名,科目,成绩
SELECT c.id , a.name, c.kemu, c.score
FROM grade c, student a,
(SELECT b.kemu, MAX(b.score) as max_score
FROM grade b
GROUP BY kemu) t
WHERE c.kemu = t.kemu
AND c.score = t.max_score
AND a.id = c.id;select s.name, g.id, t.kemu, t.max_score
from student s
left join grade g
on s.id = g.id
left join
(select g.kemu, max(g.score) as max_score from grade g group by g.kemu) t
on t.kemu = g.kemu
where g.score = t.max_score;/*  思路:按照科目分组,选择max成绩,条件是当成绩=Max(),再左连接取出来对应的学生姓名 */
select s.name, g.id, t.kemu, t.max_score
from
(select g.kemu, max(g.score) as max_score from grade g group by g.kemu) t
left join grade g
on g.kemu = t.kemu
left join student s
on s.id = g.id
where g.score = t.max_score;

5. 列出各门课程成绩最好的2位学生, 要求显示字段: 学号,姓名, 科目,成绩
SELECT t1.id, a.name, t1.kemu,t1.score
FROM grade t1, student a
WHERE(SELECT count(*) FROM grade t2 WHERE t1.kemu=t2.kemu AND t2.score>t1.score)<2
and a.id = t1.id
ORDER BY t1.kemu,t1.score
DESCselect s.name, g1.id, g1.kemu, g1.score
from grade as g1
join student s
on s.id = g1.id
where (select count(*) from grade g2 where g1.kemu = g2.kemuand g2.score > g1.score) <2
order by g1.kemu, g1.score desc;/* 思路:从成绩表中拿出来 科目相等时,张三成绩>=李四,只需要两行就OK;和名字左连接 */
select a.id, a.name, b1.kemu, b1.score
from student a, grade b1
where
(select count(*) from grade b2 where b1.kemu = b2.kemu and b2.score >=b1.score)<=2
and a.id = b1.id
order by b1.kemu

6. 计算每个人的平均成绩, 要求显示字段: 学号,姓名,平均成绩
/*思路: 成绩表按学号分组,平均成绩拿出来,搞成一张临时表,再和学生表左联,把名字搞进来 */
select t.id, s.name, t.avg_score
from (select g.id, avg(g.score) as avg_score from grade g group by g.id) t
left join
student s
on s.id = t.id;

7. 计算每个人的成绩,总分数,平均分,要求显示:学号,姓名,语文,数学,英语,总分,平均分
/* 7.计算每个人的成绩,总分数,平均分,要求显示:学号,姓名,语文,数学,英语,总分,平均分
思路:哎呀看答案了,case when 不咋会-----下边包括学习的过程 */select a.id as 学号, a.name as 姓名,
sum(case when b.kemu = "语文" then score else 0 end) as 语文,
sum(case when b.kemu = "数学" then score else 0 end) as 数学,
sum(case when b.kemu = "英语" then score else 0 end) as 英语,
sum(b.score) as 总分,
/* sum(b.score)/ count(b.score) */ avg(b.score) as 平均分
from student a, grade b
where a.id = b.id
group by b.id;/* 正确的*/
SELECT a.id as 学号, a.name as 姓名,
sum(case when b.kemu='语文' then score else 0 end) as 语文,
sum(case when b.kemu='数学' then score else 0 end) as 数学,
sum(case when b.kemu='英语' then score else 0 end) as 英语,
sum(b.score) as 总分 ,
sum(b.score)/count(b.score) as 平均分
FROM student a, grade b
where a.id = b.id
GROUP BY b.idselect a.id as 学号, a.name as 姓名,
(case when b.kemu = "语文" then b.score else 0 end) as 语文,
(case when b.kemu = "数学" then b.score else 0 end) as 数学,
(case when b.kemu = "英语" then b.score else 0 end) as 英语
from student a, grade b
where a.id = b.idselect b.id, (case when b.kemu = "语文" then b.score else 0 end) as 语文
from grade b;select a.id 学号, a.name 姓名,
sum(case when b.kemu = "语文" then b.score else 0 end) 语文,
sum(case when b.kemu = "数学" then b.score else 0 end) 数学,
sum(case when b.kemu = "英语" then b.score else 0 end) 英语,
sum(b.score) 总分,
avg(b.score) 平均分
from student a, grade b
where a.id = b.id
group by a.id;

8. 列出各门课程的平均成绩,要求显示字段:课程,平均成绩
/*思路:根据科目分组,avg() */
select a.kemu 课程, avg(a.score) as 平均成绩
from grade a
group by a.kemu;

9. 列出数学成绩的排名, 要求显示字段:学号,姓名,成绩,排名
/* 列出所有成绩排名,相同成绩排名相同 */
select *,
(select count(distinct score) from grade as b where a.score <= b.score)  as rank
from grade as a
order by rank/* 列出数学成绩的排名,相同成绩排名相同 */
SELECT a.id, s.name, a.kemu, a.score,
(SELECT count(DISTINCT score) FROM (select * from grade t where t.kemu = "数学") AS b WHERE a.score<=b.score) AS rank
FROM (select * from grade t where t.kemu = "数学") a
left join student s
on a.id = s.id
ORDER BY rank; select count(distinct score) from grade a
select count(score) from grade a/* 列出数学成绩的排名,相同成绩排名相同 */
select a.id, a.name, b.kemu, b.score,
if (@prevRank = b.score, @curRank, @curRank := @curRank + 1) as rank
from student a, grade b,
(select @curRank := 0, @prevRank := null) r
where b.kemu = "数学"
and b.id = a.id
order by b.score desc;

10. 列出数学成绩前3名的学生(要求显示字段:学号,姓名, 科目,成绩)
/* 思路:当科目等于数学,从成绩表拿出来学号,科目,成绩,并根据成绩排名,然后和学生表左连得到名字 */
select t.id, b.name, t.kemu, t.score
from
(select a.id, a.kemu, a.score from grade a where a.kemu = "数学" order by a.score desc limit 3) t
left join student b
on t.id = b.id

11. 把题5拿过来放一起
(5. 列出各门课程成绩最好的2位学生, 要求显示字段: 学号,姓名, 科目,成绩)
SELECT t1.id, a.name, t1.kemu,t1.score
FROM grade t1, student a
WHERE(SELECT count(*) FROM grade t2 WHERE t1.kemu=t2.kemu AND t2.score>t1.score)<2
and a.id = t1.id
ORDER BY t1.kemu,t1.score
DESCselect s.name, g1.id, g1.kemu, g1.score
from grade as g1
join student s
on s.id = g1.id
where (select count(*) from grade g2 where g1.kemu = g2.kemuand g2.score > g1.score) <2
order by g1.kemu, g1.score desc;/* 思路:从成绩表中拿出来 科目相等时,张三成绩>=李四,只需要两行就OK;和名字左连接 */
select a.id, a.name, b1.kemu, b1.score
from student a, grade b1
where
(select count(*) from grade b2 where b1.kemu = b2.kemu and b2.score >=b1.score)<=2
and a.id = b1.id
order by b1.kemu

12. 查询数学成绩第2和第3名的学生
/* 思路:第2-3条记录,那么起点就是1, 第2-3名有2条记录,那么第二个参数就是2 */
select t.id, b.name, t.kemu, t.score
from
(select a.id, a.kemu, a.score from grade a where a.kemu = "数学" order by a.score desc limit 1, 2) t
left join student b
on t.id = b.id

13. 查询第2名到后面所有的学生数学成绩
/* 思路:还是limit,第二个参数随便写个特别大的 */
select t.id, b.name, t.kemu, t.score
from
(select a.id, a.kemu, a.score from grade a where a.kemu = "数学" order by a.score desc limit 2, 200000) t
left join student b
on t.id = b.id

14. 统计英语课程少于80分的,显示 学号id, 姓名,科目,分数
/* 思路:两个条件:英语,<80 */
select t.id, b.name, t.kemu, t.score
from (select a.id, a.kemu, a.score from grade a where a.kemu ="英语" and a.score < 80) t
left join student b
on t.id = b.id

15. 统计每门课程不及格、一般、优秀;显示:课程 不及格(<60) 一般(60<= x <=80) 优秀(>80)
select b.kemu,
(select count(*) from grade a where a.score <60 and a.kemu = b.kemu) 不及格,
(select count(*) from grade a where a.score between 60 and 80 and a.kemu = b.kemu) 一般,
(select count(*) from grade a where a.score >80 and a.kemu = b.kemu) 优秀
from grade b
group by b.kemu select b.kemu,
sum(case when b.score between 0 and 59 then 1 else 0 end) as 不及格,
sum(case when b.score between 60 and 80 then 1 else 0 end) as 一般,
sum(case when b.score between 81 and 100 then 1 else 0 end) as 优秀
from grade b
group by b.kemu

MySQL | 常见面试题练手及总结相关推荐

  1. mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题

    1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...

  2. mysql常见面试题及答案_MySQL常见面试题与答案整理

    1.MySQL 中有哪几种锁? 1.表级锁: 开销小, 加锁快: 不会出现死锁: 锁定粒度大, 发生锁冲突的概率最高, 并发度最低. 2.行级锁: 开销大, 加锁慢: 会出现死锁: 锁定粒度最小, 发 ...

  3. MySQL常见面试题及答案汇总1000道(春招+秋招+社招)

    MySQL面试题以及答案整理[最新版]MySQL高级面试题大全(2021版),发现网上很多MySQL面试题都没有答案,所以花了很长时间搜集,本套MySQL面试题大全,汇总了大量经典的MySQL程序员面 ...

  4. Mysql常见面试题(进阶知识点)

    1.常用API insert() lower() upper() trim() reverse() length(字段名) concat(字段名,"随便的字符") 用于字段合并展示 ...

  5. MySQL常见面试题(2023年最新)

    目录 前言 1.char和varchar的区别 2.数据库的三大范式 3.你了解sql的执行顺序吗? 4.索引是什么 5.索引的优点和缺点 6.索引的类型 7.索引怎么设计(优化) 8.怎么避免索引失 ...

  6. MySQL常见面试题汇总(建议收藏!!!)

    目录 一.索引相关 (1)什么是索引? (2)索引是个什么样的数据结构呢? (3)为什么使用索引? (4)Innodb为什么要用自增id作为主键? (5)Hash 索引和 B+ 树索引有什么区别或者说 ...

  7. 程序员面试系列,MySQL常见面试题?

    原文链接 一.索引相关的面试题 (1)索引失效的情况有哪些 在MySQL查询时,以下情况可能会导致索引失效,无法使用索引进行高效的查询: 数据类型不匹配:如果查询条件中的数据类型与索引列的数据类型不匹 ...

  8. MySQL资料总结(下)—— MySQL常见面试题

    mysql 中 myisam 与 innodb 的区别 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL ...

  9. mysql常见面试题(持续更新)

    1.mysql隔离级别有哪些?为什么要设计这几种隔离级别?默认隔离级别是啥?默认价格是如何避免幻读的?有哪些级别用了mvcc?不同级别的mvcc的区别?如果让你来设计,你还会想到其他方式达到这个效果嘛 ...

最新文章

  1. 戴尔科技20.8亿美元出售旗下网络安全业务RSA
  2. 重磅:国家正式出台学术不端行为界定
  3. Qt的Android应用消除启动黑屏
  4. 【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
  5. 智能循迹小车_智能机器人之循迹小车——循迹原理
  6. 《第3选择》学习笔记
  7. 如何自行给指定的SAP OData服务添加自定义日志记录功能
  8. seata xid是什么_阿里开源的分布式事务框架 Seata
  9. mysql数据库如果从C盘迁移到D盘
  10. 捷联惯导数值更新算法-姿态更新+速度更新+位置更新
  11. 【VBA编程】VBA基础语法(一)
  12. 网站上传服务器及安装包,如何上传安装包到服务器
  13. bootstrap bootbox 属性及用法
  14. JS实现 b站直播弹幕自动补中括号、一键常用语脚本
  15. DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战
  16. Vue项目url中的BASE_URL解析
  17. 核密度估计_拔剑-浆糊的传说_新浪博客
  18. 怎么办,linux的常用命令就是记不住?于是每天推一些linux指令实践总结 -1
  19. 四个步骤写一份策划方案(下)
  20. 001 A Comprehensive Survey of Privacy-preserving Federated Learning(便于寻找:FedAvg、垂直联邦学习的基本步骤)

热门文章

  1. 金蝶K3 SQL报表系列-委外核销检查表
  2. Asp.net网站iis设置起始页
  3. 各行业的英语术语(绝对精华3)
  4. 精度、召回率、准确率、F1、ROC、AUC的理解
  5. fudge函数C语言,C语言程序设计-中国大学mooc-题库零氪
  6. 2020年腾讯,阿里,美团等Android高频面试题及答案,2021Android者未来的出路在哪里
  7. hdu 4043 FXTZ II [ 概率 + Java大数]
  8. Android中各种颜色在dawable.xml中的定义
  9. crh寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛
  10. .NetCore外国一些高质量博客分享