50个SQL语句(五)

2015-02-03 12:09:38 · 作者: · 浏览: 350
s.sid=a.sid anda.cid='01' where s.sid not in (select sid from sc where cid='02')?

--方法1

select Student.*from Student , SC where Student.Sid = SC.Sid and SC.Cid ='01'andnotexists (Select1from SC SC_2 where SC_2.Sid = SC.Sid and SC_2.Cid ='02') orderby Student.Sid

--方法2

select Student.*from Student , SC where Student.Sid = SC.Sid and SC.Cid ='01'and Student.Sid notin (Select SC_2.Sid from SC SC_2 where SC_2.Sid = SC.Sid and SC_2.Cid ='02') orderby Student.Sid?

--11、查询没有学全所有课程的同学的信息

思路:从全部学生中(一个记录集合)提取在SC表中课程总数不是全部的学生(一个记录集合)

select * fromstudent where sid in

(select sid from

(select sid,count(*) as abc from sc group by sid having count(*)<(select count(*) from course)) t)

该方法只列出有课程分数的学生,一个课程分数也没有的学生不存在第二个记录集合中。?

思路:从全部学生中(一个记录集合)排除在SC表中有全部课程分数的学生(一个记录集合)

select * fromstudent where sid notin

(select sid from

(select sid,count(*) as abc from sc group by sid having count(*)=(select count(*) from course)) t)

该方法还会列出一个课程分数都没有的学生。?

--11.1

select Student.*

from Student , SC

where Student.Sid = SC.Sid

groupby Student.Sid , Student.Sname ,Student.Sage , Student.Ssex havingcount(Cid)< (selectcount(Cid) from Course)?

--11.2

select Student.*

from Student leftjoin SC

on Student.Sid = SC.Sid

groupby Student.Sid , Student.Sname ,Student.Sage , Student.Ssex havingcount(Cid)< (selectcount(Cid) from Course)?

--12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息

思路:从全部学生中(一个记录集合)提取所学课程中至少有一门和学生01所学课程相同(一个记录集合)(也就是课程ID至少有一个存在于学生01的课程ID中)并排除学生01

select * fromstudent where sid in

(select distinct sid from sc where cid in

(select cid from sc where sid='01') and sid<>'01')?

selectdistinct 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"号的同学学习的课程完全相同的其他同学的信息

思路:从全部学生中(一个记录集合)提取所学全部课程ID存在于学生01的课程ID中并且课程总数等于学生01的课程总数(一个记录集合)

select * fromstudent where sid in

(select distinct sid from sc where cid in

(select cid from sc where sid='01') and sid<>'01' group by sid

having count(*)=(select count(*) from sc where sid='01'))?

select Student.*from Student where Sid in

(selectdistinct SC.Sid from SC where Sid <>'01'and SC.Cid in (selectdistinct Cid from SC where Sid ='01')

groupby SC.Sid havingcount(1) = (selectcount(1) from SC where Sid='01'))?

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

思路:从全部学生中(一个记录集合)排除学过老师张三上过的课的学生(一个记录集合)(就是在SC表中有张三老师上过的课的分数)

select * fromstudent where sid notin

(select distinct a.sid from sc a inner join course b

on a.cid=b.cid innerjoin teacher c

on b.tid=c.tid wherec.tname='张三')?

select student.*from student where student.Sid notin

(selectdistinct sc.Sid from sc , course , teacher where sc.Cid = course.Cid and course.Tid = teacher.Tid and teacher.tname = N'张三')

orderby student.Sid?

--15☆、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

思路:全部学生(一个记录集合),两门及以上不及格课程(一个记录集合)

select * fromstudent s inner join

(select sid,count(*) as '不及格课程总数',convert(decimal(18,2),avg(score)) as '平均分数' from sc where score<60 group by sid having count(*)>=2) b

on s.sid=b.sid?

select s.sid,s.sname,convert(decimal(5,2),avg(a.score)) as average fromstudent s inner joinsc a

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

(select sid from

(select sid,count(*) as times from sc where score<60 group by sid having count(*)>=2) t)?

select student.Sid ,student.sname , cast(avg(score) asdecimal(18,2)) avg_score from student , sc

where student.Sid = SC.Sid and student.Sid in (select Sid from SC where score <60groupby Sid havingcount(1) >=2)

groupby student.Sid , student.sname?

--16、检索"01"课程分数小于60,按分数降序排列的学生信息

思路:全部学生(一个记录集合),课程01分数小于60(一个记录集合)

selec