SQL server查询试题

最近被几到SQL server的查询难道了。

查询没学过"张三"老师讲授的任一门课程的学生姓名:

select * fromStudent s

wheres.Sid not in(

selectsc.Sid

fromteacher t

left joinCourse conc.Tid=t.Tid

left joinsconc.Cid=sc.Cid

wheret.Tname='张三')

查询出学生的id,然后条件的过滤掉(not in)在子查询里面查询出学过'张三'老师教过的学生。

查询本月过生日的学生信息:

select * fromStudent

where month(GETDATE())=month(Sage)

先查询出学生表里面的所有信息,再根据关键词month()月,来条件判断,month(GETDATE())=month(Sage),SQL server 当前时间的关键词GETDATE()等于学生表里面的学生出生日期(关键词month()会找出月份)

查询 1990 年出生的学生信息:

select * fromStudent

where YEAR(Sage)='1990'

先查询出学生表里面的所有信息,再根据关键词YEAR()年,来条件判断,学生是否出生与'1990'

查询课程编号“02”的成绩比课程编号“01”课程低的所有同学的学号、姓名

selects.*

from(

        select sid,score

        fromsc

        wherecid='02')s1

        ,(

        select sid,score

        fromsc

        wherecid='01')s2

        ,Student s

wheres.Sid=s1.Sid

ands1.Sid=s2.Sid

ands1.score<s2.score

这是其中的一个方法,也可以用连表来做,我这里用了子查询的方法。

先查询成绩表分别查询出:课程编号“02”的成绩和课程编号“01”的成绩;

再通过条件先把他们的学生id绑定一起,然后再比较“01”比“02” 成绩高。

查询成绩表中各科成绩前三名的信息以及排名:

select *

from(

        select sid,cid,score,

        row_number()over(

        partition bycid

        order byscoredesc) aspaimin

        fromsc)a

wherea.paimin<4

使用了row_number()分页,注意使用row_number函数时必须要用over子句选择对某一列,或者几列进行排序才能生成序号。

直接使用查询就可以查询出分页数据,但是不能条件的筛选列:paimin的数据,使用需要加多一个外层,用子查询查询出来,给表加一个名称。

查询各学生的姓名、年龄(只按年份来计算)

selectsname,

YEAR(GETDATE())-YEAR(Sage) 年龄

fromStudent

在查询的时候,用当前的年份减去学生出生的年份,等于他们的年龄

如图:

 


版权声明:本文为Ruyand原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。