最近被几到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
在查询的时候,用当前的年份减去学生出生的年份,等于他们的年龄
如图: