本文是在Cat Qi的原貼的基礎之上,經本人逐題分別在MySql數據庫中實現的筆記,持續更新...
參考原貼:http://www.cnblogs.com/qixuejia/p/3637735.html
Student(Sno,Sname,Sage,Ssex) 學生表
Course(Cno,Cname,Tno) 課程表
SC(Sno,Cno,score) 成績表
Teacher(Tno,Tname) 教師表
(1) 建表:
【注】MySQL數據庫建表時需要添加“ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci”命令,否則中文會發生亂碼。
(2) 插入測試數據:
(1)查詢“1”課程比“2”課程成績高的所有學生的學號;
select a.sno from (select sno,score from sc where cno=1) a, (select sno,score from sc where cno=2) b where a.sno=b.sno and a.score>b.score;
(2)查詢平均成績大於60分的同學的學號和平均成績;
select Sno,AVG(Score) as AvgScore from SC group by Sno having AVG(Score)>60
(3)查詢所有同學的學號、姓名、選課數、總成績;
select student.sno,student.sname,count(sc.cno),sum(sc.score) from student left outer join sc on student.sno = sc.sno group by student.sno order by student.sno;
(4)查詢姓“李”的老師的個數;
select count(distinct tname) as count from teacher where tname like '李%';
(5)查詢沒學過“葉平”老師課的同學的學號、姓名;
select s.sno,s.sname from student s where s.sno not in ( select distinct(sc.sno) from sc ,course c,teacher t where sc.cno = c.cno and c.tno = t.tno and t.tname = '葉平' )
(6)查詢學過“1”並且也學過編號“2”課程的同學的學號、姓名;
select s.sno,s.sname from
student s,
(select sno from sc where cno=1) a,
(select sno from sc where cno=2) b
where s.sno = a.sno and a.sno = b.sno;
方法二 用exist函數
select s.Sno,s.Sname from Student s,SC sc where s.Sno=sc.Sno and sc.Cno=1 and exists ( select * from SC sc2 where sc.Sno=sc2.Sno and sc2.Cno=2 )
(7)查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
select s.sno,s.sname
from student s,teacher t,
course c left outer join sc
on c.cno = sc.cno
where t.tname="葉平" and t.tno = c.cno and s.sno = sc.sno ;
或者:
select s.sno,s.sname from student s where s.sno in ( select sc.sno from sc,course c,teacher t where c.cno=sc.cno and c.tno=t.tno and t.tname ="葉平" group by sc.sno having count(sc.cno)= ( select count(c1.cno) from course c1,teacher t1 where c1.tno=t1.tno and t1,tname ="葉平" ) );
(8)查詢課程編號“2”的成績比課程編號“1”課程低的所有同學的學號、姓名;
select s.sno,s.sname
from student s
where s.sno in
(
select a.sno from
(select sno,score from sc where cno=2) a,
(select sno,score from sc where cno=1) b
where a.sno = b.sno and a.score < b.score
);
(9)查詢有課程成績小於60分的同學的學號、姓名;
select s.sno,s.sname
from student s,sc
where sc.score<60 and s.sno=sc.sno
group by s.sno;
(10)查詢沒有學全所有課的同學的學號、姓名;
select s.sno,s.sname
from student s
where s.sno not in
(
select sc.sno from sc
group by sc.sno
having count(distinct sc.cno)=
(
select count(distinct c.cno) from course c
)
);
(11)查詢至少有一門課與學號為“1”的同學所學相同的同學的學號和姓名;
select distinct(s.sno),s.sname
from student s,sc
where s.sno=sc.sno and sc.cno in
(
select distinct(cno) from sc where sno=1
);
(12)查詢至少學過學號為“1”同學所有一門課的其他同學學號和姓名;
select distinct(s.sno),s.sname
from student s,sc
where s.sno=sc.sno and s.sno != 1 and sc.cno in
(
select distinct(cno) from sc where sno=1
);
(13)把“SC”表中“葉平”老師教的課的成績都更改為此課程的平均成績;
update sc set score = ( select avg(sc1.score) from sc sc1,course c,teacher t where sc1.cno = c.cno and c.tno = t.tno and t.tname="葉平" ) where cno in ( select cno from course c,teacher t where c.tno = t.tno and t.tname="葉平" );
(14)查詢和“2”號的同學學習的課程完全相同的其他同學學號和姓名;
select s.sno,s.sname
from student s
where s.sno != 2 and s.sno in
(
select distinct(sno) from sc
where cno in (select cno from sc where sno=2)
group by sno
having count(distinct cno)=
(
select count(distinct cno) from sc where sno=2
)
);
(15)刪除學習“葉平”老師課的SC表記錄;
delete from sc where cno in
(
select c.cno from course c,teacher t
where c.tno = t.tno and t.tname="葉平"
);
(16)向SC表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“2”課程的同學學號作為學號;②將“2”號課程的平均成績作為其成績;
insert into sc
select s.sno,2,(select avg(score) from sc where cno=2)
from student s
where s.sno not in (select distinct(sno) from sc where cno=2);
(17)按平均成績從低到高顯示所有學生的“語文”、“數學”、“英語”三門的課程成績,按如下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分; 【此處已補回15題中被刪除的數據】
(18)查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分; (19)按各科平均成績從低到高和及格率的百分數從高到低順序; (20)查詢如下課程平均成績和及格率的百分數(備注:需要在1行內顯示): 企業管理(2),OO&UML (3),數據庫(4) (21)查詢不同老師所教不同課程平均分從高到低顯示; (22)查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(1),馬克思(2),UML (3),數據庫(4) select sc0.sno as "學生ID",
(select score from sc where sno=sc0.sno and cno =1) as "語文" ,
(select score from sc where sno=sc0.sno and cno =2) as "數學" ,
(select score from sc where sno=sc0.sno and cno =3) as "英語" ,
count(sc0.cno) as "有效課程數",
avg(sc0.score) as "有效平均分"
from sc sc0
group by sc0.sno
order by avg(sc0.score);
select cno as "課程ID",max(score) as "最高分",min(score) as "最低分"
from sc
group by cno;
select sc.cno as "課程ID",
c.cname as "課程名稱",
avg(sc.score) as "平均分",
100*sum(case when sc.score >= 60 then 1 else 0 end)/count(sc.score) as "Percent(%)"
from sc ,course c
where sc.cno = c.cno
group by sc.cno
order by avg(sc.score) desc ;
select
sum(case when cno=2 then score else 0 end)/sum(case when cno=2 then 1 else 0 end) as "企業管理平均成績",
100*sum(case when cno=2 and score >= 60 then 1 else 0 end)/sum(case when cno=2 then 1 else 0 end) as "企業管理及格率(%)",
sum(case when cno=3 then score else 0 end)/sum(case when cno=3 then 1 else 0 end) as "OO&UML平均成績",
100*sum(case when cno=3 and score >= 60 then 1 else 0 end)/sum(case when cno=3 then 1 else 0 end) as "OO&UML及格率(%)",
sum(case when cno=4 then score else 0 end)/sum(case when cno=4 then 1 else 0 end) as "數據庫平均成績",
100*sum(case when cno=4 and score >= 60 then 1 else 0 end)/sum(case when cno=4 then 1 else 0 end) as "數據庫及格率(%)"
from sc;
select t.tname as "老師姓名",
c.cname as "課程名稱",
avg(sc.score) as "平均分"
from sc,teacher t,course c
where t.tno=c.tno and c.cno=sc.cno
group by t.tno
order by avg(sc.score) desc;
select distinct
SC.Sno As "學生學號",
Student.Sname as "學生姓名" ,
T1.score as "企業管理",
T2.score as "馬克思",
T3.score as "UML",
T4.score as "數據庫",
ifnull(T1.score,0) + ifnull(T2.score,0) + ifnull(T3.score,0) + ifnull(T4.score,0) as "總分"
from Student,SC left join SC as T1
on SC.Sno = T1.Sno and T1.Cno = 1
left join SC as T2
on SC.Sno = T2.Sno and T2.Cno = 2
left join SC as T3
on SC.Sno = T3.Sno and T3.Cno = 3
left join SC as T4
on SC.Sno = T4.Sno and T4.Cno = 4
where student.Sno=SC.Sno
order by ifnull(T1.score,0) + ifnull(T2.score,0) + ifnull(T3.score,0) + ifnull(T4.score,0) desc ;