50个SQL语句(二)

2015-02-03 12:09:38 · 作者: · 浏览: 346
re [课程"01"的分数],c.score [课程"02"的分数]from Student a leftjoin SC b

on a.Sid = b.Sid and b.Cid ='01'leftjoin SC c

on a.Sid = c.Sid and c.Cid ='02'

where b.score >isnull(c.score,0)

--2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数

select * fromstudent s inner joinsc a

on s.sid=a.sid anda.cid='01' inner join sc b

on s.sid=b.sid andb.cid='02' where a.score

--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 * fromstudent s left joinsc a

on s.sid=a.sid and(a.cid='01' or a.cid is null) inner join sc b

on s.sid=b.sid andb.cid='02'

select * fromstudent s inner join

(select * from sc where cid='02') a on s.sid=a.sid left join

(select * from sc where (cid='01' or cid is null)) b on s.sid=b.sid

select a.* , b.score [课程"01"的分数],c.score [课程"02"的分数]from Student a

leftjoin SC b on a.Sid = b.Sid and b.Cid ='01'

leftjoin SC c on a.Sid = c.Sid and c.Cid ='02'

whereisnull(b.score,0) < c.score

--3、查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

思路:平均成绩大于等于60分(一个记录集合),STUDENT表(一个记录集合)

select s.sid,s.sname,b.[平均成绩] fromstudent s inner join

(select sid,convert(decimal(18,2),avg(score)) as '平均成绩' from sc group by sid having avg(score)>=60) b

on s.sid=b.sid

select * fromstudent s inner join

(select sid,avg(score) as avgscore from sc group by sid having avg(score)>=60) a

on s.sid=a.sid?

select a.Sid , a.Sname , cast(avg(b.score) asdecimal(18,2)) avg_score

from Student a , sc b

where a.Sid = b.Sid

groupby a.Sid , a.Sname

havingcast(avg(b.score) asdecimal(18,2)) >=60

orderby a.Sid?

--4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

思路:平均成绩小于60分(一个记录集合),STUDENT(一个记录集合)

select s.sid,s.sname,b.[平均成绩] fromstudent s inner join

(select sid,convert(decimal(18,2),avg(score)) as '平均成绩' from sc group by sid having avg(score)>60) b

on s.sid=b.sid?

--4.1、查询在sc表存在成绩的学生信息的SQL语句。

思路:STUDENT表(一个记录集合)是否有记录包含在SC表(一个记录集合)

select * fromstudent where sid in(select sid from sc)?

select * fromstudent s where exists(select 1 from sc a where s.sid=a.sid)

select a.Sid , a.Sname , cast(avg(b.score) asdecimal(18,2)) avg_score

from Student a , sc b

where a.Sid = b.Sid

groupby a.Sid , a.Sname

havingcast(avg(b.score) asdecimal(18,2)) <60

orderby a.Sid

--4.2、查询在sc表中不存在成绩的学生信息的SQL语句。

select * from student where sid not in (select distinct sid from sc)

select * fromstudent s where notexists (select 1 from sc a where s.sid=a.sid)

select a.Sid , a.Sname , isnull(cast(avg(b.score) asdecimal(18,2)),0) avg_score

from Student a leftjoin sc b

on a.Sid = b.Sid

groupby a.Sid , a.Sname

havingisnull(cast(avg(b.score) asdecimal(18,2)),0) <60

orderby a.Sid

--5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

思路:SC表的选课总数、总成绩(一个记录集合),STUDENT表(一个记录集合)

select s.sid,s.sname,a.[选课总数],a.[总成绩] fromstudent s inner join

(select sid,count(*) as '选课总数',sum(score) as '总成绩' from sc group by sid) a

on s.sid=a.sid

select * fromstudent s inner join

(select sid,count(cid) as '课程总数',sum(score) as '课程总成绩' from sc group by sid) a

on s.sid=a.sid

select s.sid,s.sname,count(a.cid) as '课程总数',sum(a.score) as '课程总成绩' from student s inner join sc a

on s.sid=a.sid groupby s.sid,s.sname

--5.1、查询所有有成绩的SQL。

select s.sid,s.sname,a.[选课总数],a.[总成绩] fromstudent s inner join

(select sid,count(*) as '选课总数',sum(score) as '总成绩' from sc group by sid) a

on s.sid=a.sid

select a.Sid [学生编号], a.Sname [学生姓名], co