1月31 SQL巩固练习(45道题)

1、现在有四个表: 

 student 表:                                                                              

              

teacher 表:                                                                                                course表:

                             

score表:

表的创建:

create database test
go
use test
go
create table student
(
    --学号
    sno varchar(3) not null primary key,
    --姓名
    sname varchar(4) not null,
    --性别
    ssex varchar(2) not null,
    --出生年月
    sbirthday datetime,
    --所在班级
    class varchar(5)
)
go
create table teacher
(
    --教工编号
    tno varchar(3) not null primary key,
    --教工姓名
    tname varchar(4) not null,
    --教工性别
    tsex varchar(2) not null,
    --教工出生日期
    tbirthday datetime,
    --职称
    prof varchar(6),
    --所在部门
    depart varchar(10)
)
go
create table course
(
    --课程号
    cno varchar(5) not null primary key,
    --课程名称
    cname varchar(10) not null,
    --教工编号
    tno varchar(3) references teacher(tno)
)
go
create table score
(
    --学号
    sno varchar(3) not null references student(sno),
    --课程号
    cno varchar(5) not null references course(cno),
    --成绩
    degree decimal(4,1)
)
go


insert into student
values('108','曾华','','1977-09-01','95033')

insert into student
values('105','匡明','','1975-10-02','95031')

insert into student
values('107','王丽','','1976-01-23','95033')

insert into student
values('101','李军','','1976-02-20','95033')

insert into student
values('109','王芳','','1975-02-10','95031')

insert into student
values('103','陆君','','1974-06-03','95031')

insert into teacher
values('804','李诚','','1958-12-02','副教授','计算机系')
insert into teacher
values('856','张旭','','1969-03-12','讲师','电子工程系')
insert into teacher
values('825','王萍','','1972-05-05','助教','计算机系')
insert into teacher
values('831','刘冰','','1958-08-14','助教','电子工程系')

insert into course
values('3-105','计算机导论','825')
insert into course
values('3-245','操作系统','804')
insert into course
values('6-166','数字电路','856')
insert into course
values('9-888','高等数学','831')


insert into score
values('103','3-245','86')
insert into score
values('105','3-245','75')
insert into score
values('109','3-245','68')
insert into score
values('103','3-105','92')
insert into score
values('105','3-105','88')
insert into score
values('109','3-105','76')
insert into score
values('101','3-105','64')
insert into score
values('107','3-105','91')
insert into score
values('108','3-105','78')
insert into score
values('101','6-166','85')
insert into score
values('107','6-166','79')
insert into score
values('108','6-166','81')

select * from student 
select * from teacher 
select * from course
select * from score

练习:

--每个题最后一句是结果,上面是过程
--1、 查询Student表中的所有记录的Sname、Ssex和Class列。
select *from student
select sname,ssex,class from student
--2、 查询教师所有的单位即不重复的Depart列。
select*from teacher
select distinct depart from teacher
--3、 查询Student表的所有记录。
select*from student
--4、 查询Score表中成绩在60到80之间的所有记录。
select*from score
select degree from score where degree between 60 and 80
select degree from score where degree>60 and degree<80
--5、 查询Score表中成绩为85,86或88的记录。
select *from score
select *from score where degree in(85,86,88)
--6、 查询Student表中“95031”班或性别为“女”的同学记录。
select*from student
select*from student where class='95031' or ssex=''
--7、 以Class降序查询Student表的所有记录。
select *from student
select *from student order by class desc
--8、 以Cno升序、Degree降序查询Score表的所有记录。
select*from score order by cno asc,degree desc
--9、 查询“95031”班的学生人数。
select*from student
select COUNT(*) '95031班' from student where class='95031'
--10、查询Score表中的最高分的学生学号和课程号。
select*from score
select MAX(degree) from score
select sno,cno from score where degree=(select MAX(degree) from score)

--11、查询‘3-105’号课程的平均分。
select *from score
select degree from score where sno='105'
select AVG(degree) from score where degree in(select degree from score where sno='105')
--12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select*from score
select AVG(degree) from score where cno like '3%' and cno=(select cno from score group by cno  having COUNT(*)>5)

--13、查询最低分大于70,最高分小于90的学生的Sno列。
select*from score
select sno from score group by sno having MIN(degree)>70 and  MAX(degree)<90
--14、查询所有学生的Sname、Cno和Degree列。
select*from student
select*from score
select sname,cno,degree from student join score on student.sno=score.sno
--15、查询所有学生的Sno、Cname和Degree列。
select*from course
select*from score
select sno,cname,degree from course join score on course.cno=score.cno
--16、查询所有学生的Sname、Cname和Degree列。
select*from student
select*from course
select*from score
select sname,cname,degree from student join score on student.sno=score.sno join course on course.cno=score.cno
--17、查询“95033”班所选课程的平均分。
select*from student
select*from score
select*from student where class='95033'
select avg(degree) from score where sno in(select sno from student where class='95033')

--18、假设使用如下命令建立了一个grade表:
--create table grade(low  int,upp  int,rank  varchar(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 *from grade
select*from score
select sno,cno,rank from score join grade on degree>=low 

--19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select*from score
select*from student
select degree from score where cno='3-105'and sno='109'

select *from student join score on student.sno=score.sno
 where student.sno in(
select sno from score where cno='3-105'and degree>'76.0'
)

--20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。
select*from score

select COUNT(cno) from score group by sno having COUNT(*)>1
select cno,MAX(degree) from score group by cno
select sno from score where degree in(select MAX(degree) from score group by cno)

 
select *from score where sno not in
(
select sno from score where
 degree in(select MAX(degree) 
 from score group by cno)
 )
 

--21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
select*from student
select*from score
select degree from score where sno='109'and cno='3-105'
select *from student join score on student.sno=score.sno where degree>(select degree from score where sno='109'and cno='3-105')
--22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
select *from student
select year(sbirthday) from student where sno='108'
select *from student where DAY(sbirthday)in(select day(sbirthday) from student where  sno='108')

select sno,sname,sbirthday  from student where year(sbirthday) 
in(select year(sbirthday) from student where  sno='108')and sno!='108'
--23、查询“张旭“教师任课的学生成绩。
select*from teacher
select*from course
select*from score
select*from teacher join course on teacher.tno=course.tno 
select tno from teacher where tname='张旭'
select cno from course where tno='856'
select degree from score where cno='6-166'


select degree from score where cno=
(
   select cno from course where tno=
   (
   select tno from teacher where tname='张旭'
   )
)
--24、查询选修某课程的同学人数多于5人的教师姓名。
select*from teacher
select*from course
select*from score
select cno from score group by cno having COUNT(*)>5
select tno from course where cno='3-105'
select tname from teacher where tno='825'



select tname from teacher where tno=
(
select tno from course where cno=
(
select cno from score group by cno having COUNT(*)>5
)
)
--25、查询95033班和95031班全体学生的记录。
select*from student where class in('95033','95031')

--26、查询存在有85分以上成绩的课程Cno.
select*from score
select*from course
select cno,MAX(degree) as '课程最高分'from score group by cno having MAX(degree)>85
select cno from score group by cno having MAX(degree)>85
--27、查询出“计算机系“教师所教课程的成绩表。
select*from teacher
select tno from teacher where depart='计算机系'
select cno from course where tno in('804','825')
select degree from score where cno in('3-105','3-245') 



select degree from score where cno in
(
select cno from course where tno in
(
select tno from teacher where depart='计算机系'
)
) 
--28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
select*from teacher
select tname,prof from teacher where depart in( '计算机系','电子工程系')
select prof,COUNT(prof) from teacher group by prof having COUNT(prof)=1


select tname,prof from teacher where prof in
(
select prof from teacher group by prof having COUNT(prof)=1
)and (depart='计算机系'or depart='电子工程系')

--29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
select *from score
select MAX(degree) from score where cno='3-245' 

select degree from score where cno='3-105'and degree>(select max(degree) from score where cno='3-245')

select degree from score where cno='3-105'and degree>
(select max(degree) from score where cno='3-245')

select degree from score where degree in('92.0','88.0','91.0') order  by degree desc


select * from score where degree in
(
select degree from score where cno='3-105'and degree>
(select max(degree) from score where cno='3-245')
)
 order  by degree desc

--30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
select*from score
select * from score where cno='3-105'and degree>(select MAX(degree) from score where cno='3-245')
--31、查询所有教师和同学的name、sex和birthday.
select*from student
select*from teacher
select sname as 'name',ssex as 'sex',sbirthday as 'birthday' from student
union
select tname,tsex,tbirthday from teacher
--32、查询所有“女”教师和“女”同学的name、sex和birthday.
select*from teacher
select*from student
select sname as 'name',ssex as 'sex',sbirthday as 'birthday' from student where ssex=''
union
select tname,tsex,tbirthday from teacher where tsex=''
--33、查询成绩比该课程平均成绩低的同学的成绩表。//相关子查询
select *from score


select AVG(degree) from score group by cno

select * from score where degree < any(select AVG(degree) from score group by cno)


--34、查询所有任课教师的Tname和Depart.
select*from teacher
select*from score
select*from course
select distinct cno from score
select tno from course where cno in('3-105','3-245','6-166')
select tname,depart from teacher where tno in('825','804','856') 

select tname,depart from teacher where tno in
(
select tno from course where cno in
(
select distinct cno from score
)
) 
--35  查询所有未讲课的教师的Tname和Depart. 
--insert into teacher values('888','aaa','v','2005.1.1','a','a')
select *from teacher
select *from course
select *from score
select distinct cno from score 
select tno from course where cno in('3-105','3-245','6-166')
select *from teacher where tno not in('825','804','856')

select *from teacher where tno not in
(
select tno from course where cno in
(
select distinct cno from score
)
)

--36、查询至少有2名男生的班号。
--insert into student values('110','aaa','a','2005.1.1','95000')

select*from student
select class,COUNT(ssex) from student group by class having COUNT(*)>=2 

select class from student where ssex=''
select*from student where sno in (select sno from student where ssex='')


select class from student WHERE ssex='' group by class having count(class)>1



--37、查询Student表中不姓“王”的同学记录。
select *from student
select *from student where sname not like '王%'
--38、查询Student表中每个学生的姓名和年龄。
select*from student
select sname,(YEAR(GETDATE())-year(sbirthday))as '年龄' from student
--39、查询Student表中最大和最小的Sbirthday日期值。
select *from student 
select MAX(12-month(sbirthday)) from student 
select sbirthday  from student where MONTH(sbirthday)=(select MAX(month(sbirthday)) from student) and day(sbirthday)
=(select MAX(day(sbirthday)) from student)
select sbirthday  from student where day(sbirthday)=(select min(day(sbirthday)) from student)


select top(1) sbirthday from student order by month(sbirthday) asc,day(sbirthday) asc

select top(1) sbirthday from student order by month(sbirthday) desc,day(sbirthday) desc

select min(sbirthday)as '最大日期值',max(sbirthday)as '最小日期值'  from student 
--40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
select*from student 
select*from student 
select * from student order by (YEAR(GETDATE())-year(sbirthday)) desc,class asc
--41、查询“男”教师及其所上的课程。
select*from teacher 
select*from course
select tname from teacher where tsex=''
union
select cname  from course where tno in(select tno from teacher where tsex='')

select tname,cname from teacher join course on teacher.tno=course.tno where course.tno in(select tno from teacher where tsex='')and tsex=''
--42、查询最高分同学的Sno、Cno和Degree列。
select*from score 
select MAX(degree) from score 
select  sno,cno,degree from score where degree=(select MAX(degree) from score )
--43、查询和“李军”同性别的所有同学的Sname.

select sname from student where ssex=(select ssex from student where sname='李军')and sname!='李军'
--44、查询和“李军”同性别并同班的同学Sname.
select*from student 
select ssex from student where sname='李军'
select class from student where sname='李军'

select  sname from student where ssex=(select ssex from student where sname='李军')
and class=(select class from student where sname='李军')and sname!='李军'
--45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
select*from course
select*from student
select*from score
select cno from course where cname='计算机导论'
select  sno from score where cno='3-105'

select sname,degree from student join score on student.sno=score.sno where 
 ssex=''and  cno=(select cno from course where cname='计算机导论')
原文地址:https://www.cnblogs.com/tzq9308/p/4264113.html