--一個題目涉及到的50個Sql語句 --(下面表的結構以給出,本身在數據庫中創建表.而且添加相應的數據,數據要全面些. 其中Student表中,SId爲學生的ID)數據庫
------------------------------------表結構-------------------------------------- --學生表tblStudent(編號StuId、姓名StuName、年齡StuAge、性別StuSex) --課程表tblCourse(課程編號CourseId、課程名稱CourseName、教師編號TeaId) --成績表tblScore(學生編號StuId、課程編號CourseId、成績Score) --教師表tblTeacher(教師編號TeaId、姓名TeaName) ---------------------------------------------------------------------------------學習
--問題: --一、查詢「001」課程比「002」課程成績高的全部學生的學號; Select StuId From tblStudent s1 Where (Select Score From tblScore t1 Where t1.StuId=s1.stuId And t1.CourseId='001')> (Select Score From tblScore t2 Where t2.StuId=s1.stuId And t2.CourseId='002')測試
--二、查詢平均成績大於60分的同窗的學號和平均成績;ui
Select StuId,Avg(Score) as AvgScore From tblScore Group By StuId Having Avg(Score)>60string
--三、查詢全部同窗的學號、姓名、選課數、總成績; Select StuId,StuName, SelCourses=(Select Count(CourseId) From tblScore t1 Where t1.StuId=s1.StuId), SumScore=(Select Sum(Score) From tblScore t2 Where t2.StuId=s1.StuId) From tblStudent s1date
--四、查詢姓「李」的老師的個數; Select Count(*) From tblTeacher Where TeaName like '李%'select
--五、查詢沒學過「葉平」老師課的同窗的學號、姓名; Select StuId,StuName From tblStudent Where StuId Not In ( Select StuID From tblScore sc Inner Join tblCourse cu ON sc.CourseId=cu.CourseId Inner Join tblTeacher tc ON cu.TeaId=tc.TeaId Where tc.TeaName='葉平' )float
--六、查詢學過「001」而且也學過編號「002」課程的同窗的學號、姓名; Select StuId,StuName From tblStudent st Where (Select Count(*) From tblScore s1 Where s1.StuId=st.StuId And s1.CourseId='001')>0 And (Select Count(*) From tblScore s2 Where s2.StuId=st.StuId And s2.CourseId='002')>0方法
--七、查詢學過「葉平」老師所教的全部課的同窗的學號、姓名; Select StuId,StuName From tblStudent st Where not exists ( Select CourseID From tblCourse cu Inner Join tblTeacher tc On cu.TeaID=tc.TeaID Where tc.TeaName='葉平' And CourseID not in (Select CourseID From tblScore Where StuID=st.StuID) )im
--八、查詢課程編號「002」的成績比課程編號「001」課程低的全部同窗的學號、姓名; Select StuId,StuName From tblStudent s1 Where (Select Score From tblScore t1 Where t1.StuId=s1.stuId And t1.CourseId='001')> (Select Score From tblScore t2 Where t2.StuId=s1.stuId And t2.CourseId='002')
--九、查詢全部課程成績小於60分的同窗的學號、姓名; Select StuId,StuName From tblStudent st Where StuId Not IN (Select StuId From tblScore sc Where st.StuId=sc.StuId And Score>60)
--十、查詢沒有學全全部課的同窗的學號、姓名; Select StuId,StuName From tblStudent st Where (Select Count(*) From tblScore sc Where st.StuId=sc.StuId)< (Select Count(*) From tblCourse)
--十一、查詢至少有一門課與學號爲「1001」的同窗所學相同的同窗的學號和姓名; ------運用鏈接查詢 Select DistInct st.StuId,StuName From tblStudent st Inner Join tblScore sc ON st.StuId=sc.StuId Where sc.CourseId IN (Select CourseId From tblScore Where StuId='1001') ------嵌套子查詢 Select StuId,StuName From tblStudent Where StuId In ( Select Distinct StuId From tblScore Where CourseId In (Select CourseId From tblScore Where StuId='1001') )
--十二、查詢至少學過學號爲「1001」同窗全部課程的其餘同窗學號和姓名; Select StuId,StuName From tblStudent Where StuId In ( Select Distinct StuId From tblScore Where CourseId Not In (Select CourseId From tblScore Where StuId='1001')
--1三、把「SC」表中「葉平」老師教的課的成績都更改成此課程的平均成績; (從子查詢中獲取父查詢中的表名,這樣也行????) --建立測試表 Select * Into Sc From tblScore go
Update Sc Set Score=(Select Avg(Score) From tblScore s1 Where s1.CourseId=sc.CourseId) Where CourseId IN (Select CourseId From tblCourse cs INNER JOIN tblTeacher tc ON cs.TeaID=tc.TeaID WHERE TeaName ='葉平')
--1四、查詢和「1002」號的同窗學習的課程徹底相同的其餘同窗學號和姓名; Select StuID,StuName From tblStudent st Where StuId <> '1002' And Not Exists(Select * From tblScore sc Where sc.StuId=st.StuId And CourseId Not In (Select CourseId From tblScore Where StuId='1002')) And Not Exists(Select * From tblScore Where StuId='1002' And CourseId Not In (Select CourseId From tblScore sc Where sc.StuId=st.StuId))
--1五、刪除學習「葉平」老師課的SC表記錄; Delete From tblScore Where CourseId IN (Select CourseId From tblCourse cs INNER JOIN tblTeacher tc ON cs.TeaId=tc.TeaId Where tc.TeaName='葉平')
--1六、向SC表中插入一些記錄,這些記錄要求符合如下條件:沒有上過編號「003」課程的同窗學號、'002'號課的平均成績; Insert Into tblScore (StuId,CourseId,Score) Select StuId,'002',(Select Avg(Score) From tblScore Where CourseId='002') From tblScore Where StuId Not In (Select StuId From tblScore Where CourseId='003')
--1七、按平均成績從高到低顯示全部學生的「數據庫」、「企業管理」、「英語」三門的課程成績,按以下形式顯示: 學生ID,,數據庫,企業管理,英語,有效課程數,有效平均分 Select StuId ,數據庫=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='數據庫' And sc.StuID=st.StuId) ,企業管理=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='企業管理' And sc.StuID=st.StuId) ,英語=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='英語' And sc.StuID=st.StuId) ,有效課程數=(Select Count(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='數據庫' or CourseName='企業管理' or CourseName='英語') And sc.StuID=st.StuId) ,有效平均分=(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='數據庫' or CourseName='企業管理' or CourseName='英語') And sc.StuID=st.StuId) From tblStudent st Order by 有效平均分 Desc
--1八、查詢各科成績最高和最低的分:以以下形式顯示:課程ID,最高分,最低分 Select CourseId as 課程ID, 最高分=(Select Max(Score) From tblScore sc Where sc.CourseId=cs.CourseId ), 最低分=(Select Min(Score) From tblScore sc Where sc.CourseId=cs.CourseId ) From tblCourse cs
--1九、按各科平均成績從低到高和及格率的百分數從高到低順序 (百分數後如何格式化爲兩位小數??) Select 課程ID,平均分,及格率 From (Select CourseId as 課程ID, 平均分=(Select Avg(Score) From tblScore sc Where sc.CourseId=cs.CourseId ), 及格率=Convert(varchar(10),((Select Count(*) From tblScore sc Where sc.CourseId=cs.CourseId And sc.Score>=60)*10000/(Select Count(*) From tblScore sc Where sc.CourseId=cs.CourseId))/100)+'%' From tblScore cs) as tmp Group by 課程ID,平均分,及格率 Order by 平均分, Convert(float,substring(及格率,1,len(及格率)-1)) Desc
--20、查詢以下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),數據庫(004) Select 課程ID=sc.CourseId,課程名稱=cs.CourseName,平均成績=Avg(Score) ,及格率 =Convert(varchar(10),((Select Count(Score) From tblScore Where CourseId=sc.CourseId And Score>=60)*10000/Count(Score))/100.0)+'%' From tblScore sc Inner Join tblCourse cs ON sc.CourseId=cs.CourseId Where sc.CourseId like '00[1234]' Group By sc.CourseId,cs.CourseName
--2一、查詢不一樣老師所教不一樣課程平均分從高到低顯示 Select 課程ID=CourseId,課程名稱=CourseName,授課教師=TeaName,平均成績=(Select Avg(Score) From tblScore Where CourseId=cs.CourseId) From tblCourse cs Inner Join tblTeacher tc ON cs.TeaId=tc.TeaId Order by 平均成績 Desc
--2二、查詢以下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),數據庫(004) 格式:[學生ID],[學生姓名],企業管理,馬克思,UML,數據庫,平均成績 Select * From ( Select Top 6 學生ID=StuId,學生姓名=StuName ,企業管理=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='企業管理' And sc.StuID=st.StuId) ,馬克思=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='馬克思' And sc.StuID=st.StuId) ,UML=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='UML' And sc.StuID=st.StuId) ,數據庫=(Select Score From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='數據庫' And sc.StuID=st.StuId) ,平均成績=(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='數據庫' or CourseName='企業管理' or CourseName='UML'or CourseName='馬克思') And sc.StuID=st.StuId) ,排名=Row_Number() Over(Order by(Select Avg(Score) From tblScore sc Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where (CourseName='數據庫' or CourseName='企業管理' or CourseName='UML'or CourseName='馬克思') And sc.StuID=st.StuId) DESC) From tblStudent st Order by 排名 ) as tmp Where 排名 between 3 And 6
--2三、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60] Select 課程ID=CourseId, 課程名稱=CourseName ,[100-85]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 85 And 100) ,[85-70]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 70 And 84) ,[70-60]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score between 60 And 69) ,[<60]=(Select Count(*) From tblScore sc Where CourseId=cs.CourseId And Score <60) From tblCourse cs
--2四、查詢學平生均成績及其名次 Select 學號=st.StuId, 姓名=StuName,平均成績=sc.AvgScore,名次=(Dense_Rank() Over(Order by sc.AvgScore Desc)) From tblStudent st Inner Join (Select StuId,Avg(Score) as AvgScore From tblScore Group by StuId) as sc On sc.StuId=st.StuId Order by 學號
--2五、查詢各科成績前三名的記錄:(不考慮成績並列狀況) Select 學號=StuId,課程號=CourseId,分數=Score From (Select Row_Number() Over(order by CourseId,Score Desc) as i,* From tblScore) as tmp --獲得一個臨時的排名表,其中i表示編號 Where i In ( Select Top 3 i From (Select Row_Number() Over(order by CourseId,Score Desc) as i,* From tblScore) as t1 Where t1.CourseId=tmp.CourseId )
--2六、查詢每門課程被選修的學生數 Select 課程ID=CourseId,選修人數=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs
--2七、查詢出只選修了一門課程的所有學生的學號和姓名 Select 學號=StuId,姓名=StuName From tblStudent st Where (Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp)=1
--2八、查詢男生、女生人數 Select 男生人數=(select Count(*) From tblStudent Where StuSex='男'), 女生人數=(select Count(*) From tblStudent Where StuSex='女')
--2九、查詢姓「張」的學生名單 Select * From tblStudent Where StuName like '張%' --30、查詢同名同性學生名單,並統計同名人數 Select Distinct 學生姓名=StuName,同名人數=(Select Count(*) From tblStudent s2 Where s2.StuName=st.StuName) From tblStudent st Where (Select Count(*) From tblStudent s2 Where s2.StuName=st.StuName)>=2
--3一、1981年出生的學生名單(注:Student表中Sage列的類型是datetime) Select * From tblStudent Where Year(Sage)=1981
--3二、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列 Select 課程ID=CourseId,課程名稱=CourseName,平均成績=(Select Avg(Score) From tblScore Where CourseId=cs.CourseId) From tblCourse cs Order by 平均成績,CourseId Desc
--3三、查詢平均成績大於85的全部學生的學號、姓名和平均成績 Select 學號=StuId,姓名=StuName,平均成績=(Select Avg(Score) From tblScore Where StuId=st.StuId) From tblStudent st Where (Select Avg(Score) From tblScore Where StuId=st.StuId)>85
--3四、查詢課程名稱爲「數據庫」,且分數低於60的學生姓名和分數 Select 姓名=StuName,分數=Score From tblScore sc Inner Join tblStudent st On sc.StuId=st.StuId Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where CourseName='數據庫' And Score<60
--3五、查詢全部學生的選課狀況; Select 學號=StuId,選課數=(Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp) From tblStudent st
Select distinct 姓名=StuName,選修課程=CourseName From tblScore sc Inner Join tblStudent st On sc.StuId=st.StuId Inner Join tblCourse cs On sc.CourseId=cs.CourseId
--3六、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數; Select 姓名=StuName,課程名稱=CourseName,分數=Score From tblScore sc Inner Join tblStudent st On sc.StuId=st.StuId Inner Join tblCourse cs On sc.CourseId=cs.CourseId Where Score>=70
--3七、查詢不及格的課程,並按課程號從大到小排列 Select * From tblScore Where Score<60 order by CourseId Desc
--3八、查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名; Select StuId,StuName From tblStudent Where StuId in (Select StuId From tblScore Where CourseId='003' And Score>=80)
--3九、求選了課程的學生人數 Select 選了課程的學生人數=Count(*) From tblStudent st Where StuId IN (Select StuID From tblScore)
--40、查詢選修「葉平」老師所授課程的學生中,成績最高的學生姓名及其成績 Select CourseId,CourseName ,該科最高學生=(Select StuName From tblStudent Where StuId in (Select Top 1 StuID From tblScore Where CourseId=cs.CourseId Order by Score Desc)) ,成績=(Select Top 1 Score From tblScore Where CourseId=cs.CourseId Order by Score Desc) From tblCourse cs Inner Join tblTeacher tc ON cs.TeaId=tc.TeaId Where TeaName='葉平'
--4一、查詢各個課程及相應的選修人數 Select 課程ID=CourseId,選修人數=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs
--4二、查詢不一樣課程成績相同的學生的學號、課程號、學生成績 Select 學號=StuId, 課程號=CourseId, 成績=Score From tblScore sc Where Exists (Select * From tblScore Where Score=sc.Score And StuId=sc.StuId And CourseId <>sc.CourseId) Order by 學號,成績
--4三、查詢每門功成績最好的前兩名 Select 課程號=CourseId, 第1名=(Select Top 1 StuId From tblScore Where CourseId=cs.CourseId Order by Score DESC), 第2名=(Select Top 1 StuID From (Select Top 2 StuId,Score From tblScore Where CourseId=cs.CourseId Order by Score DESC) as tmp Order by Score) From tblCourse cs
--4四、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列 Select 課程ID=CourseId,選修人數=(Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp) From tblCourse cs Where (Select Count(*) From (Select Distinct StuId From tblScore Where CourseId=cs.CourseId) as tmp)>=10 Order by 選修人數 DESC, 課程ID
--4五、檢索至少選修兩門課程的學生學號 Select StuId from tblScore Group by Stuid having Count(*)>=2 --沒有重複課程數據時可用此方法
--有重複課程時用此方法(如補考) Select StuId from tblStudent st Where (Select Count(*) From (Select Distinct CourseId From tblScore Where StuId=st.StuId) as tmp)>=2
--4六、查詢所有學生都選修的課程的課程號和課程名 Select CourseId,CourseName From tblCourse cs Where Not Exists ( Select * From tblStudent Where StuId Not In --沒學過本課程的學生是否存在 (Select StuId From tblScore Where CourseId=cs.CourseId) )
--4七、查詢沒學過「葉平」老師講授的任一門課程的學生姓名 Select StuId,StuName From tblStudent Where StuId Not In ( Select StuID From tblScore sc Inner Join tblCourse cu ON sc.CourseId=cu.CourseId Inner Join tblTeacher tc ON cu.TeaId=tc.TeaId Where tc.TeaName='葉平' )
--4八、查詢兩門以上不及格課程的同窗的學號及其平均成績 Select StuID as 學號,Avg(Score) as 平均成績 From tblScore sc Where (Select Count(*) From tblScore s1 Where s1.StuId=sc.StuId And Score<60)>=2 Group By StuId
--4九、檢索「004」課程分數小於60,按分數降序排列的同窗學號 (ok) Select StuID,Score From tblScore Where CourseId='004' And Score<60 Order by Score Desc
--50、刪除「002」同窗的「001」課程的成績 Delete From SC Where StuId='1002' And CourseId='001'