数据库练习题(1)
1、表的數據結構如下:
student表(sno,sname,sage)--學號,姓名,學生年齡
course表(cno,cname,tno)--課程代碼,課程名稱,老師工號
sc表(sno,cno,score)--學號,課程代碼,分數
teacher表(tno,tname)--老師工號,老師姓名
1)查詢'001'課程比'002'課程成績高的的所有學生學號
分析:相關的表sc,
方法1:分別找出001課程與002課程所有信息,然后從兩個表中找出001大于002的學生學號,這種方法會用到兩個子查詢,會比較慢
方法2:用聯合查詢,把第1個SC跟第2個SC通過學號聯合再一起,然后找出聯合表1中001的課程,表2中002的課程,且表1中001課程要大于表2中002課程
語句:
select s1.sno from sc s1,sc s2
where s1.sno = s2.sno and s1.cno = '001' and s2.cno = '002' and s1.score > s2.score;
2)查詢平均成績大于60分的學生學號和平均成績
分析:相關的表sc,平均成績:avg(score)
方法1:用1個子查詢,通過學生學號找出所有學生的平均成績,然后從這個 表格中找出大于60分的學生學號及平均成績即可
方法2:顯然第1個方法,比較冗余,因此在進行分組查詢時,進行條件限制一下就可以了,group by sno having avg(score)>60
語句:
select sno,avg(score) from sc group by sno having avg(score)>60;
注意:
查詢學生的平均成績時,必須先對表進行分組查詢。
3)查詢所有學生的學號,姓名,選課數,總成績。
分析:相關的表有學生表student,成績表sc
方法:把student表跟sc表通過學號聯合,然后通過學號進行分組,統計出每個學號的課程的總數(count),及總成績(sum);
語句:
select s1.sno,s1.sname,count(s2.cno),sum(s2.score)
from student s1,sc s2
where s1.sno = s2.sno group by s1.sno;
4)查詢姓李老師的個數
分析:相關的表teacher
方法:統計個數用count函數,查詢李姓老師,用like'李%'
語句:
select count(tname) from teacher where tname like'李%';
注意:like前面要加上where
5)查詢所有課程成績小于60分的學生姓名和學號
分析:相關的表student,score
方法:把這兩個表student與score通過學號進行聯合,通過學號進行分組(group by),并且選出所有課程成績小于60的學生;
又因是所有的課程成績都要小于60,那么找出每個學生中所有課程中最大的課程,當比最大課程還小時,那么這個學生的所有課程肯定所有課程肯定都小于60(max(score)<60)
語句:
select s1.sno,s1.sname
from student s1,score s2
where s1.sno = s2.sno group by sno having max(score) < 60;
?
轉載于:https://www.cnblogs.com/sinco-20161121/p/6144883.html
總結
- 上一篇: she&nbsp;surface
- 下一篇: mySQL:两表更新(用一个表更新另一个