Oracle课表查询系统,Oracle SQL基础练习(一)(学生表-课程表-选课表)

一 使用CREATE TABLE语句和INSERT INTO语句创建表和插入数据。

student表

ff354f61047fa482208c448ab293c87d.png

course表

0558572fdf74ab38a9de857953096959.png

sc表

87471f5f2029c949ac0c3d4bbc8eaa2b.png

二 操作数据库

1.分别查询学生表和学生修课表中的全部数据。

SELECT * FROM student;

SELECT * FROM course;

2.查询成绩在70到80分之间的学生的学号、课程号和成绩。

SELECT sno,cno,grade FROM sc WHERE grade BETWEEN 70 AND 80;

3.查询100号课程成绩最高的分数。

SELECT MAX(grade) FROM sc WHERE cno = 100;

4.查询学生都选修了哪些课程,要求列出课程号。

SELECT DISTINCT c.cno,cname FROM course c,sc WHERE c.cno = sc.cno;

SELECT DISTINCT c.cno,cname FROM course c INNER JOIN sc on c.cno = sc.cno;

5.查询修了200号课程的所有学生的平均成绩、最高成绩和最低成绩。

SELECT AVG(grade),MAX(grade),MIN(grade) FROM sc WHERE cno = 200;

6.统计每个系的学生人数。

SELECT sdept,count(*) FROM student GROUP BY sdept;

7.统计每门课程的修课人数和考试最高分。

SELECT cno,count(*),MAX(grade) FROM sc GROUP BY cno ORDER BY cno;

8.统计每个学生的选课门数,并按选课门数的递增顺序显示结果。

SELECT sno,count(*) FROM sc GROUP BY sno ORDER BY count(*) ASC;

9.统计选修课的学生总数和考试的平均成绩。

SELECT COUNT(DISTINCT sno) stu_count,AVG(grade) FROM sc;

10.查询选课门数超过2门的学生的平均成绩和选课门数。

SELECT AVG(grade),COUNT(*) FROM sc GROUP BY cno HAVING count(*)>2;

11.列出总成绩超过200分的学生,要求列出学号、总成绩。

SELECT sno,SUM(grade) FROM sc GROUP BY sno HAVING SUM(grade) > 200;

12.查询选修了c02号课程的学生的姓名和所在系。

SELECT sname,sdept FROM student WHERE sno IN(SELECT sno FROM sc WHERE cno = 200);

13.查询成绩80分以上的学生的姓名、课程号和成绩,并按成绩的降序排列结果。

SELECT sname,cno,grade FROM student,(SELECT * FROM sc WHERE grade > 80) scc

WHERE student.sno = scc.sno ORDER BY scc.grade DESC;

SELECT sname,cno,grade FROM student INNER JOIN(SELECT * FROM sc WHERE grade > 80) scc

ON student.sno = scc.sno ORDER BY scc.grade DESC;

14.查询计算机系男生修了"数据库基础"的学生的姓名、性别、成绩。

SELECT sname,ssex,grade FROM student,(SELECT sno,grade FROM sc WHERE cno IN(SELECT cno FROM course WHERE cname = '高等数学')) newsc

WHERE student.sno = newsc.sno AND sdept = '計算机系' AND ssex = '男';

SELECT sname,ssex,grade FROM (SELECT sno,sname,ssex FROM student WHERE sdept = '計算机系' AND ssex = '男') newstu,

(SELECT sno,grade FROM sc WHERE cno IN(SELECT cno FROM course WHERE cname = '高等数学')) newsc

WHERE newstu.sno = newsc.sno;

15.查询哪些课程没有人选,要求列出课程号和课程名。

SELECT cname,cno FROM course WHERE cno NOT IN(SELECT cno FROM sc GROUP BY cno);

16.查询有考试成绩的所有学生的姓名、修课名称及考试成绩,要求将查询结果放在一张新的永久表(假设新表名为new-sc)中。

CREATE TABLE new_sc AS

SELECT sname,cname,grade FROM course,student,(SELECT * FROM sc WHERE grade is not NULL) nsc WHERE

course.cno = nsc.cno AND student.sno = nsc.sno;

17.分别查询信息系和计算机系的学生的姓名、性别、修课名称、修课成绩,并要求将这两个查询结果合并成一个结果集,并以系名、姓名、性别、修课名称、修课成绩的顺序显示各列。

SELECT sdept,sname,ssex,cname,grade FROM course,(SELECT * FROM sc,(SELECT * FROM student WHERE sdept = '計算机系') nsc WHERE

sc.sno = nsc.sno) sc_stu WHERE course.cno = sc_stu.cno

UNION

SELECT sdept,sname,ssex,cname,grade FROM course,(SELECT * FROM sc,(SELECT * FROM student WHERE sdept = '情報系') nsc WHERE

sc.sno = nsc.sno) sc_stu WHERE course.cno = sc_stu.cno;

18.用子查询实现如下查询:

(1) 查询选修了100号课程的学生的姓名和所在系。

SELECT sname,sdept FROM student WHERE sno IN(SELECT sno FROM sc WHERE cno = 100);

(2) 查询数学系成绩80分以上的学生的学号、姓名。

SELECT sno,sname FROM student WHERE sno IN(SELECT sno FROM sc WHERE grade >80) AND sdept = '数学系';

(3) 查询计算机系学生所选的课程名。

SELECT cname FROM course WHERE cno IN(SELECT cno FROM sc WHERE sno IN(SELECT sno FROM student WHERE sdept = '計算机系'));

19.将计算机系成绩高于80分的学生的修课情况插入到另一张表中,分两种情况实现:

(1) 在插入数据过程中建表。

CREATE TABLE sc_info1 AS

SELECT * FROM sc WHERE sno IN(SELECT sno FROM student WHERE sdept = '計算机系') AND grade > 80;

(2) 先建一个新表,然后再插入数据。 创建表SC_Info1 往表SC_info2插入查询得到的结果

CREATE TABLE sc_info2(

sno NUMBER,

cno NUMBER,

grade NUMBER

);

INSERT INTO sc_info2(

SELECT * FROM sc WHERE sno IN(SELECT sno FROM student WHERE sdept = '計算机系') AND grade > 80

);

--下面这种方法更容易理解一些

INSERT INTO sc_info2(

sno,

cno,

grade

)

SELECT * FROM sc WHERE sno IN(SELECT sno FROM student WHERE sdept = '計算机系') AND grade > 80

;

20.删除修课成绩小于50分的学生的修课记录。

DELETE FROM sc WHERE grade < 50;

21.将所有选修了'100'课程的学生的成绩加10分。

UPDATE sc SET grade = grade+10 WHERE cno = 100;

三 附加题 1.

SELECT s1.storeno,s1.store_name

FROM store s1,

(SELECT storeno,MAX(start_date) AS start_date

FROM store

WHERE start_date <= TO_DATE('2016011','YYYYMMDD')

AND over_date >= TO_DATE('2016011','YYYYMMDD')

GROUP BY storeno) s2

WHERE s1.storeno = s2.storeno

AND s1.start_date = s2.start_date;

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值