SOQ server 查询
作者:互联网
--一、设有一数据库,包括四个表:
--学生表(Student)、课程表(Course)、
--成绩表(Score)以及教师信息表(Teacher)。
--四个表的结构分别如表1-1的表(一)~表(四)所示,
--数据如表1-2的表(一)~表(四)所示。
--用SQL语句创建四个表并完成相关题目。
create table Student(
Sno char(3) not null primary key,
Sname char(8) not null,
Ssex char(2) not null,
Sbirthday datetime ,
Class char(5)
);
insert into Student
select 108,'曾华','男','1977-09-01','95033'union
select 105,'匡明','男','1975-10-02','95031'union
select 107,'王丽','女','1976-01-23','95033'union
select 101,'李军','男','1976-02-20','95033'union
select 109,'王芳','女','1975-02-10','95031'union
select 103,'陆君','男','1974-06-03','95031'
create table Courses (
Cno char(5) not null primary key,
Cname varchar(10) not null ,
Tno char(5) not null
);
insert into Courses
select '3-105','计算机导论','825'union
select '3-245','操作系统','804'union
select '6-166','数字电路','856'union
select '9-888','高等数学','831'
create table Score(
Sno char(3) not null,
Cno char(5) not null,
Degree decimal(4,1)
);
insert into Score
select '103','3-245','86'union
select '105','3-245','75'union
select '109','3-245','68'union
select '103','3-105','92'union
select '10 5','3-105','88'union
select '109','3-105','76'union
select '101','3-105','64'union
select '107','3-105','91'union
select '108','3-105','78'union
select '101','6-166','85'union
select '107','6-166','79'union
select '108','6-166','81'
create table Teach(
Tno char(3) not null primary key ,
Tname varchar(4) not null,
Tsex char(2) not null ,
Tbirthday datetime null,
Prof varchar(6) null,
Depart varchar(10) not null
);
insert into Teach
select '804','李城','男','1958-12-02','副教授','计算机系'union
select '856','张旭','男','1969-03-12','讲师','电子工程系'union
select '825','王萍','女','1972-05-05','助教','计算机系'union
select '831','刘冰','女','1977-08-14','助教','电子工程系'
--1、 查询Student表中的所有记录的Sname、Ssex和Class列。
select Sname,Ssex,Class from Student
--2、 查询教师所有的单位即不重复的Depart列。
select distinct Depart from Teach
--3、 查询Student表的所有记录。
select *from Student
--4、 查询Score表中成绩在60到80之间的所有记录。
select *from Score where Degree between '60' and '80'
--5、 查询Score表中成绩为85,86或88的记录。
select *from Score where Degree='85' or Degree='86' or Degree='88'
--6、 查询Student表中“95031”班或性别为“女”的同学记录。
select *from Student where Class='95031' or Ssex= '女';
--7、 以Class降序查询Student表的所有记录。
select *from Student order by Class desc
--8、 以Cno升序、Degree降序查询Score表的所有记录。
select *from Score order by Cno ,Degree desc
--9、 查询“95031”班的学生人数。
select count(*)as '95031班人数' from Student where Class='95031' group by Class
--10、查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
select *from Score where Degree =(
select MAX(Degree) from Score
)
select top 1 Sno,Cno from Score order by Degree desc
--11、查询‘3-105’号课程的平均分。
select Cno,AVG(Degree) from Score where Cno='3-105'group by Cno;
SELECT Cno,ROUND(AVG(degree),2) FROM Score
GROUP BY Cno
--12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select Cno ,AVG(Degree)
from Score where Cno like '3%'
group by Cno
having COUNT(Sno)>=5;
--13、查询最低分大于70,最高分小于90的Sno列。
select * from Score
where degree>70 and degree<90
select Sno from Score group by
Sno having MAX(Degree)<90 and MIN(Degree)>70
--14、查询所有学生的Sname、Cno和Degree列。
select a.Sname,b.Cno,b.Degree from Student a join Score b on a.Sno=b.Sno
--15、查询所有学生的Sno、Cname和Degree列。
select a.Sno,b.Degree,c.Cname from Student a join Score b on a.Sno=b.Sno join Courses c on b.Cno=c.Cno
--16、查询所有学生的Sname、Cname和Degree列。
select a.Sname,b.Degree,c.Cname from Student a join Score b on a.Sno=b.Sno join Courses c on b.Cno=c.Cno
--17、查询“95033”班所选课程的平均分。
select Cname,AVG(Degree) from
Student inner join Score on (Student.Sno=Score.Sno) inner join
Courses on Score.Cno=Courses.Cno where Class='95033'
group by Courses .Cno order by Cname
--18、假设使用如下命令建立了一个grade表:
create table grade(low int,upp int,ranks char(1));
insert into grade values(90,100,'A')
insert into grade values(80,89,'B')
insert into grade values(70,79,'C')
insert into grade values(60,69,'D')
insert into grade values(0,59,'E')
--现查询所有同学的Sno、Cno和rank列。
select Sno,Cno,ranks from Score inner join grade on
Score.Degree>=grade.low and Score.Degree<=grade.upp
order by Sno;
select a.Sno,b.Cno,c.ranks from Student a full join Score b on a.Sno=b.Sno full join grade c on b.Cno=c.ranks
--19、 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select *from Student inner join
(select *from Score where Cno='3-105'
and Degree>(select Degree from Score where Sno='109'
and Cno='3-105')) as s2
on (Student.Sno=s2.Sno) order by Student.Sno
--20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。
select Score.Sno,Cno,Degree,md From Score inner join(select Sno,MAX(Degree) md from Score
group by Sno having COUNT(*) >1)
max on Score.Sno=max.Sno and Degree <md order by Sno
--21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
select a.Sno,a.Degree
from Score a inner join Score b on a.Cno=b.Cno and a.Degree>b.Degree
where a.Cno='3-105' and b.Sno='109' order by a.Sno
--22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
select a.Sno ,a.Sname,a.Sbirthday from Student a join Student b on
YEAR(a.Sbirthday)=YEAR(b.Sbirthday) where b.Sno='108'
--23、查询“张旭“教师任课的学生成绩。
select Sno Degree
from Score a inner join Courses b
on a.Cno=b.Cno join Teach c on b.Tno=c.Tno where c.Tname='张旭';
--24、查询选修某课程的同学人数多于5人的教师姓名。
select distinct Tname from Score a join Courses b on
a.Cno=b.Cno join Teach c on b.Tno=c.Tno where b.Cno in (
select Cno from Score group by (Cno) having COUNT(Sno)>5);
--25、查询95033班和95031班全体学生的记录。
select * from student
where class='95033' or class='95031'
select sno,sname as s1 from Student where class='95033'
union
SELECT sno,sname as s2 FROM Student WHERE class='95031'
--26、查询存在有85分以上成绩的课程Cno.
select cno from Score where degree>85
--27、查询出“计算机系“教师所教课程的成绩表。
select Tname ,Cname ,Sname ,Degree
from Teach a join Courses b on a.Tno=b.Tno join Score c
on b.Cno=c.Cno join Student d on c.Sno=d.Sno where a.Depart='计算机系'
order by Tname,Cname,Cname,Degree desc;
--28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
select Tname ,Prof from Teach
where Depart='计算机系' and Prof Not in(
select distinct Prof
from Teach
where Depart='电子工程师');
--29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
select Cno,Sno,Degree from Score where
Cno='3-105' and Degree> any(
select Degree from Score where Cno ='3-245')
order by Degree desc;
--30、 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
select Cno ,Sno Degree from Score
where Cno='3-105' and Degree >all(
select Degree from Score where Cno='3-245')
order by Degree desc;
--31、查询所有教师和同学的name、sex和birthday.
select tname name,Tsex sex,Tbirthday birthday from Teach
union
select sname,ssex,sbirthday from student
--32、查询所有“女”教师和“女”同学的name、sex和birthday.
select tname,Tsex,Tbirthday from Teach where tsex='女'
union
select sname,ssex,sbirthday from Student where ssex='女'
--33、查询成绩比该课程平均成绩低的同学的成绩表。
select a.*from Score a join (select Cno ,AVG(Degree) as aDegree
from Score group by Cno) b on
a.Cno=b.Cno and a.Degree<b.aDegree;
--34、查询所有任课教师的Tname和Depart.
SELECT tname,depart FROM Teach
WHERE tno IN ( SELECT DISTINCT tno FROM courses )
--35、 查询所有未讲课的教师的Tname和Depart.
SELECT tname,depart FROM Teach
WHERE tno NOT IN ( SELECT DISTINCT tno FROM Courses )
--36、查询至少有2名男生的班号。
select Class ,COUNT(1) as boyCount from Student
where Ssex='男'
group by Class having COUNT(1) >=2;
--37、查询Student表中不姓“王”的同学记录。
select *from Student where Sname not like '王%';
--38、查询Student表中每个学生的姓名和年龄。
select Sname ,YEAR(getdate())-YEAR(sbirthday) as Sage from Student;
--39、查询Student表中最大和最小的Sbirthday日期值。
select MIN(Sbirthday),MAX(sbirthday) from Student;
--40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
select *from Student order by Class Desc ,Sbirthday asc;
--41、查询“男”教师及其所上的课程。
select a.Tname ,b.Cname from Teach a join Courses b on a.Tno=b.Tno
where a.Tsex='男'
--42、查询最高分同学的Sno、Cno和Degree列。
select *from Score group by Cno having Degree=MAX(Degree)
--43、查询和“李军”同性别的所有同学的Sname.
select a.Sname from Student a join Student b on a.Ssex=b.Ssex where b.Sname='李军'
--44、查询和“李军”同性别并同班的同学Sname.
select a.Sname from Student a join Student b on a.Sno=b.Sno and a.Class=b.Class
where b.Sname='李军';
--45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
SELECT * FROM Score
WHERE cno=(SELECT cno FROM courses WHERE cname='计算机导论')
ORDER BY degree DESC
create table tb_stu(
sid int primary key,
sname varchar(50) not null,
birthday datetime not null,
sex varchar(10) not null
);
insert into tb_stu
select 1,'李四','2017-12-25','女'union
select 2,'李云','1990-12-06','男'union
select 3,'钱电','1990-12-21','男'union
select 4,'孙风','1990-12-20','男'union
select 5,'孙七','2014-06-01','女'union
select 6,'吴兰','1992-01-01','女'union
select 7,'张三','2017-12-20','女'union
select 8,'赵雷','1990-01-01','男'union
select 9,'赵六','2013-06-13','女'union
select 10,'郑竹','1989-01-01','女'union
select 11,'周梅','1991-12-01','女'
create table TEACHER(
tid int primary key,
tname varchar(50) not null
);
insert into TEACHER
select 1,'李四'union
select 2,'王五'union
select 3,'张三'
create table course(
cid int not null,
cname varchar(50) not null,
tid int not null
);
insert into course
select 1,'数学',1union
select 2,'英语',3union
select 3,'语文',2union
select 4,'化学',1union
select 5,'物理',1union
select 6,'生物',2
create table SC(
scid int primary key ,
sid int null,
cid int null,
value float null
);
insert into SC
select 1,1,1,80.0union
select 2,1,2,90.0union
select 3,1,3,99.0union
select 4,2,1,70.0union
select 5,2,2,60.0union
select 6,2,3,80.0union
select 7,3,1,80.0union
select 8,3,2,80.0union
select 9,3,3,80.0union
select 10,4,1,50.0union
select 11,4,2,30.0union
select 12,4,3,20.0union
select 13,5,1,76.0union
select 14,5,2,87.0union
select 15,6,1,31.0union
select 16,6,3,34.0union
select 17,7,2,89.0union
select 18,7,3,98.0
--1.查看年龄在15岁以上的学生
select * from tb_stu where DATEDIFF(YY,birthday,GETDATE())>15
--2.查询所有的老师的信息
select *from TEACHER
--3.查看所有的课程的信息
select *from course
--4.查看课程与每门课程对应的老师
select a.tname,b.cid,b.cname from TEACHER a join course b on a.tid=b.tid;
--5.查看张三授课的科目
select a.tname,b.cid,b.cname from TEACHER a join course b on a.tid=b.tid where tname='张三';
--6.查看老师与负责的课程数量
select a.tname as '负责人' ,count(*) as '认课数量' from TEACHER a join course b on a.tid=b.tid group by a.tname;
--7.查看带课最少的老师(课程数量最多)
select top 1 a.tname as '负责人' ,COUNT(*) as '认课数量' from TEACHER a join course b on a.tid=b.tid group by a.tname
order by COUNT(*) ;
--8.查看每门科目与对应的考试成绩记录
select a.cid,a.cname,b.cid,b.value from course a join SC b on a.cid=b.cid ;
select *from course where cid in(
select cid from SC
)
--9.查看没有成绩记录的科目
select *from SC where cid in(
select cid from course where value is null
)
--10.查看具备成绩记录的科目,并计算该科目的总分与平均分
select cname as '考试科目',SUM(value)as '总分',count(*)as '考试人数',AVG(value) as '平均分'from course a join SC b on a.cid=b.cid
group by cname;
--11.查看平均分最高的科目
select top 1 cname,SUM(value),count(*),AVG(value) from course a join SC b on a.cid=b.cid
group by cname order by AVG(value) desc
--12.查看1课程中没及格的学生
select a.sid,a.sname,b.sid,b.cid,b.value from tb_stu a join SC b on a.sid=b.sid where a.sid in(
select sid from SC where value<60
)
--13.查看每一个学生参与的考试的数
select a.sname,COUNT(*)as'考试次数' from tb_stu a full join SC b on a.sid=b.sid full join course c on b.cid=c.cid group by a.sname
--14.查看参加1课程考试同时年龄超过15的学生
select a.sname from tb_stu a join SC b on a.sid=b.sid where a.sid in(
select sid from SC where DATEDIFF(YY,birthday,GETDATE())>15
) group by a.sname
--15.查看李四参加的考试中成绩最高分
select top 1 MAX(value) from SC where sid in (
select sid from tb_stu where sname='李四'
) group by value
order by MAX(value) desc
---------------------------------------------------------------
select top 1 a.sname,cid,value from tb_stu a join SC b on a.sid=b.sid where a.sid in (
select sid from SC where sname='李四'
)group by value ,a.sname,cid
order by value desc
create table stuInfo
(
stuNo varchar(6) not null primary key,
stuName varchar(10) not null,
stuSex varchar(2) not null,
stuAge int not null,
stuSeat int not null identity (1, 1),
strAddress varchar(255) default ('地址不详')
)
--创建学生成绩表
create table stuMarks
(
ExamNo varchar(7) not null primary key,
stuNo varchar(6) not null references stuInfo (stuNo),
writtenExam int null,
LabExam int null
)
--往学生信息表内插入测试数据
insert into stuInfo(stuNo, stuName, stuSex, stuAge, strAddress)
select 's25301', '张秋丽', '男', 18, '北京海淀'
union
select 's25303', '李斯文', '女', 22, '河阳洛阳'
union
select 's25302', '李文才', '男', 85, '地址不详'
union
select 's25304', '欧阳俊雄', '男', 28, '新疆'
union
select 's25318', '梅超风', '女', 23, '地址不详'
--往学生成绩表内插入测试数据
insert into stuMarks(ExamNo, stuNo, writtenExam, LabExam)
select 's271811', 's25303', 93, 59
union
select 's271813', 's25302', 63, 91
union
select 's271816', 's25301', 90, 83
union
select 's271817', 's25318', 63, 53
--聚合函数的使用
select COUNT(*) from stuInfo
--表关联操作
select *from stuInfo a join stuMarks b on a.stuNo=b.stuNo
--查看年龄比“李斯文”大的学员
select * from stuInfo where stuAge>(
select stuAge from stuInfo where stuName='李斯文'
)
--查看性别和“李斯文”一致的学员
select *from stuInfo where stuSex=(
select stuSex from stuInfo where stuName='李斯文'
)
--查删除别和“李斯文”一致的学员
delete from stuInfo where stuSex=(
select stuSex from stuInfo where stuName='李斯文'
)
--查询年龄最大的学生信息
select *from stuInfo where stuAge=(
select MAX(stuAge) from stuInfo
)
--查询年龄最小的学生信息
select *from stuInfo where stuAge=(
select MIN(stuAge) from stuInfo
)
--查询笔试成绩成绩最高的学生
select *from stuMarks where writtenExam=(
select MAX(writtenExam) from stuMarks
)
--查询笔试成绩大于全班笔试平均成绩的学生记录
select * from stuMarks a join stuInfo b on a.stuNo=b.stuNo where writtenExam>(
select AVG(writtenExam) from stuMarks
)
--查询笔试成绩在70分以上的学生信息(禁止联表)
select *from stuInfo where stuNo in(
select stuNo from stuMarks where writtenExam>70
)
--查看那些人没有考试
select *from stuInfo where stuNo not in (
select stuNo from stuMarks
)
标签:Degree,--,Sno,查询,SOQ,Cno,server,where,select 来源: https://www.cnblogs.com/3034607727zoujiafu/p/16314734.html