SQL高級查詢——50句查詢(含答案)

--一個題目涉及到的50個Sql語句數據庫

--(下面表的結構以給出,本身在數據庫中創建表.而且添加相應的數據,數據要全面些. 其中Student表中,SId爲學生的ID)學習

 

------------------------------------表結構--------------------------------------測試

--學生表tblStudent(編號StuId、姓名StuName、年齡StuAge、性別StuSex)ui

--課程表tblCourse(課程編號CourseId、課程名稱CourseName、教師編號TeaId)string

--成績表tblScore(學生編號StuId、課程編號CourseId、成績Score)table

--教師表tblTeacher(教師編號TeaId、姓名TeaName)ast

---------------------------------------------------------------------------------class

 

--問題:date

--一、查詢「001」課程比「002」課程成績高的全部學生的學號;select

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分的同窗的學號和平均成績;

 

Select StuId,Avg(Score) as AvgScore From tblScore

Group By StuId

Having Avg(Score)>60

 

--三、查詢全部同窗的學號、姓名、選課數、總成績;

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 s1

 

--四、查詢姓「李」的老師的個數;

Select Count(*) From tblTeacher Where TeaName like '李%'

 

--五、查詢沒學過「葉平」老師課的同窗的學號、姓名;

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='葉平'

)

 

--六、查詢學過「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)

)

 

--八、查詢課程編號「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 tblSt

 

udent 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.StuI

 

D=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 tblCour

 

se 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 Stu

 

Sex='男'),

女生人數=(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 Cour

 

seId=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 St

 

uId='1002' And CourseId='001'

 

 

 

----------------------SC爲刪除數據臨時表

Select * INTO SC From tblScore

Select * from sc Where stuId='1018'

Insert Sc(Stuid,courseId,Score) Select StuID,'009',74 From tblStudent

 

 

 

 

 

/********************************* 建庫建表建約束,插入測試數據 ******************************************/

Use master

go

if db_id('MySchool') is not null

Drop Database MySchool

Create Database MySchool

go

Use MySchool

go

create table tblStudent

(

StuId varchar(5) primary key,

StuName nvarchar(10) not null,

StuAge int,

StuSex nchar(1) not null

)

create table tblTeacher

(

TeaId varchar(3) primary key,

TeaName varchar(10) not null

)

create table tblCourse

(

CourseId varchar(3) primary key,

CourseName nvarchar(20) not null,

TeaId varchar(3) not null foreign key references tblTeacher(teaId)

)

create table tblScore

(

StuId varchar(5) not null foreign key references tblStudent(stuId),

CourseId varchar(3) not null foreign key references tblCourse(CourseId),

Score float

)

相關文章
相關標籤/搜索