mysql练习题
教学视频
1、表结构
| –1.学生表 |
| student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 |
| –2.课程表 |
| course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 |
| –3.教师表 |
| Teacher(t_id,t_name) –教师编号,教师姓名 |
| –4.成绩表 |
| Score(s_id,c_id,s_score) –学生编号,课程编号,分数 |
2、测试数据
| |
| |
| CREATE TABLE `student`( |
| `s_id` VARCHAR(20), |
| `s_name` VARCHAR(20) NOT NULL DEFAULT '', |
| `s_birth` VARCHAR(20) NOT NULL DEFAULT '', |
| `s_sex` VARCHAR(10) NOT NULL DEFAULT '', |
| PRIMARY KEY(`s_id`) |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
| |
| CREATE TABLE `course`( |
| `c_id` VARCHAR(20), |
| `c_name` VARCHAR(20) NOT NULL DEFAULT '', |
| `t_id` VARCHAR(20) NOT NULL, |
| PRIMARY KEY(`c_id`) |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
| |
| CREATE TABLE `teacher`( |
| `t_id` VARCHAR(20), |
| `t_name` VARCHAR(20) NOT NULL DEFAULT '', |
| PRIMARY KEY(`t_id`) |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
| |
| CREATE TABLE `score`( |
| `s_id` VARCHAR(20), |
| `c_id` VARCHAR(20), |
| `s_score` INT(3), |
| PRIMARY KEY(`s_id`,`c_id`) |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
| |
| insert into student values('01' , '赵雷' , '1990-01-01' , '男'); |
| insert into student values('02' , '钱电' , '1990-12-21' , '男'); |
| insert into student values('03' , '孙风' , '1990-05-20' , '男'); |
| insert into student values('04' , '李云' , '1990-08-06' , '男'); |
| insert into student values('05' , '周梅' , '1991-12-01' , '女'); |
| insert into student values('06' , '吴兰' , '1992-03-01' , '女'); |
| insert into student values('07' , '郑竹' , '1989-07-01' , '女'); |
| insert into student values('08' , '王菊' , '1990-01-20' , '女'); |
| |
| insert into course values('01' , '语文' , '02'); |
| insert into course values('02' , '数学' , '01'); |
| insert into course values('03' , '英语' , '03'); |
| |
| insert into teacher values('01' , '张三'); |
| insert into teacher values('02' , '李四'); |
| insert into teacher values('03' , '王五'); |
| |
| insert into score values('01' , '01' , 80); |
| insert into score values('01' , '02' , 90); |
| insert into score values('01' , '03' , 99); |
| insert into score values('02' , '01' , 70); |
| insert into score values('02' , '02' , 60); |
| insert into score values('02' , '03' , 80); |
| insert into score values('03' , '01' , 80); |
| insert into score values('03' , '02' , 80); |
| insert into score values('03' , '03' , 80); |
| insert into score values('04' , '01' , 50); |
| insert into score values('04' , '02' , 30); |
| insert into score values('04' , '03' , 20); |
| insert into score values('05' , '01' , 76); |
| insert into score values('05' , '02' , 87); |
| insert into score values('06' , '01' , 31); |
| insert into score values('06' , '03' , 34); |
| insert into score values('07' , '02' , 89); |
| insert into score values('07' , '03' , 98); |
3、测试题
| |
| select s3.*, s4.sc1, sc2 |
| from ( |
| select s.s_score sc1, s2.s_score sc2, s.s_id |
| from score s, |
| score s2 |
| where s.s_id = s2.s_id |
| and s.c_id = '01' |
| and s2.c_id = '02' |
| and s.s_score > s2.s_score or s2.c_id IS NULL |
| ) s4, |
| student s3 |
| where s4.s_id = s3.s_id; |
| |
| |
| select s3.*, s4.sc1, sc2 |
| from ( |
| select s.s_score sc1, s2.s_score sc2, s.s_id |
| from score s, |
| score s2 |
| where s.s_id = s2.s_id |
| and s.c_id = '01' |
| and s2.c_id = '02' |
| and s.s_score < s2.s_score or s2.c_id IS NULL |
| ) s4, |
| student s3 |
| where s4.s_id = s3.s_id; |
| |
| select student.s_id, s_name, avg |
| from student |
| join ( |
| select s_id, round(avg(s.s_score), 2) avg from score s group by s.s_id having round(avg(s.s_score), 2) >= 60 |
| ) sc on sc.s_id = student.s_id; |
| |
| |
| select student.s_id, s_name, avg |
| from student |
| join ( |
| select s_id, round(avg(s.s_score), 2) avg |
| from score s |
| group by s.s_id |
| having round(avg(s.s_score), 2) < 60 |
| ) sc on sc.s_id = student.s_id |
| union |
| select s_id, s_name, 0 |
| from student |
| where s_id not in ( |
| select s_id |
| from score |
| ); |
| |
| select a.s_id, a.s_name, count(b.c_id) as count, sum(b.s_score) as sum |
| from student a |
| left join score b on a.s_id = b.s_id |
| GROUP BY a.s_id; |
| |
| select count(1) count_num |
| from teacher |
| where teacher.t_name like '李%'; |
| |
| from student a |
| join score b on a.s_id = b.s_id |
| where b.c_id in ( |
| select c_id |
| from course |
| where t_id = ( |
| select t_id |
| from teacher |
| where t_name = '张三')); |
| |
| select * |
| from student c |
| where c.s_id not in ( |
| select a.s_id |
| from student a |
| join score b on a.s_id = b.s_id |
| where b.c_id in ( |
| select c_id |
| from course |
| where t_id = ( |
| select t_id |
| from teacher |
| where t_name = '张三'))); |
| |
| select a.* |
| from student a, score b,score c |
| where a.s_id = b.s_id and a.s_id = c.s_id and b.c_id = '01' and c.c_id = '02'; |
| |
| select a.* from |
| student a |
| where a.s_id in (select s_id from score where c_id='01' ) and a.s_id not in(select s_id from score where c_id='02') |
| |
| select s.* from |
| student s where s.s_id in( |
| select s_id from score where s_id not in( |
| select a.s_id from score a |
| join score b on a.s_id = b.s_id and b.c_id='02' |
| join score c on a.s_id = c.s_id and c.c_id='03' |
| where a.c_id='01')) |
| |
| select * from student where s_id in( |
| select distinct a.s_id from score a where a.c_id in(select a.c_id from score a where a.s_id='01') |
| ); |
| |
| SELECT * |
| FROM student |
| WHERE s_id IN ( |
| SELECT s_id |
| FROM ( |
| SELECT s_id, |
| COUNT(s_id) cou |
| FROM ( |
| SELECT * |
| FROM score |
| WHERE s_id IN ( |
| SELECT s_id |
| FROM (SELECT s_id, COUNT(s_id) count FROM score WHERE s_id != '01' GROUP BY s_id) t1 |
| WHERE t1.count = (SELECT count(c_id) FROM score WHERE s_id = '01') |
| ) |
| ) t3 |
| WHERE t3.c_id IN (SELECT c_id FROM score WHERE s_id = '01') |
| GROUP BY s_id |
| ) t4 |
| WHERE t4.cou = (SELECT count(c_id) FROM score WHERE s_id = '01')) |
| |
| select a.s_name from student a where a.s_id not in ( |
| select s_id from score where c_id = |
| (select c_id from course where t_id =( |
| select t_id from teacher where t_name = '张三')) |
| group by s_id); |
| |
| select a.s_id,a.s_name,ROUND(AVG(b.s_score)) from |
| student a |
| left join score b on a.s_id = b.s_id |
| where a.s_id in( |
| select s_id from score where s_score<60 GROUP BY s_id having count(1)>=2) |
| GROUP BY a.s_id,a.s_name |
| |
| select a.*,b.c_id,b.s_score from |
| student a,score b |
| where a.s_id = b.s_id and b.c_id='01' and b.s_score<60 ORDER BY b.s_score DESC; |
| |
| select a.s_id,(select s_score from score where s_id=a.s_id and c_id='01') as 语文, |
| (select s_score from score where s_id=a.s_id and c_id='02') as 数学, |
| (select s_score from score where s_id=a.s_id and c_id='03') as 英语, |
| round(avg(s_score),2) as 平均分 from score a GROUP BY a.s_id ORDER BY 平均分 DESC; |
| |
| |
| select a.c_id,b.c_name,MAX(s_score),MIN(s_score),ROUND(AVG(s_score),2), |
| ROUND(100*(SUM(case when a.s_score>=60 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 及格率, |
| ROUND(100*(SUM(case when a.s_score>=70 and a.s_score<=80 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 中等率, |
| ROUND(100*(SUM(case when a.s_score>=80 and a.s_score<=90 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 优良率, |
| ROUND(100*(SUM(case when a.s_score>=90 then 1 else 0 end)/SUM(case when a.s_score then 1 else 0 end)),2) as 优秀率 |
| from score a left join course b on a.c_id = b.c_id GROUP BY a.c_id,b.c_name |
| |
| |
| select a.s_id,a.c_id, |
| @i:=@i +1 as i保留排名, |
| @k:=(case when @score=a.s_score then @k else @i end) as rank不保留排名, |
| @score:=a.s_score as score |
| from ( |
| select s_id,c_id,s_score from score WHERE c_id='01' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC |
| )a,(select @k:=0,@i:=0,@score:=0)s |
| union |
| select a.s_id,a.c_id, |
| @i:=@i +1 as i, |
| @k:=(case when @score=a.s_score then @k else @i end) as rank, |
| @score:=a.s_score as score |
| from ( |
| select s_id,c_id,s_score from score WHERE c_id='02' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC |
| )a,(select @k:=0,@i:=0,@score:=0)s |
| union |
| select a.s_id,a.c_id, |
| @i:=@i +1 as i, |
| @k:=(case when @score=a.s_score then @k else @i end) as rank, |
| @score:=a.s_score as score |
| from ( |
| select s_id,c_id,s_score from score WHERE c_id='03' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC |
| )a,(select @k:=0,@i:=0,@score:=0)s |
| |
| select a.s_id, |
| @i:=@i+1 as i, |
| @k:=(case when @score=a.sum_score then @k else @i end) as rank, |
| @score:=a.sum_score as score |
| from (select s_id,SUM(s_score) as sum_score from score GROUP BY s_id ORDER BY sum_score DESC)a, |
| (select @k:=0,@i:=0,@score:=0)s |
| |
| select a.t_id,c.t_name,a.c_id,ROUND(avg(s_score),2) as avg_score from course a |
| left join score b on a.c_id=b.c_id |
| left join teacher c on a.t_id=c.t_id |
| GROUP BY a.c_id,a.t_id,c.t_name ORDER BY avg_score DESC; |
| |
| select d.*,c.排名,c.s_score,c.c_id from ( |
| select a.s_id,a.s_score,a.c_id,@i:=@i+1 as 排名 from score a,(select @i:=0)s where a.c_id='01' |
| )c |
| left join student d on c.s_id=d.s_id |
| where 排名 BETWEEN 2 AND 3 |
| UNION |
| select d.*,c.排名,c.s_score,c.c_id from ( |
| select a.s_id,a.s_score,a.c_id,@j:=@j+1 as 排名 from score a,(select @j:=0)s where a.c_id='02' |
| )c |
| left join student d on c.s_id=d.s_id |
| where 排名 BETWEEN 2 AND 3 |
| UNION |
| select d.*,c.排名,c.s_score,c.c_id from ( |
| select a.s_id,a.s_score,a.c_id,@k:=@k+1 as 排名 from score a,(select @k:=0)s where a.c_id='03' |
| )c |
| left join student d on c.s_id=d.s_id |
| where 排名 BETWEEN 2 AND 3; |
| |
| select distinct f.c_name,a.c_id,b.`85-100`,b.百分比,c.`70-85`,c.百分比,d.`60-70`,d.百分比,e.`0-60`,e.百分比 from score a |
| left join (select c_id,SUM(case when s_score >85 and s_score <=100 then 1 else 0 end) as `85-100`, |
| ROUND(100*(SUM(case when s_score >85 and s_score <=100 then 1 else 0 end)/count(*)),2) as 百分比 |
| from score GROUP BY c_id)b on a.c_id=b.c_id |
| left join (select c_id,SUM(case when s_score >70 and s_score <=85 then 1 else 0 end) as `70-85`, |
| ROUND(100*(SUM(case when s_score >70 and s_score <=85 then 1 else 0 end)/count(*)),2) as 百分比 |
| from score GROUP BY c_id)c on a.c_id=c.c_id |
| left join (select c_id,SUM(case when s_score >60 and s_score <=70 then 1 else 0 end) as `60-70`, |
| ROUND(100*(SUM(case when s_score >60 and s_score <=70 then 1 else 0 end)/count(*)),2) as 百分比 |
| from score GROUP BY c_id)d on a.c_id=d.c_id |
| left join (select c_id,SUM(case when s_score >=0 and s_score <=60 then 1 else 0 end) as `0-60`, |
| ROUND(100*(SUM(case when s_score >=0 and s_score <=60 then 1 else 0 end)/count(*)),2) as 百分比 |
| from score GROUP BY c_id)e on a.c_id=e.c_id |
| left join course f on a.c_id = f.c_id |
| |
| select a.s_id, |
| @i:=@i+1 as '不保留空缺排名', |
| @k:=(case when @avg_score=a.avg_s then @k else @i end) as '保留空缺排名', |
| @avg_score:=avg_s as '平均分' |
| from (select s_id,ROUND(AVG(s_score),2) as avg_s from score GROUP BY s_id)a,(select @avg_score:=0,@i:=0,@k:=0)b; |
| |
| |
| |
| select t1.c_id,t1.s_score |
| from score t1 |
| where (select count(0) from score t where t.c_id=t1.c_id and t1.s_score<t.s_score)<3 |
| order by t1.c_id,t1.s_score desc; |
| |
| select c_id,count(s_id) from score a GROUP BY c_id |
| |
| select s_id,s_name from student where s_id in( |
| select s_id from score GROUP BY s_id HAVING COUNT(c_id)=2); |
| |
| select s_sex,COUNT(s_sex) as 人数 from student GROUP BY s_sex |
| |
| select * from student where s_name like '%风%'; |
| |
| select a.s_name,a.s_sex,count(*) from student a JOIN |
| student b on a.s_id !=b.s_id and a.s_name = b.s_name and a.s_sex = b.s_sex |
| GROUP BY a.s_name,a.s_sex |
| |
| select s_name from student where s_birth like '1990%' |
| |
| |
| select c_id,ROUND(AVG(s_score),2) as avg_score from score GROUP BY c_id ORDER BY avg_score DESC,c_id ASC |
| |
| |
| select a.s_id,b.s_name,ROUND(avg(a.s_score),2) as avg_score from score a |
| left join student b on a.s_id=b.s_id GROUP BY s_id HAVING avg_score>=85 |
| |
| |
| select a.s_name,b.s_score from score b LEFT JOIN student a on a.s_id=b.s_id where b.c_id=( |
| select c_id from course where c_name ='数学') and b.s_score<60 |
| |
| select a.s_id,a.s_name, |
| SUM(case c.c_name when '语文' then b.s_score else 0 end) as '语文', |
| SUM(case c.c_name when '数学' then b.s_score else 0 end) as '数学', |
| SUM(case c.c_name when '英语' then b.s_score else 0 end) as '英语', |
| SUM(b.s_score) as '总分' |
| from student a left join score b on a.s_id = b.s_id |
| left join course c on b.c_id = c.c_id |
| GROUP BY a.s_id,a.s_name |
| |
| select a.s_name,b.c_name,c.s_score from course b left join score c on b.c_id = c.c_id |
| left join student a on a.s_id=c.s_id where c.s_score>=70 |
| |
| select a.s_id,a.c_id,b.c_name,a.s_score from score a left join course b on a.c_id = b.c_id |
| where a.s_score<60 |
| |
| select a.s_id,b.s_name from score a LEFT JOIN student b on a.s_id = b.s_id |
| where a.c_id = '01' and a.s_score>80 |
| |
| select count(*) from score GROUP BY c_id; |
| |
| |
| select c_id from course c,teacher d where c.t_id=d.t_id and d.t_name='张三' |
| |
| select MAX(s_score) from score where c_id='02' |
| |
| select a.*,b.s_score,b.c_id,c.c_name from student a |
| LEFT JOIN Score b on a.s_id = b.s_id |
| LEFT JOIN course c on b.c_id=c.c_id |
| where b.c_id =(select c_id from course c,Teacher d where c.t_id=d.t_id and d.t_name='张三') |
| and b.s_score in (select MAX(s_score) from Score where c_id=(select c_id from course c,Teacher d where c.t_id=d.t_id and d.t_name='张三')) |
| |
| select DISTINCT b.s_id,b.c_id,b.s_score from score a,score b where a.c_id != b.c_id and a.s_score = b.s_score |
| |
| |
| select a.s_id,a.c_id,a.s_score from Score a |
| where (select COUNT(1) from Score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2 ORDER BY a.c_id |
| |
| select c_id,count(*) as total from score GROUP BY c_id HAVING total>5 ORDER BY total,c_id ASC |
| |
| select s_id,count(*) as sel from score GROUP BY s_id HAVING sel>=2 |
| |
| select * from student where s_id in( |
| select s_id from score GROUP BY s_id HAVING count(*)=(select count(*) from course)) |
| |
| |
| select s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y') - |
| (case when DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d') then 0 else 1 end)) as age |
| from student; |
| |
| select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth) |
| select * from student where YEARWEEK(s_birth)=YEARWEEK(DATE_FORMAT(NOW(),'%Y%m%d')) |
| select WEEK(DATE_FORMAT(NOW(),'%Y%m%d')) |
| |
| select * from student where WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =WEEK(s_birth) |
| |
| select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d')) =MONTH(s_birth) |
| |
| select * from student where MONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =MONTH(s_birth) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具