0


MySQL经典案例50题

数据准备

建表、插入数据

-- 学生表CREATETABLE Student(
s_id VARCHAR(20),
s_name VARCHAR(20)NOTNULLDEFAULT'',
s_birth VARCHAR(20)NOTNULLDEFAULT'',
s_sex VARCHAR(10)NOTNULLDEFAULT'',PRIMARYKEY(s_id));-- 课程表CREATETABLE Course(
c_id VARCHAR(20),
c_name VARCHAR(20)NOTNULLDEFAULT'',
t_id VARCHAR(20)NOTNULL,PRIMARYKEY(c_id));-- 教师表CREATETABLE Teacher(
t_id VARCHAR(20),
t_name VARCHAR(20)NOTNULLDEFAULT'',PRIMARYkey(t_id));-- 成绩表CREATETABLE Score(
s_id VARCHAR(20),
c_id VARCHAR(20),
s_score INT(3),PRIMARYKEY(s_id,c_id));-- 插入学生表测试数据insertinto Student values('01','赵雷','1990-01-01','男');insertinto Student values('02','钱电','1990-12-21','男');insertinto Student values('03','孙风','1990-05-20','男');insertinto Student values('04','李云','1990-08-06','男');insertinto Student values('05','周梅','1991-12-01','女');insertinto Student values('06','吴兰','1992-03-01','女');insertinto Student values('07','郑竹','1989-07-01','女');insertinto Student values('08','王菊','1990-01-20','女');-- 插入课程表测试数据insertinto Course values('01','语文','02');insertinto Course values('02','数学','01');insertinto Course values('03','英语','03');-- 插入教师表测试数据insertinto Teacher values('01','张三');insertinto Teacher values('02','李四');insertinto Teacher values('03','王五');-- 插入成绩表测试数据insertinto Score values('01','01',80);insertinto Score values('01','02',90);insertinto Score values('01','03',99);insertinto Score values('02','01',70);insertinto Score values('02','02',60);insertinto Score values('02','03',80);insertinto Score values('03','02',80);insertinto Score values('03','03',80);insertinto Score values('04','01',50);insertinto Score values('04','02',30);insertinto Score values('04','03',20);insertinto Score values('05','01',76);insertinto Score values('05','02',87);insertinto Score values('06','01',31);insertinto Score values('06','03',34);insertinto Score values('07','02',89);insertinto Score values('07','03',98);
题目
– 1

、查询"01"课程比"02"课程成绩高的学生的信息及课程分数

SELECT
stu.*,sco.s_score
FROM student stu
LEFTJOIN score sco ON stu.s_id=sco.s_id
WHERE stu.s_id IN(SELECT
stu.s_id
FROM score sco1
WHERE sco1.c_id='01'AND sco1.s_score >(SELECT
sco2.s_score
FROM score sco2
WHERE sco1.s_id=sco2.s_id
AND sco2.c_id='02'));
– 2

、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

SELECT
stu.*,sco.s_score
FROM student stu
LEFTJOIN score sco on stu.s_id=sco.s_id
WHERE stu.s_id in(SELECT
sco1.s_id
FROM score sco1
where sco1.c_id='01'AND sco1.s_score <(SELECT
sco2.s_score
FROM score sco2
where sco2.c_id='02'AND sco1.s_id=sco2.s_id
));
– 3

、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

SELECT
stu.s_id,stu.s_name,avg(sco.s_score)AS'平均成绩'FROM student stu LEFTJOIN score sco ON stu.s_id=sco.s_id
GROUPBY stu.s_id
HAVINGavg(sco.s_score)>=60;
– 4

、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

(包括有成绩的和无成绩的)

SELECT
stu.s_id,stu.s_name,avg(sco.s_score)AS'平均成绩'FROM student stu LEFTJOIN score sco ON stu.s_id=sco.s_id
GROUPBY stu.s_id
HAVINGavg(sco.s_score)<60oravg(sco.s_score)isnull;
– 5

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

SELECT
stu.s_id,
stu.s_name,count(sco.c_id)AS'选课总数',sum(sco.s_score)as'总成绩'from student stu 
LEFTJOIN score sco ON stu.s_id=sco.s_id
GROUPBY stu.s_id;
– 6

、查询"李"姓老师的数量

SELECTCOUNT(*)FROM teacher t WHERE t.t_name LIKE'李%';
– 7

、查询学过"张三"老师授课的同学的信息

SELECT
stu.*FROM student stu 
LEFTJOIN score sco on stu.s_id=sco.s_id
LEFTJOIN course cou ON sco.c_id=cou.c_id
LEFTJOIN teacher tea ON cou.t_id=tea.t_id
where tea.t_name='张三';
– 8

、查询没学过"张三"老师授课的同学的信息

SELECT stu.*FROM student stu WHERE stu.s_id IN(SELECT te.t_id FROM teacher te
leftJOIN course co ON co.t_id = te.t_id
leftJOIN score so ON co.c_id=so.c_id
LEFTJOIN student st ON st.s_id = so.s_id
WHERE te.t_name <>'张三');
– 9

、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

SELECT
stu.*FROM score sco 
LEFTJOIN student stu ON stu.s_id=sco.s_id
WHERE sco.c_id='01'AND sco.s_id =(SELECT
sco1.s_id
from score sco1 
WHERE sco1.c_id='02'and sco.s_id=sco1.s_id)
10

、查询学过编号为"01"但是没有学过编号为"02"的课程的同学的信息

SELECT
stu.*FROM score sco 
LEFTJOIN student stu ON stu.s_id=sco.s_id
WHERE sco.c_id='01'AND stu.s_id NOTIN(SELECT
sco1.s_id
FROM score sco1
WHERE sco1.c_id='02'AND stu.s_id=sco1.s_id)
11

、查询没有学全所有课程的同学的信息

SELECT
stu.*FROM student stu 
LEFTJOIN score sco ON sco.s_id=stu.s_id
where stu.s_id NOTIN(SELECT
sco1.s_id
FROM score sco1
WHERE sco1.c_id='01'OR sco1.c_id='02'OR sco1.c_id='03'AND sco1.s_id=sco.s_id)
12

、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

SELECT
stu.*FROM student stu 
LEFTJOIN score sco ON sco.s_id=stu.s_id
WHERE sco.c_id IN(SELECT 
sco1.c_id
FROM score sco1 
WHERE sco.s_id='01')GROUPBY stu.s_id
13

、查询和"01"号的同学学习的课程完全相同的其他同学的信息

SELECT 
stu.*FROM student stu
WHERE stu.s_id IN(SELECT
sco.s_id
FROM score sco 
WHERE sco.c_id IN(SELECT
sco1.c_id
FROM score sco1
WHERE sco1.s_id='01')GROUPBY sco.s_id
HAVINGCOUNT(*)=(SELECTCOUNT(*)FROM score sco2
WHERE sco2.s_id='01')ANDSUM(sco.c_id)=(SELECTSUM(sco3.c_id)FROM score sco3
WHERE sco3.s_id='01'))
14

、查询没学过"张三"老师讲授的任一门课程的学生姓名

SELECT*FROM student WHERE s_id NOTIN(SELECT st.s_id FROM student st
LEFTJOIN score sc ON st.s_id=sc.s_id
LEFTJOIN course co ON sc.c_id= co.c_id
LEFTJOIN teacher te ON co.t_id = te.t_id
WHERE t_name ='张三');
15

、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT
stu.s_id,stu.s_name,avg(sco.s_score)FROM student stu
LEFTJOIN score sco ON stu.s_id=sco.s_id
WHERE sco.s_id IN(SELECT 
sco1.s_id
FROM score sco1 WHERE sco1.s_score <60GROUPBY sco1.s_id
HAVINGCOUNT(sco1.s_id>=2))GROUPBY stu.s_id
16

、检索"01"课程分数小于60,按分数降序排列的学生信息

SELECT
stu.*FROM student stu 
LEFTJOIN score sco ON sco.s_id=stu.s_id
WHERE sco.c_id='01'AND sco.s_score<60ORDERBY sco.s_score DESC
17

、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT
stu.*,avg(sco.s_score)AS'平均成绩',(SELECT s_score from score WHERE c_id='01'AND s_id=stu.s_id)as'数学成绩',(SELECT s_score from score WHERE c_id='02'AND s_id=stu.s_id)as'语文成绩',(SELECT s_score from score WHERE c_id='03'AND s_id=stu.s_id)as'英语成绩'FROM student stu
LEFTJOIN score sco on sco.s_id=stu.s_id
GROUPBY sco.s_id
ORDERBYavg(sco.s_score)DESC
18

.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

–及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

SELECT
cou.c_id,cou.c_name,(SELECT s_score FROM score WHERE c_id=cou.c_id ORDERBY s_score DESCLIMIT1)AS'最高分',(SELECT s_score FROM score WHERE c_id=cou.c_id ORDERBY s_score LIMIT1)AS'最低分',((SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id AND s_score>=60)/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'及格率',((SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id AND s_score >=70AND s_score<80)/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'中等率',((SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id AND s_score >=80AND s_score<90)/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'优良率',((SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id AND s_score >=90)/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'优秀率'FROM course cou LEFTJOIN score sco ON cou.c_id=sco.c_id
GROUPBY cou.c_id
19

、按各科成绩进行排序,并显示排名(实现不完全)

SELECT
c_id,s_id,s_score,IF(@prec=c_id,@rank:=@rank+1,@rank:=1)AS'名次',@prec:=c_id
FROM score,(SELECT@rank:=0)r,(SELECT@prec:=-1)p
ORDERBY c_id,s_score DESC
20

、查询学生的总成绩并进行排名

SELECT s_id ,SUM(s_score) sum1 FROM score GROUPBY s_id ORDERBY sum1 DESC
21

、查询不同老师所教不同课程平均分从高到低显示

SELECT
cou.c_name,avg(sco.s_score)FROM course cou 
LEFTJOIN score sco ON cou.c_id=sco.c_id
GROUPBY cou.c_id
ORDERBYavg(sco.s_score)DESC
22

、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩

SELECT*FROM(SELECT 
c_id,
s_id,
s_score,IF(@prec=c_id,@rank:=@rank+1,@rank:=1)AS 名次,@prec:=c_id
FROM score
ORDERBY c_id,s_score DESC)t WHERE 名次=2OR 名次=3;
23

、统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60]及所占百分比

SELECT
cou.c_id AS'课程编号',cou.c_name AS'课程名称',((SELECTCOUNT(*)FROM score WHERE c_id = cou.c_id AND(s_score>85AND s_score<=100))/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'[100-85]',((SELECTCOUNT(*)FROM score WHERE c_id = cou.c_id AND(s_score>70AND s_score<=85))/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'[85-70]',((SELECTCOUNT(*)FROM score WHERE c_id = cou.c_id AND(s_score>60AND s_score<=70))/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'[70-60]',((SELECTCOUNT(*)FROM score WHERE c_id = cou.c_id AND(s_score>=0AND s_score<=60))/(SELECTCOUNT(*)FROM score WHERE c_id=cou.c_id))AS'[60-0]'FROM course cou LEFTJOIN score sco ON cou.c_id = sco.c_id
GROUPBY cou.c_id;
24

、查询学生平均成绩及其名次

SELECT
s_name,avg_score,@num:=@num+1'名次'FROM(SELECT
stu.*,avg(s_score) avg_score,(SELECT@num:=0)'名次'FROM score sco 
LEFTJOIN student stu ON sco.s_id=stu.s_id
GROUPBY stu.s_id
ORDERBYavg(sco.s_score)DESC)t
25

、查询各科成绩前 三名的记录

SELECT*FROM(SELECT
c_id,
s_id,
s_score,IF(@prec=c_id,@rank:=@rank+1,@rank:=1)AS 名次,@prec:=c_id
FROM score,(SELECT@rank:=0)r,(SELECT@prec:=-1)p
ORDERBY c_id,s_score DESC)t 
WHERE 名次 =1OR 名次 =2OR 名次 =3;
26

、查询每门课程被选修的学生数

SELECT
c_name,COUNT(s_id)AS'学生数'FROM score sc LEFTJOIN course co ON co.c_id=sc.c_id
GROUPBY sc.c_id
27

、查询出只有两门课程的全部学生的学号和姓名

SELECT 
s_sex,COUNT(*)FROM student
GROUPBY s_sex
28

、查询男生、女生人数

SELECT 
s_sex,COUNT(*)FROM student
GROUPBY s_sex
29

、查询名字中含有"风"字的学生信息

SELECT*FROM student WHERE s_name LIKE'%风%'
30

、查询同名同性学生名单,并统计同名人数

SELECT*,COUNT(stu.s_name)AS'同名人数'FROM student stu
WHERE stu.s_name IN(SELECT 
stu1.s_name
FROM student stu1
WHERE stu.s_id != stu1.s_id)GROUPBY stu.s_name
31

、查询1990年出生的学生名单

SELECT
c_id,avg(s_score)FROM score
GROUPBY c_id
ORDERBYavg(s_score)DESC,c_id
32

、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

SELECT
c_id,avg(s_score)FROM score
GROUPBY c_id
ORDERBYavg(s_score)DESC,c_id
33

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

SELECT
sc.s_id,
st.s_name,avg(s_score)AS'平均成绩'FROM score sc LEFTJOIN student st ON st.s_id=sc.s_id
GROUPBY sc.s_id 
HAVINGavg(s_score)>=85

34

、查询课程名称为"数学",且分数低于60的学生姓名和分数

SELECT
co.c_name,
st.s_name,
sc.s_score
FROM score sc 
LEFTJOIN course co ON sc.c_id=co.c_id
LEFTJOIN student st ON sc.s_id=st.s_id
WHERE co.c_name='数学'AND sc.s_score<60-- 嵌套查询SELECT
st.s_name,
t.s_score
FROM student st INNERJOIN(SELECT*FROM score WHERE c_id IN(SELECT c_id 
FROM course 
WHERE c_name ='数学')AND s_score<60) t ON t.s_id=st.s_id
35

、查询所有学生的课程及分数情况;

SELECT
st.s_name,
co.c_name,
sc.s_score
FROM score sc 
LEFTJOIN course co ON sc.c_id=co.c_id
LEFTJOIN student st ON sc.s_id=st.s_id
36

、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;

SELECT
stu.s_name,
co.c_name,
sc.s_score
FROM score sc 
LEFTJOIN student stu ON stu.s_id=sc.s_id
LEFTJOIN course co ON co.c_id=sc.c_id
WHERE sc.s_score >70
37

、查询不及格的课程

SELECT
co.c_name,
stu.s_name,
sc.s_score
FROM score sc 
LEFTJOIN student stu ON stu.s_id=sc.s_id
LEFTJOIN course co ON co.c_id=sc.c_id
WHERE sc.s_score <60
38

、查询课程编号为01且课程成绩在80分以上的学生的学号和姓名;

SELECT
s_id,
s_name
FROM student
WHERE s_id IN(SELECT
s_id
FROM score
WHERE c_id ='01'AND s_score >80)
39

、求每门课程的学生人数

SELECT
co.c_name,
sc.c_id,COUNT(sc.s_id)AS'学生人数'FROM score sc 
LEFTJOIN course co ON co.c_id=sc.c_id
GROUPBY sc.c_id
40

、查询选修"张三"老师所授课程的学生中,成绩最高的学生信息及其成绩

SELECT
st.*,
co.c_name,
sc.s_score
FROM score sc 
LEFTJOIN student st ON st.s_id=sc.s_id
LEFTJOIN course co ON sc.c_id=co.c_id
LEFTJOIN teacher te ON te.t_id=co.t_id
WHERE te.t_name='张三'ORDERBY sc.s_score DESCLIMIT1

41

、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

SELECT
stu.s_id,
sc.c_id,
sc.s_score
FROM student stu
LEFTJOIN score sc ON stu.s_id=sc.s_id
WHERE sc.s_id IN(SELECT
sc1.s_id
FROM score sc1
LEFTJOIN score sc2 ON sc1.s_id=sc2.s_id AND sc1.c_id!=sc2.c_id
WHERE sc2.s_score=sc1.s_score 
GROUPBY sc1.s_id
)GROUPBY stu.s_id
42

、查询每门功成绩最好的前两名

SELECT
sc.*FROM score sc 
WHERE(SELECTCOUNT(*)FROM score sc1
WHERE sc.c_id=sc1.c_id AND sc.s_score<=sc1.s_score
)<=2ORDERBY sc.c_id,sc.s_score DESC
43

、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

with t AS(SELECT
sc.c_id,COUNT(sc.s_id)AS'选修人数'FROM score sc 
LEFTJOIN course co ON co.c_id=sc.c_id
GROUPBY sc.c_id
ORDERBYCOUNT(sc.s_id)DESC,sc.c_id )SELECT t.c_id,t.`选修人数`FROM t WHERE t.`选修人数`>5

44

、检索至少选修两门课程的学生学号

SELECT
sc.s_id,COUNT(sc.c_id)FROM score sc 
GROUPBY sc.s_id
HAVINGCOUNT(sc.c_id)>=2

45

、查询选修了全部课程的学生信息

SELECT*FROM student stu
WHERE stu.s_id IN(SELECT
sc.s_id
FROM score sc 
GROUPBY sc.s_id
HAVINGCOUNT(sc.c_id)=3)
46

、查询各学生的年龄

SELECT
s_name,
s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y')-(CASEWHEN DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d')THEN0ELSE1END))FROM student
47

、查询本周过生日的学生

SELECT*FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)
48

、查询下周过生日的学生

SELECT*FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1=WEEK(s_birth)
49

、查询本月过生日的学生

SELECT*FROM student WHEREMONTH(DATE_FORMAT(NOW(),'%Y%m%d'))=MONTH(s_birth)
50

、查询下月过生日的学生

SELECT*FROM student WHEREMONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1=MONTH(s_birth)
SELECT*FROM student stu
WHERE stu.s_id IN(SELECT
sc.s_id
FROM score sc 
GROUPBY sc.s_id
HAVINGCOUNT(sc.c_id)=3)
46

、查询各学生的年龄

SELECT
s_name,
s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y')-(CASEWHEN DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d')THEN0ELSE1END))FROM student
47

、查询本周过生日的学生

SELECT*FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)
48

、查询下周过生日的学生

SELECT*FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1=WEEK(s_birth)
49

、查询本月过生日的学生

SELECT*FROM student WHEREMONTH(DATE_FORMAT(NOW(),'%Y%m%d'))=MONTH(s_birth)
50

、查询下月过生日的学生

SELECT*FROM student WHEREMONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1=MONTH(s_birth)
标签: mysql 数据库 sql

本文转载自: https://blog.csdn.net/Mr_Ren_0_1/article/details/128206092
版权归原作者 ༄Chlོ࿆inReོ࿆i༅ 所有, 如有侵权,请联系我们删除。

“MySQL经典案例50题”的评论:

还没有评论