MySQL經典45題(一)


一、數據庫字段說明

1、學生表 Student(SId,Sname,Sage,Ssex)
SId :學生編號
Sname:學生姓名
Sage :出生年月
Ssex:學生性別

2、課程表 Course(CId,Cname,TId)
CId :課程編號
Cname :課程名稱
TId :教師編號

3、教師表 Teacher(TId,Tname)
TId :教師編號
Tname :教師姓名

4、成績表 SC(SId,CId,score)
SId :學生編號
CId :課程編號
score: 分數

二、插入表及數據

# 學生表 Student:

create table Student(

SId varchar(10) ,

Sname varchar(10),

Sage datetime,

Ssex varchar(10));

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('09' , '張三' , '2017-12-20' , '');

insert into Student values('10' , '李四' , '2017-12-25' , '');

insert into Student values('11' , '李四' , '2017-12-30' , '');

insert into Student values('12' , '趙六' , '2017-01-01' , '');

insert into Student values('13' , '孫七' , '2018-01-01' , '');
# 課程表 Course

create table Course(

CId varchar(10),

Cname nvarchar(10),

TId varchar(10)); 

insert into Course values('01' , '語文' , '02'); 

insert into Course values('02' , '數學' , '01'); 

insert into Course values('03' , '英語' , '03'); 
# 教師表 Teacher

create table Teacher(

TId varchar(10),

Tname varchar(10)); 

insert into Teacher values('01' , '張三');
 
insert into Teacher values('02' , '李四'); 

insert into Teacher values('03' , '王五'); 
# 成績表 SC

create table SC(

SId varchar(10),

CId varchar(10),

score decimal(18,1)); 

insert into SC values('01' , '01' , 80); 

insert into SC values('01' , '02' , 90); 

insert into SC values('01' , '03' , 99); 

insert into SC values('02' , '01' , 70); 

insert into SC values('02' , '02' , 60); 

insert into SC values('02' , '03' , 80); 

insert into SC values('03' , '01' , 80); 

insert into SC values('03' , '02' , 80); 

insert into SC values('03' , '03' , 80); 

insert into SC values('04' , '01' , 50); 

insert into SC values('04' , '02' , 30); 

insert into SC values('04' , '03' , 20); 

insert into SC values('05' , '01' , 76); 

insert into SC values('05' , '02' , 87); 

insert into SC values('06' , '01' , 31); 

insert into SC values('06' , '03' , 34); 

insert into SC values('07' , '02' , 89); 

insert into SC values('07' , '03' , 98); 

三、題目與答案

1.查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數

select *
from Student a  INNER JOIN SC b
on a.SId=b.SId
inner join SC c
on a.sid=c.sid AND b.CId=01 and c.CId=02
where b.score > c.score

 1.1查詢同時存在" 01 "課程和" 02 "課程的情況

SELECT *
FROM
(select * from  SC where cid='01') a inner join 
(select * from  SC where cid='02') b on a.sid=b.sid

1.2 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null ) 

select *
FROM SC a left join SC b
on a.SId=b.SId and b.cid='02'
WHERE a.cid='01'

1.3 查詢不存在"01 "課程但存在" 02 "課程的情況

select *
FROM (SELECT * FROM SC WHERE sid not in(SELECT sid FROM SC WHERE cid='01')) a inner join SC b
on a.SId=b.SId and b.cid='02'

2.查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績

SELECT  a.sid,b.sname,a.avg_score
FROM 
(SELECT sid,avg(score) as avg_score
FROM SC
GROUP BY sid 
HAVING avg_score>=60) a left join Student b
on a.sid=b.sid 

 3.查詢在 SC 表存在成績的學生信息

select * from
Student
where sid in(SELECT sid from SC)

4. 查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null )

select 
a.sid,
a.sname,
count(b.cid) as 'scount',
sum(b.score) as 'sum'
from Student a
left join SC b
on a.sid=b.sid
GROUP BY a.sid 

4.1 查有成績的學生信息

select * from
Student
where sid in(SELECT sid from SC)

5.  查詢「李」姓老師的數量

SELECT count(1) FROM Teacher
where tname LIKE '李%'

6.  查詢學過「張三」老師授課的同學的信息

SELECT a.*
FROM Student a left join SC b on a.sid=b.sid
left join Course c on b.cid=c.cid
left join Teacher d on c.tid=d.tid
WHERE d.tname='張三'

 7.  查詢沒有學全所有課程的同學的信息

SELECT *
FROM Student a left join 
SC b on a.sid=b.sid
GROUP BY a.sid
HAVING count(b.cid)<(SELECT COUNT(*) FROM Course)

8.  查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息

SELECT DISTINCT b.*
from SC a inner join Student b on a.sid=b.sid
WHERE a.cid in(SELECT cid from SC where sid='01')

9.  查詢和" 01 "號的同學學習的課程 完全相同的其他同學的信息

SELECT b.*
FROM
(select * FROM SC where sid not in (SELECT sid FROM SC where cid not in (SELECT cid FROM SC WHERE sid='01') )and sid!='01' )a
left join Student b on a.sid=b.sid 
GROUP BY a.sid
HAVING count(cid)=(SELECT count(cid) FROM SC WHERE sid='01')

10.  查詢沒學過"張三"老師講授的任一門課程的學生姓名

SELECT sid,sname FROM Student WHERE sid not in 
(SELECT  DISTINCT a.sid
FROM Student a left join SC b on a.sid=b.sid
left join Course c on b.cid=c.cid
left join Teacher d on c.tid=d.tid
WHERE d.tname='張三')

11. 查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績

select a.sid,
b.sname,
AVG(score) as avg_score
from SC a 
left join Student b
on a.sid=b.sid  INNER JOIN (select sid
FROM SC where score<60
GROUP BY sid
having COUNT(1)>1) c on
a.sid=c.sid
group by a.sid

12. 檢索" 01 "課程分數小於 60,按分數降序排列的學生信息

SELECT a.* ,b.score
FROM Student  a left join SC b on a.sid=b.sid 
WHERE b.cid='01' and b.score<60 
ORDER BY b.score desc 

13.   按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績

SELECT a.*,avg_score
FROM SC a left join 
(SELECT sid,avg(score) as avg_score 
FROM SC
GROUP BY sid ) b on a.sid=b.sid
ORDER BY avg_score desc

14.查詢各科成績最高分、最低分和平均分: 以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT a.*,b.Cname FROM
(SELECT CId,
MAX(score) as 最高分,
MIN(score) as 最低分,
AVG(score) as 平均分,
COUNT(1)  as 選修人數,
SUM(case when score>=60 then 1 else 0 end) / COUNT(1) as 及格率,
SUM(case when score>=70 and score< 80 then 1 else 0 end) / COUNT(1) as 中等率,
SUM(case when score>=80 and score< 90 then 1 else 0 end) / COUNT(1) as 優良率,
SUM(case when score>=90 then 1 else 0 end) / COUNT(1) as 優秀率
FROM SC
GROUP BY CId) a left join Course b on a.CId=b.CId
ORDER BY 選修人數 DESC,CId ASC

 15. 按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺

SELECT 
sid,cid,score,@rank:=@rank+1 as rk
FROM SC,(SELECT @rank:=0) as t
ORDER BY score desc 

15.1 按各科成績進行排序,並顯示排名, Score 重復時合並名次

select 
*,
case when (@sco=score) then @rank else @rank:=@rank+1 end as rn,
@sco:=score  -- 保存上一次的分數
 from SC ,(select @rank:=0,@sco:=null) as t order by score desc

 

16. 查詢學生的總成績,並進行排名,總分重復時保留名次空缺

select 
s.*,
case when @sco=scos then '' else @rank:=@rank+1 end as rn ,
@sco:=scos
from 
(select 
sid,sum(score) as scos 
from SC group by sid order by scos desc) s,
(select @rank:=0,@sco:=null) as t

16.1 查詢學生的總成績,並進行排名,總分重復時不保留名次空缺

select 
a.*,
@RANK:=if(@sco=scos,@rank,@rank+1) as rank,
@sco:=scos
FROM (SELECT sid,sum(score) as scos
FROM SC
GROUP BY sid
ORDER BY scos desc) a,
(SELECT @sco:=null,@rank:=0) b

17. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所占百分比

select *,
sum(case when 0<=score and score <=60 then 1 else 0 end )/count(1) as '[0,60]',
sum(case when 60<score and score <=70 then 1 else 0 end )/count(1) as '[60,70]',
sum(case when 70<score and score <=85 then 1 else 0 end )/count(1) as '[70,85]',
sum(case when 85<score and score <=100 then 1 else 0 end )/count(1) as '[85,100]'
from SC 
group by cid

18. 查詢各科成績前三名的記錄

select a.*
from SC a
where (select count(1) from SC b where a.cid=b.cid and b.score>a.score)<3
ORDER BY cid DESC,score DESC 

19. 查詢每門課程被選修的學生數

SELECT cid,count(1) as cons
from SC
GROUP BY cid

20. 查詢出只選修兩門課程的學生學號和姓名

SELECT a.sid,b.sname FROM
(select SID,COUNT(1)  AS 選課數量
from SC
GROUP BY SID 
HAVING COUNT(1) =2 
) a left join Student b on a.sid=b.sid


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM