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