首页 > 代码库 > 例题详解2
例题详解2
查询成绩比该课程平均成绩低的同学的成绩表。
select * from score t1 left join
(
select cno,avg(degree) as ‘avg‘ from score group by cno
) t2
on t1.cno=t2,cno
where t1.degree<t2.avg
第一步是:查出每科的平均成绩, select cno,avg(degree) as ‘avg‘ from score group by cno ,
以课程进行分组,并建立新表,别名是 ‘avg‘,别名必须写,否则 t2 找不到数据,这是新建的列
也可以是不同写法,as a 或者 as [avg] 在这因为avg 是关键字(就是表中有其已经出现的)所以加括号
第二步是:与成绩表链接,
select * from score t1 left join () on,并且是左连接,以成绩表为基准,使之每个人的成绩与其平均成绩相对应,
方便看其大小,相当于平均成绩,贴到每个人身上,然后,每个人和自己的平均成绩对比。
第三步是:添加条件 where t1.degree<t2.avg
查询所有未讲课的教师的Tname和Depart.
看其有没有讲课在成绩表里看,因为没有成绩就不会有讲课
首先是查出成绩表,然后与其教师表链接
但是,成绩表与其没有相同的属性
而,课程表与教师表有相同属性
所以,成绩表先与其课程表链接
而后,课程表与教师表再连
实现,三表链接
select * from score t1 right join course t2 on t1.cno=t2.cno right join Teacher t3 on t3.tno=t2.tno where t1.cno is null
这时所有的表中数据都会出现,然后添加条件where t1.cno is null,意思是,成绩表score中编号cno 为空
也可以是score表中的成绩为空,都可以,能区分就行
然后改其字段,* 变为 t3.tname , t3.Depart 即可
右连接,是因为,以右表为准,没有讲课的老师,则会左边为空,没有与之对应的学生和课程以及成绩
若是左链接,则会出现,相应的学生,课程,及成绩的后面,没有与之对应的老师,为空
查询Student表中每个学生的姓名和年龄。
第一种方法:
select datediff (year,sbirthday,getdate()) * from Student
里面有三个参数,一个是年,一个是初始时间,一个是现在时间
也可以写具体时间‘1990-1-1’
第二种方法:
select Sname,year(getdate())-year(sbirthday)from Student
例题详解2