1. 程式人生 > >MySQL常用練習50題(題目是網上的,有部分參考別人的程式碼)

MySQL常用練習50題(題目是網上的,有部分參考別人的程式碼)

MySQl練習題 –建表 –學生表 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) ); –課程表 CREATE TABLE Course( c_id VARCHAR(20), c_name VARCHAR(20) NOT NULL DEFAULT ‘’, t_id VARCHAR(20) NOT NULL, PRIMARY KEY(c_id

) ); –教師表 CREATE TABLE Teacher( t_id VARCHAR(20), t_name VARCHAR(20) NOT NULL DEFAULT ‘’, PRIMARY KEY(t_id) ); –成績表 CREATE TABLE Score( s_id VARCHAR(20), c_id VARCHAR(20), s_score INT(3), PRIMARY KEY(s_id,c_id) ); –插入學生表測試資料 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);

練習題 – 1、查詢"01"課程比"02"課程成績高的學生的資訊及課程分數 select a.*, b.s_score as 01score, c.s_score as 02score from sys.student a join sys.score b on a.s_id = b.s_id and b.c_id = ‘01’ join sys.score c on a.s_id = c.s_id and c.c_id = ‘02’ where b.s_score > c.s_score;

– 2、查詢"01"課程比"02"課程成績低的學生的資訊及課程分數 select a.*, b.s_score as 01score, c.s_score as 02score from sys.student a join sys.score b on a.s_id = b.s_id and b.c_id = ‘01’ join sys.score c on a.s_id = c.s_id and c.c_id = ‘02’ where b.s_score < c.s_score;

3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績 select a.s_id, a.s_name, avg(b.s_score) from sys.student a join sys.score b on a.s_id = b.s_id group by a.s_id having avg(b.s_score)>60;

– 4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績 select a.s_id, a.s_name, avg(b.s_score) from sys.student a join sys.score b on a.s_id = b.s_id group by a.s_id having avg(b.s_score)<60;

– 5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績 select a.s_id, a.s_name, count(b.c_id), sum(b.s_score) from sys.student a left join sys.score b on a.s_id = b.s_id group by a.s_id;

– 6、查詢"李"姓老師的數量 select count(b.t_name) from sys.teacher b where b.t_name like “李%”

– 7、查詢學過"張三"老師授課的同學的資訊 select a.* from sys.student a left join sys.score b on a.s_id = b.s_id left join sys.course c on b.c_id = c.c_id left join sys.teacher d on c.t_id = d.t_id where d.t_name = ‘張三’;

– 8、查詢沒學過"張三"老師授課的同學的資訊 select a.* from sys.student a where a.s_id not in ( select b.s_id from sys.student b join sys.score c on b.s_id = c.s_id where c.c_id in ( select c_id from sys.course where t_id = ( select t_id from sys.teacher d where d.t_name = ‘張三’)));

– 9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的資訊 select c.* from sys.student c join sys.score d on c.s_id = d.s_id and d.c_id = 02 where c.s_id in ( select a.s_id from sys.student a join sys.score b on a.s_id = b.s_id where b.c_id = 01)

– 10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的資訊 select c.* from sys.student c join sys.score d on c.s_id = d.s_id and d.c_id = 01 where c.s_id not in ( select a.s_id from sys.student a join sys.score b on a.s_id = b.s_id where b.c_id = 02);

– 11、查詢沒有學全所有課程的同學的資訊 select e.* from sys.student e where e.s_id not in ( select a.s_id from sys.Student a left join sys.score b on a.s_id = b.s_id left join sys.score c on a.s_id = c.s_id left join sys.score d on a.s_id = d.s_id where b.c_id = 01 and c.c_id = 02 and d.c_id = 03);

– 12、查詢至少有一門課與學號為"01"的同學所學相同的同學的資訊 select c.* from sys.student c where c.s_id in ( select distinct(c.s_id) from sys.score c where c.c_id in ( select a.c_id from sys.score a where s_id = 01) and c.s_id <> 01);

– 13、查詢和"01"號的同學學習的課程完全相同的其他同學的資訊 select a.* from sys.student a where a.s_id in( select distinct s_id from sys.score where s_id!=‘01’ and c_id in(select c_id from sys.score where s_id=‘01’) group by s_id having count(1)=(select count(1) from sys.score where s_id=‘01’));

– 14、查詢沒學過"張三"老師講授的任一門課程的學生姓名 select s_name from sys.student where s_id not in( select distinct(c.s_id) from sys.student c left join sys.score d on c.s_id = d.s_id where d.c_id = ( select c_id from sys.course a left join sys.teacher b on a.t_id = b.t_id where b.t_name = ‘張三’));

– 15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績 select a.s_id as 序號, a.s_name as 姓名, round(avg(b.s_score),2) as 平均分 from sys.student a left join sys.score b on a.s_id = b.s_id where a.s_id in( select c.s_id from sys.score c where c.s_score < 60 group by c.s_id having count(c.s_id)>=2) group by a.s_id;

– 16、檢索"01"課程分數小於60,按分數降序排列的學生資訊 select b.* from sys.student b where s_id in ( select a.s_id from sys.score a where a.s_score<60 and a.c_id = 01 order by a.s_score desc);

– 17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績 select a.s_id, round(avg(a.s_score),2), (select s_score from sys.score where c_id = 01 and s_id = a.s_id) as ‘語文’, (select s_score from sys.score where c_id = 02 and s_id = a.s_id) as ‘數學’, (select s_score from sys.score where c_id = 03 and s_id = a.s_id) as ‘英語’ from sys.score a group by a.s_id

– 18.查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率 –及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 select a.c_id as ‘課程id’, b.c_name as ‘課程名稱’, max(s_score) as ‘最高分’, min(s_score) as ‘最低分’, round(avg(s_score),2) as ‘平均分’, 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 sys.score a left join sys.course b on a.c_id = b.c_id GROUP BY a.c_id,b.c_name

– 19、按各科成績進行排序,並顯示排名 select a.s_id,a.c_id, @i:[email protected] +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 sys.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:[email protected] +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 sys.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:[email protected] +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 sys.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

– 20、查詢學生的總成績並進行排名 select a.s_id, @i:[email protected]+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

–21、查詢不同老師所教不同課程平均分從高到低顯示 select a.t_id,c.t_name,a.c_id,ROUND(avg(s_score),2) as avg_score from sys.course a left join sys.score b on a.c_id=b.c_id left join sys.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;

– 22、查詢所有課程的成績第2名到第3名的學生資訊及該課程成績 select d.,c.排名,c.s_score,c.c_id from ( select a.s_id,a.s_score,a.c_id,@i:[email protected]+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:[email protected]+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:[email protected]+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;

–23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所佔百分比 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

–24、查詢學生平均成績及其名次 select a.s_id, @i:[email protected]+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;

  • 25、查詢各科成績前三名的記錄 – 1.選出b表比a表成績大的所有組 – 2.選出比當前id成績大的 小於三個的 select a.s_id,a.c_id,a.s_score from score a left join score b on a.c_id = b.c_id and a.s_score<b.s_score group by a.s_id,a.c_id,a.s_score HAVING COUNT(b.s_id)❤️ ORDER BY a.c_id,a.s_score DESC

  • 26、查詢每門課程被選修的學生數 select count(s_id), c_id from sys.score group by c_id

  • 27、查詢出只有兩門課程的全部學生的學號和姓名 select s_id, s_name from sys.student where s_id in( select s_id from sys.score group by s_id having count(c_id) = 2)

– 28、查詢男生、女生人數 select s_sex, count(s_sex) from sys.student group by s_sex

– 29、查詢名字中含有"風"字的學生資訊 select * from sys.student where s_name = ‘%風’

– 30、查詢同名同性學生名單,並統計同名人數 select a.s_name,a.s_sex,count(*) from sys.student a join sys.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.

– 31、查詢1990年出生的學生名單 select s_name from sys.student where s_birth like ‘1990%’

– 32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列 select c_id, avg(s_score) as avg from sys.score group by c_id order by avg desc, c_id asc

– 33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績 select a.s_id, a.s_name, avg(b.s_score) as avg from sys.student a left join sys.score b on a.s_id =b.s_id group by s_id, s_name having avg>=85

– 34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數 select a.s_name, b.s_score from sys.student a left join sys.score b on a.s_id = b.s_id left join sys.course c on b.c_id =c.c_id where c.c_name = ‘數學’ and b.s_score <60

– 35、查詢所有學生的課程及分數情況; 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 sys.student a left join sys.score b on a.s_id = b.s_id left join sys.course c on b.c_id = c.c_id GROUP BY a.s_id,a.s_name

– 36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數; select a.s_name, c.c_name, b.s_score from sys.student a left join sys.score b on a.s_id =b.s_id left join sys.course c on b.c_id = c.c_id where b.s_score >70

– 37、查詢不及格的課程 select a.s_id, a.s_name, b.s_score from sys.student a left join sys.score b on a.s_id = b.s_id where b.s_score <60

–38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名; select a.s_id, a.s_name from sys.student a left join sys.score b on a.s_id = b.s_id where b.s_score >80 and b.c_id = 02

– 39、求每門課程的學生人數 select c_id, count(s_id) from sys.score group by c_id

– 40、查詢選修"張三"老師所授課程的學生中,成績最高的學生資訊及其成績 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=‘02’)

– 41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 select distinct b.s_id, b.c_id, b.s_score from sys.score a, sys.score b where a.c_id <> b.c_id and a.s_score = b.s_score

– 42、查詢每門功成績最好的前兩名 select a.s_id,a.c_id,a.s_score from sys.score a where (select COUNT(1) from sys.score b where b.c_id=a.c_id and b.s_score>=a.s_score)<=2 ORDER BY a.c_id

– 43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列 select c_id, count() from sys.score group by c_id having count()>=5 order by count(*) desc, c_id asc

– 44、檢索至少選修兩門課程的學生學號 select s_id, count(s_id) from sys.score group by s_id having count(s_id)>=2

– 45、查詢選修了全部課程的學生資訊 select a.s_id, a.s_name from sys.student a where s_id in ( select s_id from sys.score group by s_id having count(s_id)=3)

–46、查詢各學生的年齡 – 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一 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 sys.student;

– 47、查詢本週過生日的學生 select * from sys.student where WEEK(DATE_FORMAT(NOW(),’%Y%m%d’))=WEEK(s_birth)

– 48、查詢下週過生日的學生 select * from sys.student where WEEK(DATE_FORMAT(NOW(),’%Y%m%d’))+1=WEEK(s_birth)

– 49、查詢本月過生日的學生 select * from sys.student where month(DATE_FORMAT(NOW(),’%Y%m%d’))=month(s_birth)

– 50、查詢下月過生日的學生 select * from sys.student where month(DATE_FORMAT(NOW(),’%Y%m%d’))+1=month(s_birth)