學生表:student(學號sno,學生姓名sname,出生年月sbirth,性別ssex)
成績表:score(學號sno,課程號cno,成績score)
課程表:course(課程號cno,課程名稱cname,教師號ctno)
教師表:teacher(教師號tno,教師姓名tname)
注意:下面SQL的實現以MySQL為主
/*
分析思路
select 查詢結果 [課程ID:是課程號的別名,最高分:max(成績) ,最低分:min(成績)]
from 從哪張表中查找數據 [成績表score]
where 查詢條件 [沒有]
group by 分組 [各科成績:也就是每門課程的成績,需要按課程號分組];
*/
select 課程號,max(成績) as 最高分,min(成績) as 最低分from score
group by 課程號;
/*
題目翻譯成大白話:
平均成績:展開來說就是計算每個學生的平均成績
這里涉及到“每個”就是要分組了
平均成績大于60分,就是對分組結果指定條件
*/
select 學號, avg(成績)from score group by 學號having avg(成績)>60;
/*
翻譯成大白話:
第1步,需要先計算出每個學生選修的課程數據,需要按學號分組
第2步,至少選修兩門課程:也就是每個學生選修課程數目>=2,對分組結果指定條件
*/
select 學號, count(課程號) as 選修課程數目from score group by 學號 having count(課程號)>=2;
/*
翻譯成大白話,問題解析:
1)查找出姓名相同的學生有誰,每個姓名相同學生的人數
查詢結果:姓名,人數
條件:怎么算姓名相同?按姓名分組后人數大于等于2,因為同名的人數大于等于2
*/
select 姓名,count(*) as 人數 from student group by 姓名
having count(*)>=2;
select 課程號, avg(成績) as 平均成績from score
group by 課程號 order by 平均成績 asc,課程號 desc;
要求輸出課程號和選修人數,查詢結果按人數降序排序,若人數相同,按課程號升序排序。
select 課程號, count(學號) as '選修人數'
from score group by 課程號having count(學號)>2
order by count(學號) desc,課程號 asc;
/*第1步:得到每個學生的平均成績,顯示學號,平均成績*/
select 學號, avg(成績) as 平均成績 from score group by 學號;
/* 第2步:再加上限制條件:*/
select 學號, avg(成績) as 平均成績from score where 成績 <60 group by 學號 having count(課程號)>=2;