表(一)Student
属性名 |
数据类型 |
可否为空 |
含 义 |
Sno |
Char(3) |
否 |
学号(主码) |
Sname |
Char(8) |
否 |
学生姓名 |
Ssex |
Char(2) |
否 |
学生性别 |
Sbirthday |
datetime |
可 |
学生出生年月 |
Class |
Char(5) |
可 |
学生所在班级 |
表(二)Course
属性名 |
数据类型 |
可否为空 |
含 义 |
Cno |
Char(5) |
否 |
课程号(主码) |
Cname |
Varchar(10) |
否 |
课程名称 |
Tno |
Char(3) |
否 |
教工编号(外码) |
表(三)Score
属性名 |
数据类型 |
可否为空 |
含 义 |
Sno |
Char(3) |
否 |
学号(外码) |
Cno |
Char(5) |
否 |
课程号(外码) |
Degree |
Decimal(4,1) |
可 |
成绩 |
主码:Sno+ Cno |
表(四)Teacher
属性名 |
数据类型 |
可否为空 |
含 义 |
Tno |
Char(3) |
否 |
教工编号(主码) |
Tname |
Char(4) |
否 |
教工姓名 |
Tsex |
Char(2) |
否 |
教工性别 |
Tbirthday |
datetime |
可 |
教工出生年月 |
Prof |
Char(6) |
可 |
职称 |
Depart |
Varchar(10) |
否 |
教工所在部门 |
表(一)Student
Sno |
Sname |
Ssex |
Sbirthday |
class |
108 |
曾华 |
男 |
1977-09-01 |
95033 |
105 |
匡明 |
男 |
1975-10-02 |
95031 |
107 |
王丽 |
女 |
1976-01-23 |
95033 |
101 |
李军 |
男 |
1976-02-20 |
95033 |
109 |
王芳 |
女 |
1975-02-10 |
95031 |
103 |
陆君 |
男 |
1974-06-03 |
95031 |
表(二)Course
Cno |
Cname |
Tno |
3-105 |
计算机导论 |
825 |
3-245 |
操作系统 |
804 |
6-166 |
数字电路 |
856 |
9-888 |
高等数学 |
831 |
表(三)Score
Sno |
Cno |
Degree |
103 |
3-245 |
86 |
105 |
3-245 |
75 |
109 |
3-245 |
68 |
103 |
3-105 |
92 |
105 |
3-105 |
88 |
109 |
3-105 |
76 |
101 |
3-105 |
64 |
107 |
3-105 |
91 |
108 |
3-105 |
78 |
101 |
6-166 |
85 |
107 |
6-166 |
79 |
108 |
6-166 |
81 |
表(四)Teacher
Tno |
Tname |
Tsex |
Tbirthday |
Prof |
Depart |
804 |
李诚 |
男 |
1958-12-02 |
副教授 |
计算机系 |
856 |
张旭 |
男 |
1969-03-12 |
讲师 |
电子工程系 |
825 |
王萍 |
女 |
1972-05-05 |
助教 |
计算机系 |
831 |
刘冰 |
女 |
1977-08-14 |
助教 |
电子工程系 |
--一、设有一数据库,包括四个表:
--学生表(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