数据库作业(3)数据查询(自用复习)

1. SQL查询:统计各门课程选修人数,要求输出课程代号,课程名,有成绩人数(grade不为NULL),最高分,最低分,平均分,按课程号排序。

#统计各门课程选修人数,要求输出课程代号,课程名,有成绩人数(grade不为NULL),最高分,最低分,平均分(取整round函数),按课程号排序。

select sc.cno,cname,count(*),max(grade),min(grade),round(avg(grade))
from sc,course
where grade is not null and sc.cno = course.cno
group by sc.cno
order by sc.cno

2. SQL查询:查询同时选修了c01,c02,c03课程学生,输出学号,姓名

#查询同时选修了c01,c02,c03课程学生,输出学号,姓名

select sc.sno,sname
from student,sc
where sc.sno = student.sno and cno in('c01','c02','c03')
group by sc.sno
having count(distinct cno)=3

3. SQL查询:查询没有同时选修“计算机导论”和“计算机网络”两门课的学生的学号,姓名

#查询没有同时选修“计算机导论”和“计算机网络”两门课的学生的学号,姓名

-- 不存在这两门课都选修的人
select sno,sname from student
where sno not in(SELECT sno from sc,course
                                  where sc.cno=course.cno and cname='计算机导论'
                                           and sno in(SELECT sno from sc,course
                                                               where sc.cno=course.cno and cname='计算机网络'))

4. SQL查询:查询选修了全部课程的学生的学号,姓名,系名

#查询选修了全部课程的学生的学号,姓名,系名

SELECT sno,sname,sdept 
from student -- 不存在没有选修的课程
where not EXISTS (SELECT * from  course where not EXISTS(SELECT * from sc where course.cno = sc.cno and sc.sno = student.sno))

5. SQL查询:查询与“王大力”同一个系的学生的基本信息

#查询与“王大力”同一个系的学生的基本信息。

select * from student
where sdept in (select sdept from student where sname = '王大力')
 and sname!='王大力'

6. 查询同时选修了“数据库基础”和“计算机网络”两门课的学生的学号,姓名。

#查询同时选修了“数据库基础”和“计算机网络”两门课的学生的学号,姓名

select sno,sname
from student
where sno in(select sno from sc,course
                     where sc.cno = course.cno  and cname='数据库基础' 
                                 and sno in(select sno from sc,course
                                                 where sc.cno = course.cno  and cname='计算机网络' ))

7.    查询选修通过2门(包括2门)以上的学生的学号及姓名。    

select sc.sno,sname 
from student,sc
where sc.sno = student.sno and sc.grade>=60
group by sc.sno 
having count(cno)>=2

8.    查询选修未通过2门(包括2门)以上的学生的信息,输出学号、姓名、选修未通过门数,按门数降序排序,若门数相同,按学号升序排序。    

select sc.sno,sname,count(cno)
from student,sc
where sc.sno = student.sno and sc.grade<60
group by sc.sno 
having count(cno)>=2
order by count(cno) desc,sc.sno asc


 

9.    查询选修平均分为60分(包括60分)以上的学生的各门课成绩,要求输出学号,姓名,课程名和成绩。    

select sc.sno,sname,cname,grade
from student,sc,course
where student.sno = sc.sno and sc.cno = course.cno 
group by sc.sno
having avg(grade)>=60
order by sc.sno

10.    查询所有人都选修了的课程号与课程名    

select cno,cname 
from course 
where not exists (select * from student  where not exists
                                  (select * from sc where student.sno=sc.sno and  sc.cno = course.cno ))

11.    查询选课门数最多的学生的学号和姓名    

select sc.sno,sname
from student,course,sc
where student.sno = sc.sno and course.cno =sc.cno
group by sc.sno
having count(sc.cno)>=all(select count(DISTINCT sc.cno)as t1 from sc,course where course.cno=sc.cno group by sno)

12.    查询选修了学号为9521102同学选修的全部课程的学生学号和姓名  

select distinct sc.sno,sname
from student,sc,course,(select cno from sc where sc.sno=9521102 group by cno) as g1
where g1.cno = course.cno and student.sno = sc.sno 

13.    查询超过该课程平均分的成绩信息    

select sno,cno,grade
from sc g1
where grade >(select avg(grade) from sc g2 where g1.cno = g2.cno)


14.    SQL查询:查询统计学生的不及格门数    

查询统计学生不及格门数大于等于2门的信息,输出系名,学号,姓名,不及格门数,按照系(升序)排序,不及格门数(降序)排序。

select sdept,sc.sno,sname,count(cno)
from student,sc
where grade<60 and student.sno = sc.sno
group by sc.sno
having count(cno)>=2
order by sdept,count(cno) desc;


15.    查询选修了c03课程的学生学号和姓名    

select sc.sno,sname
from student,sc,course
where course.cno = sc.cno and sc.sno = student.sno and sc.cno ='c03'


16.    找出至今没有人选修过的课程

select cno,cname
from course
where not exists(select * from  sc,student where student.sno = sc.sno and sc.cno = course.cno)


17.    查询每个学生成绩最高的成绩信息    

SELECT k.sno,k.cno,grade
from sc as k,course,student 
where student.sno = k.sno and k.cno = course.cno and grade in(SELECT max(grade) from sc where sno = k.sno group by sno)


18.    查询每个男生的选课门数(要求用嵌套查询实现)

-- 每个男生的选课
-- 没有选课的男生
-- 没有选课的不是男生
select sno,count(cno)
from sc
where not exists(select * from course where course.cno = sc.cno 
								and not exists(select * from student where ssex='男' and student.sno = sc.sno ))
group by sno

认识 DBMS...................................................................................1 实验 2 交互式 SQL(1)........................................................................ 6 实验 3 交互式 SQL(2)........................................................................ 8 实验 4 交互式 SQL(3)........................................................................ 9 ① 查询计算机全体学生信息查询姓“李”的学生的学号和姓名。 ③ 查询课程表中先行课为空的课程名。 ④ 查询考试成绩有不及格的学生的学号。 ⑤ 求选修了C1 课程或C2 课程的学生的学号及成绩。 ⑥ 查询全体计算机学生的姓名及其年龄。 ⑦ 查询计算机在1986-1987 年之间出生的学生的姓名。 ⑧ 查询姓“李”的前两个学生的学号和姓名。 ⑨ 查询选修了两门以上课程的学生学号课程数。 ⑩ 查询选修课程数大于等于2 的学生的学号、平均成绩和选课门数,并按 平均成绩降序排列。(1) 查询选修了【数据库原理】的计算机学生学号和姓名。 (2) 查询每一门课的间接先行课(即先行课的先行课)(3) 查询学生的学号、姓名、选修课程的名称和成绩。 (4) 查询选修了课程的学生姓名。 (5) 查询所有学生信息和所选修的课程。 (6) 查询已被选修的课程的情况和所有课程的名字。 (7) 列出学生所有可能的选修情况。 (8) 查找计算机学生选修课程数大于2 的学生的姓名、平均成绩和选课 门数,并按平均成绩降序排列。(1) 统计选修了【数据库原理】课程的学生人数。 (2) 查询没有选修【数据库原理】课程的学生信息(3) 查询其他中比计算机学生年龄都小的学生(4) 查询被0602001 学生或0602002 学生所选修的课程的课程号(用UNION 组合查询IN 条件查询两种方法实现)(5) 查询0602001 学生和0602002 学生同时选修的课程的课程号(用 INTERSECT 组合查询EXISTS 嵌套子查询两种方法实现)(6) 查询被0602001 学生选修,但没有被0602002 学生所选修的课程的课程 号(用EXCEPT 组合查询NOT EXISTS 嵌套子查询两种方法实现)(1) 新建查询窗口,选择StudentCourseYYXXXX 为当前数据库(2) 在已建立StudentCourseYYXXXX 数据库和StudentsYYXXXX、 CoursesYYXXXX、SCYYXXXX 3 个表的基础上,向StudentCourseYYXXXX数据库中 的表更新数据。 ① 向表StudentsYYXXXX 中插入(0601001,赵林, 男,1985-09-08,计算机) 的记录。② 向SCYYXXXX 表中添加一个学生的选课记录,学号为0601001,所选的课 程号为C2。 SC表中有Sno、Cno、Grade 这3 个列。这里只知道学号和课程号, 不知道成绩值。 ③ 向表StudentsYYXXXX 中插入(0601002,张修雨,default)记录,该记录 的数据中default 表示默认值‘男’,其他数据表示空值。 ④ 用CREATE 语句建立表StudentBAK1YYXXXX,包含(Students 的Sno、 Sname、Sdept 相同)3 个字段, 然后用INSERT SELECT 语句实现向 StudentBAK1YYXXXX 添加StudentsYYXXXX 表中的计算机学生的学号、姓名、 所在信息。 ⑤ 用 SELECT...INTO 语句实现把StudentsYYXXXX 表中1986 年后(包含 1986 年)出生的学生的学号、姓名存储到一个新表StudentBAK2YYXXXX。 ⑥ 将姓名为【赵林】的同学的所在改为【机电】,爱好改为【足球】。 ⑦ 将选修了课程名为【数据库原理】的学生成绩加5 分。 ⑧ 将StudentCourseYYXXXX 数据库的StudentBAK1YYXXXX 表中所有姓赵的 同学删除。 ⑨ 删除计算机选修成绩不及格的学生选修记录。课程成绩优秀。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值