SQL高級查詢——50句查詢(含答案) ---參考別人的,感受很好就記錄下來留着本身看。

--一個題目涉及到的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'

相關文章
相關標籤/搜索