SQL面試,讓你的面試官無fu,ck可說,第17題難倒一片人
問題及描述:
1.學生表
Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
2.課程表
Course(CID,Cname,TID) --CID --課程編號,Cname 課程名稱,TID 教師編號
3.教師表
Teacher(TID,Tname) --TID 教師編號,Tname 教師姓名
4.成績表
SC(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數
創建測試數據
create table Student(Sid varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
insert into Student values(01 , N化懷彬 , 1990-01-01 , N男)
insert into Student values(02 , N肖易 , 1990-12-21 , N男)
insert into Student values(03 , N韋達 , 1990-05-20 , N男)
insert into Student values(04 , N姜雪 , 1990-08-06 , N女)
insert into Student values(05 , N秦蓉 , 1991-12-01 , N女)
insert into Student values(06 , N陳丹紅 , 1992-03-01 , N女)
insert into Student values(07 , N韋瀚瑜 , 1989-07-01 , N男)
insert into Student values(08 , N鍾愛軍 , 1990-01-20 , N男)
insert into Student values(09 , N王小凡 , 1985-02-20 , N男)
insert into Student values(10 , N于海洲 , 1989-04-13 , N男)
insert into Student values(11 , N姜曉亮 , 1992-11-03 , N男)
insert into Student values(12 , N王炳洲 , 1989-04-13 , N男)
insert into Student values(13 , N閆衛龍 , 1992-11-03 , N男)
create table Course(Cid varchar(10),Cname nvarchar(10),Tid varchar(10))
insert into Course values(01 , N語文 , 02)
insert into Course values(02 , N數學 , 01)
insert into Course values(03 , N英語 , 03)
create table Teacher(Tid varchar(10),Tname nvarchar(10))
insert into Teacher values(01 , N小徐老師)
insert into Teacher values(02 , N歡歡老師)
insert into Teacher values(03 , N小姜老師)
create table SC(Sid varchar(10),Cid varchar(10),score decimal(18,2))
insert into SC values(01 , 01 , 80)
insert into SC values(01 , 02 , 90)
insert into SC values(01 , 03 , 99)
insert into SC values(02 , 01 , 70)
insert into SC values(02 , 02 , 60)
insert into SC values(02 , 03 , 80)
insert into SC values(03 , 01 , 80)
insert into SC values(03 , 02 , 80)
insert into SC values(03 , 03 , 80)
insert into SC values(04 , 01 , 50)
insert into SC values(04 , 02 , 30)
insert into SC values(04 , 03 , 20)
insert into SC values(05 , 01 , 76)
insert into SC values(05 , 02 , 87)
insert into SC values(06 , 01 , 31)
insert into SC values(06 , 03 , 34)
insert into SC values(07 , 02 , 89)
insert into SC values(07 , 03 , 98)
insert into SC values(08 , 01 , 92)
insert into SC values(08 , 02 , 90)
insert into SC values(08 , 03 , 89)
insert into SC values(09 , 01 , 28)
insert into SC values(09 , 02 , 19)
insert into SC values(09 , 03 , 32)
insert into SC values(10 , 01 , 82)
insert into SC values(10 , 02 , 76)
insert into SC values(10 , 03 , 89)
insert into SC values(11 , 01 , 98)
insert into SC values(11 , 02 , 83)
insert into SC values(11 , 03 , 99)
insert into SC values(12 , 01 , 82)
insert into SC values(12 , 02 , 80)
insert into SC values(12 , 03 , 83)
insert into SC values(13 , 01 , 80)
insert into SC values(13 , 02 , 83)
insert into SC values(13 , 03 , 82)
go
1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
1.1、查詢同時存在"01"課程和"02"課程的情況
select a.* , b.score [課程01的分數],c.score [課程02的分數] from Student a , SC b , SC c where a.SID = b.SID and a.SID = c.SID and b.CID = 01 and c.CID = 02 and b.score > c.score
1.2、查詢同時存在"01"課程和"02"課程的情況和存在"01"課程但可能不存在"02"課程的情況(不存在時顯示為null)(以下存在相同內容時不再解釋)
select a.* , b.score [課程"01"的分數],c.score [課程"02"的分數] from Student a left join SC b on a.SID = b.SID and b.CID = 01 left join SC c on a.SID = c.SID and c.CID = 02 where b.score > isnull(c.score,0)
2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
2.1、查詢同時存在"01"課程和"02"課程的情況
select a.* , b.score [課程01的分數],c.score [課程02的分數] from Student a , SC b , SC c where a.SID = b.SID and a.SID = c.SID and b.CID = 01 and c.CID = 02 and b.score < c.score
2.2、查詢同時存在"01"課程和"02"課程的情況和不存在"01"課程但存在"02"課程的情況
select a.* , b.score [課程"01"的分數],c.score [課程"02"的分數] from Student a left join SC b on a.SID = b.SID and b.CID = 01 left join SC c on a.SID = c.SID and c.CID = 02 where isnull(b.score,0) < c.score
3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score from Student a , sc b where a.SID = b.SID group by a.SID , a.Sname having cast(avg(b.score) as decimal(18,2)) >= 60 order by a.SID
4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
4.1、查詢在sc表存在成績的學生信息的SQL語句。
select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score from Student a , sc b where a.SID = b.SID group by a.SID , a.Sname having cast(avg(b.score) as decimal(18,2)) < 60 order by a.SID
4.2、查詢在sc表中不存在成績的學生信息的SQL語句。
select a.SID , a.Sname , isnull(cast(avg(b.score) as decimal(18,2)),0) avg_score from Student a left join sc b on a.SID = b.SID group by a.SID , a.Sname having isnull(cast(avg(b.score) as decimal(18,2)),0) < 60 order by a.SID
5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
5.1、查詢所有有成績的SQL。
select a.SID [學生編號], a.Sname [學生姓名], count(b.CID) 選課總數, sum(score) [所有課程的總成績] from Student a , SC b where a.SID = b.SID group by a.SID,a.Sname order by a.SID --5.2、查詢所有(包括有成績和無成績)的SQL。
select a.SID [學生編號], a.Sname [學生姓名], count(b.CID) 選課總數, sum(score) [所有課程的總成績] from Student a left join SC b on a.SID = b.SID group by a.SID,a.Sname order by a.SID
6、查詢"李"姓老師的數量
--方法1
select count(Tname) ["李"姓老師的數量] from Teacher where Tname like N李%
--方法2
select count(Tname) ["李"姓老師的數量] from Teacher where left(Tname,1) = N李 /* "李"姓老師的數量 ----------- 1 */
7、查詢學過"張三"老師授課的同學的信息
select distinct Student.* from Student , SC , Course , Teacher where Student.SID = SC.SID and SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = N張三 order by Student.SID
8、查詢沒學過"張三"老師授課的同學的信息
select m.* from Student m where SID not in (select distinct SC.SID from SC , Course , Teacher where SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = N張三) order by m.SID
9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的信息
--方法1
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = 01 and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = 02) order by Student.SID
--方法2
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = 02 and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = 01) order by Student.SID
--方法3
select m.* from Student m where SID in ( select SID from ( select distinct SID from SC where CID = 01 union all select distinct SID from SC where CID = 02 ) t group by SID having count(1) = 2 ) order by m.SID
10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
--方法1
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = 01 and not exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = 02) order by Student.SID
--方法2 select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = 01 and Student.SID not in (Select SC_2.SID from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = 02) order by Student.SID
11、查詢沒有學全所有課程的同學的信息
11.1、
select Student.* from Student , SC where Student.SID = SC.SID group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
11.2
select Student.* from Student left join SC on Student.SID = SC.SID group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
12、查詢至少有一門課與學號為"01"的同學所學相同的同學的信息
select distinct Student.* from Student , SC where Student.SID = SC.SID and SC.CID in (select CID from SC where SID = 01) and Student.SID <> 01
13、查詢和"01"號的同學學習的課程完全相同的其他同學的信息
select Student.* from Student where SID in (select distinct SC.SID from SC where SID <> 01 and SC.CID in (select distinct CID from SC where SID = 01) group by SC.SID having count(1) = (select count(1) from SC where SID=01))
14、查詢沒學過"張三"老師講授的任一門課程的學生姓名
select student.* from student where student.SID not in (select distinct sc.SID from sc , course , teacher where sc.CID = course.CID and course.TID = teacher.TID and teacher.tname = N張三) order by student.SID
15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
select student.SID , student.sname , cast(avg(score) as decimal(18,2)) avg_score from student , sc where student.SID = SC.SID and student.SID in (select SID from SC where score < 60 group by SID having count(1) >= 2) group by student.SID , student.sname
16、檢索"01"課程分數小於60,按分數降序排列的學生信息
select student.* , sc.CID , sc.score from student , sc where student.SID = SC.SID and sc.score < 60 and sc.CID = 01 order by sc.score desc
17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
17.1 靜態
select a.SID 學生編號 , a.Sname 學生姓名 , max(case c.Cname when N語文 then b.score else null end) [語文], max(case c.Cname when N數學 then b.score else null end) [數學], max(case c.Cname when N英語 then b.score else null end) [英語], cast(avg(b.score) as decimal(18,2)) 平均分 from Student a left join SC b on a.SID = b.SID left join Course c on b.CID = c.CID group by a.SID , a.Sname order by 平均分 desc
17.2 動態
declare @sql nvarchar(4000) set @sql = select a.SID + N學生編號 + , a.Sname + N學生姓名 select @sql = @sql + ,max(case c.Cname when N+Cname+ then b.score else null end) [+Cname+] from (select distinct Cname from Course) as t set @sql = @sql + , cast(avg(b.score) as decimal(18,2)) + N平均分 + from Student a left join SC b on a.SID = b.SID left join Course c on b.CID = c.CID group by a.SID , a.Sname order by + N平均分 + desc exec(@sql)
希望對大家面試有幫助,很經典的幾道題,大家有興趣的話,歡迎大家加群討論,QQ群號:295383988
推薦閱讀:
TAG:SQL | SQL語句 | MicrosoftSQLServer |