数据库习题(oracle)
学生表 Student
字段值分别是 Sid ,Sname ,Sage ,Ssex
教师表 Teacher
字段值分别是 Tid ,Tname
课程表 Course
字段值分别是Cid ,Cname ,Tid
成绩表SC
字段值分别是 Sid ,Cid ,Score
--建表语句
drop table sc;
drop table course;
drop table teacher;
drop table student;
--创建学生表
create table student(
sid number(5) primary key,
sname varchar2(50),
sage date,
ssex varchar2(3)
);
--创建教师表
create table teacher(
tid number(5) primary key,
tname varchar2(50)
);
drop sequence t_seq;
create sequence t_seq;
--创建课程表
create table course(
cid number(5) primary key,
cname varchar2(50),
tid number(5) references teacher(tid)
);
--创建成绩表
create table sc(
sid number(5) references student(sid),
cid number(5) references course(cid),
score number(3)
);
--插入数据
insert into student values(1001,'张三',to_date('1990-10-10','yyyy-mm-dd'),'男');
insert into student values(1002,'李四',to_date('1981-10-10','yyyy-mm-dd'),'男');
insert into student values(1003,'王五',to_date('1981-11-10','yyyy-mm-dd'),'女');
insert into student values(1004,'赵六',to_date('1988-10-10','yyyy-mm-dd'),'男');
insert into student values(1005,'孙七',to_date('1989-01-10','yyyy-mm-dd'),'女');
insert into student values(1006,'周八',to_date('1990-10-10','yyyy-mm-dd'),'男');
insert into student values(1007,'张三',to_date('1990-06-10','yyyy-mm-dd'),'女');
insert into teacher values(t_seq.nextval,'叶平');
insert into teacher values(t_seq.nextval,'李老');
insert into teacher values(t_seq.nextval,'王老');
insert into teacher values(t_seq.nextval,'张老');
insert into teacher values(t_seq.nextval,'习老');
insert into course values(001,'企业管理',1);
insert into course values(002,'马克思',2);
insert into course values(003,'UML',3);
insert into course values(004,'数据库',4);
insert into course values(005,'英语',5);
insert into course values(006,'语文',1);
insert into course values(007,'数学',2);
insert into sc values(1001,006,80);
insert into sc values(1001,007,100);
insert into sc values(1001,001,50);
insert into sc values(1001,002,70);
insert into sc values(1001,003,80);
insert into sc values(1001,004,90);
insert into sc values(1001,005,80);
insert into sc values(1002,001,90);
insert into sc values(1002,004,100);
insert into sc values(1002,006,90);
insert into sc values(1002,007,80);
insert into sc values(1003,001,59);
insert into sc values(1003,002,70);
insert into sc values(1004,001,80);
insert into sc values(1004,002,70);
insert into sc values(1005,005,30);
insert into sc values(1005,001,50);
insert into sc values(1005,002,50);
insert into sc values(1005,003,100);
insert into sc values(1006,001,60);
insert into sc values(1007,001,100);
insert into sc values(1007,004,100);
insert into sc values(1007,006,90);
insert into sc values(1007,007,80);
一 单表条件查询
1、查询平均成绩大于60分的同学的学号和平均成绩;
select sid,avg(score) from sc group by sid having avg(score) >60;
2、查询姓“李”的老师的个数;
select count(*) as 个数 from teacher where tname like '李%';
3、查询男生、女生人数 ;
select ssex 性别,count(*) 人数 from student group by ssex
4、查询同名同姓学生名单,并统计同名人数 ;
select sname,count(*) from student group by sname having count(*)>1;
5、1981年出生的学生名单(注:Student表中Sage列的类型是date) ;
select * from student where to_char(sage,'yyyy') = 1981;
6、查询姓“张”的学生名单 ;
select * from student where sname like '张%';
7、求选了课程的学生人数 ;
select count(*) from (select count(*) from sc group by sid);
8、检索至少选修两门课程的学生学号 ;
select sid from sc group by sid having count(*) >=2;
9、检索“004”课程分数小于60,按分数降序排列的同学学号 ;
select sid from sc where cid =004 order by score desc;
10、删除“1002”同学的“001”课程的成绩 ;
delete from sc where sid = 1002 and cid = 001;
11、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 ;
select cid as 课程ID,max(score) as 最高分,min(score) as 最低分 from sc group by cid;
12、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 ;
select cid,count(*) from sc group by cid having count(*)>5 order by count(*) desc,cid
二 两表联查
13、查询“语文”比“数学”课程成绩高的所有学生的学号;
select a.sid from (select sc.sid,sc.score from course c,sc where
c.cid = sc.cid and c.cname='语文') a,(select sc.sid,sc.score from
course c,sc where c.cid = sc.cid and c.cname='数学') b
where a.score>b.score and a.sid = b.sid;
14、查询所有同学的学号、姓名、选课数、总成绩;
select s.sid,s.sname,count(*) as cnum,sum(sc.score) from student s
inner join sc on s.sid = sc.sid group by s.sid,s.sname;
15、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select s.sid,s.sname from student s,sc where s.sid=sc.sid and sc.cid='001' and s.sid in (select s.sid from student s,sc where s.sid=sc.sid and sc.cid='002')
16、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
select a.sid,a.sname from (select s.sid,sc.score,s.sname from student
s,sc where s.sid = sc.sid and sc.cid=001) a ,(select s.sid,sc.score
from student s,sc where s.sid = sc.sid and sc.cid=002) b where
a.score >b.score and a.sid = b.sid;
17、查询所有课程成绩小于60分的同学的学号、姓名;
select sid,sname from student where sid not in(
select sid from sc where sc.score >60);
18、查询没有学全所有课的同学的学号、姓名;
select s.sid,s.sname,count(*) from student s,sc where s.sid = sc.sid
group bys.sid,s.sname having count(*) < (select count(*) from course);
19、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select distinct s.sid,s.sname from student s,sc where s.sid = sc.sid and sc.cid in (select cid from sc where sid =1001);
20、查询至少学过学号为“1001”同学所有一门课的其他同学学号和姓名;
select distinct s.sid,s.sname from student s,sc where s.sid = sc.sid and sc.cid in (select cid from sc where sid =1001) and s.sid !=1001;
21、查询每门课程被选修的学生数 ;
select c.cname,count(*) as 学生数 from course c,sc where c.cid = sc.cid group by c.cname;
22、查询出只选修了一门课程的全部学生的学号和姓名 ;
select sid,sname from student where sid in (select sid from sc group by sid having count(*)=1)
23、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列 ;
select c.cname,c.cid,avg(sc.score) from course c,sc where c.cid = sc.cid
group by c.cname,c.cid order by avg(sc.score) desc,c.cid desc
24、查询平均成绩大于85的所有学生的学号、姓名和平均成绩 ;
select s.sid,s.sname,avg(score) from student s,sc where s.sid=sc.sid group by s.sid,s.sname having avg(score)>85
25、查询不及格的课程,并按课程号从大到小排列 ;
select c.cname,sc.score,sc.sid from sc,course c where score<60 order by sc.cid desc
26、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
select sid,sname from student where sid in (select sid from sc where cid=003 and score >80)
27、查询各个课程及相应的选修人数 ;
select c.cname,count(*) from sc,course c where sc.cid = c.cid group by c.cname;
28、查询不同课程成绩相同的学生的学号、课程号、学生成绩 ;
select distinct a.sid,a.cid,a.score from sc a,sc b where a.score = b.score and a.cid !=b.cid order by a.score
29、查询全部学生都选修的课程的课程号和课程名 ;
select cid,cname from course where cid in (select cid from sc group by cid having count(*) =(select count(*) from course));
30、查询两门以上不及格课程的同学的学号及其平均成绩 ;
select sid,avg(score) from sc where sid in (select sid from sc
where score <60 group by sid having count(*)>2) group by sid;
31、查询学生平均成绩及其名次 ;
select a.*,rownum 排名 from (select s.sname,avg(score) from student s,sc where s.sid = sc.sid group by s.sname order by avg(score)desc) a
三 多表查询(3~4)
32、查询没学过“叶平”老师课的同学的学号、姓名;
select sid,sname from student where sid not in
(select sid from sc,course c,teacher t where sc.cid = c.cid
and c.tid=t.tid and t.tname='叶平');
33、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select sid,sname from student where sid in
(select sid from sc,course c,teacher t where sc.cid = c.cid
and c.tid=t.tid and t.tname='叶平');
34、删除学习“叶平”老师课的SC表记录
delete from sc where cid in (select c.cid from course c,teacher t,sc where c.tid = t.tid and c.cid=sc.cid and t.tname = '叶平');
35、查询课程名称为“数据库”,且分数低于60的学生姓名和分数 ;
select s.sname,sc.score from student s,sc,course c where s.sid = sc.sid and sc.cid = c.cid and c.cname ='数据库' and sc.score<60;
36、查询所有学生的选课情况;
select s.sid,s.sname,c.cid,c.cname from student s,sc,course c where s.sid = sc.sid and sc.cid = c.cidorder by sid
37、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
select s.sname,c.cname,sc.score from student s,sc,course c where s.sid = sc.sid and sc.cid = c.cid and sc.score>70 order by s.sid
38、查询没学过“叶平”老师讲授的任一门课程的学生姓名
select sname from student where sid not in(select sc.sid from teacher t,course c,sc where t.tid = c.cid and c.cid = sc.cid and t.tname ='叶平');
39、把“SC”表中“叶平”老师教的各个课的成绩分别更改为对应课程的平均成绩;
update sc sc1 set score = (select avg(score) from sc inner join course c on sc.cid = c.cid inner join teacher t on c.tid = t.tid group by c.cid having c.cid = sc1.cid) where (sc1.sid, sc1.cid) in (select sc.sid,sc.cid from sc inner join course c on sc.cid = c.cid inner join teacher t on c.tid = t.tid where t.tname='叶平');
40、查询不同老师所教不同课程平均分从高到低显示 ;
select t.tname,c.cname,round(avg(sc.score),2) avg from course c left join teacher t on c.tid = t.tid left join sc on c.cid= sc.cid group by c.cname,t.tname order by avg desc
41、按各科平均成绩从低到高和及格率的百分数从高到低顺序 ;
select c.cid,c.cname,round(avg(sc.score),2) avg ,round((select count(*) from sc where cid = c.cid and score>=60)/(select count(*) from sc where cid = c.cid)*100,2)||'%' as path_rate from course c,sc where c.cid = sc.cid group by c.cname,c.cid order by avg, path_rate desc;
42、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
select s.sid,s.sname,sc.score from student s,sc,teacher t,course c where s.sid = sc.sid and sc.cid = c.cid and c.tid = t.tid and t.tname='叶平' and sc.score in (select max(sc.score) from student s,sc,teacher t,course c where s.sid = sc.sid and sc.cid = c.cid and c.tid = t.tid and t.tname='叶平');
四 exist
43、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
select sid,sname from student s where sid !=1002 and
not exists(select * from sc where sc.sid = s.sid and cid not in
(select cid from sc where sid =1002))
and not exists(select * from sc where sid =1002 and cid not in
(select cid from sc where sc.sid=s.sid))
五 row_number() 函数
44、查询各科成绩前三名的记录:(不考虑成绩并列情况) ;
select * from (select c.cname,sc.score,s.*,row_number() over (partition by sc.cid order by score desc,s.sid) rn from sc,student s,course c where sc.sid = s.sid and sc.cid = c.cid) where rn <=3;
45、查询每门功成绩最好的前两名 ;
select * from (select c.cname,s.*,sc.score,row_number() over
(partition by sc.cid order by score desc,s.sid) rn from sc,student s,course c where sc.sid = s.sid and sc.cid = c.cid) where rn <=2;
六 case when
46、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),UML (003),数据库(004);
select
round(sum(case when cid =001 then score else 0 end)/sum(case when cid =001 then 1 else 0 end),2) as 企业管理平均分,
100*round(sum(case when cid =001 and score>=60 then 1 else 0 end)/sum(case when cid =001 then 1 else 0 end),4)||'%' as 企业管理及格率,
round(sum(case when cid =002 then score else 0 end)/sum(case when cid =002 then 1 else 0 end),2) as 马克思平均分,
100*round(sum(case when cid =002 and score>=60 then 1 else 0 end)/sum(case when cid =002 then 1 else 0 end),4)||'%' as 马克思及格率,
round(sum(case when cid =003 then score else 0 end)/sum(case when cid =003 then 1 else 0 end),2) as UML平均分,
100*round(sum(case when cid =003 and score>=60 then 1 else 0 end)/sum(case when cid =003 then 1 else 0 end),4)||'%' as UML及格率,
round(sum(case when cid =004 then score else 0 end)/sum(case when cid =004 then 1 else 0 end),2) as 数据库平均分,
100*round(sum(case when cid =004 and score>=60 then 1 else 0 end)/sum(case when cid =004 then 1 else 0 end),4)||'%' as 数据库及格率
from sc;
47、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60] ;
select c.cid as 课程ID,c.cname as 课程名,
sum(case when sc.score between 85 and 100 then 1 else 0 end) as "[100-85]",
sum(case when sc.score between 70 and 84 then 1 else 0 end) as "[84-70]",
sum(case when sc.score between 60 and 69 then 1 else 0 end) as "[69-60]",
sum(case when sc.score between 0 and 59 then 1 else 0 end) as "[<60]"
from course c,sc where c.cid = sc.cid group by c.cid,c.cname;
48、按成绩显示每个课程排名前三的学生姓名(按如下格式显示)
select cname 课程名,max(case when rn=1 then sname end) "1st",
max(case when rn=2 then sname end) "2st",max(case when rn=3 then sname end) "3st" from (select s.*,c.*,sc.*,row_number() over(partition by sc.cid order by sc.score) rn from student s
,sc,course c where s.sid = sc.sid and sc.cid = c.cid) group by cname
数据库习题(oracle)的更多相关文章
- sqlserver 2008R2数据库迁移oracle
x项目需要,将以前的sqlserver数据库迁移的oracle数据库中,由于以前对oracle只是在DML语句的步骤,所以总结一下这次遇到的问题以及具体步骤 1,oracle新建数据库 新建Oracl ...
- 初识 数据库及Oracle数据库
一.数据库基本概念二.数据库举例三.Oracle特点四.Oracle版本五.安装Oracle注意事项六.SQL简介七.Select语句 一.数据库基本概念 数据库(Database,DB)数据库管理系 ...
- oracle监听,数据库,oracle服务器的启动和停用
一.oracle监听,数据库,oracle服务器的启动和停用 使用root用户登录:切换用户su – root/root操作系统,一般只有root用户才有权限去操作系统中安装的oracle数据库服务器 ...
- 数据库之Oracle的介绍与使用20180620
/*******************************************************************************************/ 一.orac ...
- Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle
ylbtech-DatabaseDesgin:Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle DatabaseName:PetShop(宠物商店) Model:宠物商店网 ...
- 数据库之Oracle
数据库之Oracle 一. 用户的管理 1. 用户就是好比公司的某个人,而权限是这个人能在公司做什么,他的角色就是说明他的职位. 2. 用户的权限分为: 系统权限:对别的用户的管理操作. 对象权限:对 ...
- Oracle数据库之Oracle的下载与安装
二.Oracle 的下载与安装 2.1.Oracle 简介 Oracle 公司是全球最大的信息管理软件及服务供应商,成立于 1977 年,主要的业务是推动电子商务平台的搭建.Oracle 公司有自己的 ...
- Linux下安装Oracle后重启无法登录数据库ORA-01034:ORACLE not available
Linux下安装了数据库,安装完成后可以用,今天启动就不能用了,提示Oracle not available,后来查找资料,据说是oracle服务没有打开.如下方式可以解决问题. [root@root ...
- 数据库之Oracle优化技巧(一)
数据库之Oracle优化技巧(一) 1.where子句中的连接顺序 在Oracle数据库中,where子句的执行顺序是自下而上进行解析,根据这个原理,表之间的连接必须写在其他where条件之前,那些可 ...
- Python操作数据库类 Oracle、Sqlserver、PostgreSQL
我在工作中经常使用Python,特点很明显,轻量,效率还不错,尤其在维护或者自动化方面. 下面是我使用到的访问数据库(Oracle.Sqlserver.PostgreSQL)的公共类. 一.Oracl ...
随机推荐
- oracle系列笔记(2)---多表查询
多表查询 这篇文章主要讲四点: (1)oracle多表查询 (2)SQL99标准的连接查询 (3)子查询 (4)分级查询 oracle多表查询有两种方式,一种是oracle所 ...
- #define宏与const的区别
1.#define宏的用法 #define用宏名代替一个字符串,这样便于修改,提高了程序的可移植性.编译器在编译预处理时只对宏做文本替换,而不进行类型检查,所以替换后可能产生一些副作用. 带参数的宏类 ...
- webstorm 编辑器破解 (麻麻再也不用担心过期了)
先去官网下载webstorm2016.1.3版本(目前只知道2016.1这个版本可以永久破解,不会过期) 再下载webstorm2016.1的破解补丁 将下载好的破解补丁解压,会有一个Jetbrain ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(三)搭建步骤
框架介绍: 主角即Spring.SpringMVC.MyBatis.easyUI,大家应该也都有所了解,概念性的东西就不写了,有万能的百度. 工作环境: jdk 1.7 m ...
- rsyslog+mariadb+loganalyzer实现日志服务器搭建
rsyslog+mariadb+loganalyzer实现日志服务器搭建 一.概述 Linux的日志记录了用户在系统上一切操作,包括系统自身运作产生的日志,这些日志是应使用者了解服务器的情况最好的资料 ...
- VUE2.0实现购物车和地址选配功能学习第五节
第五节 单件商品金额计算和单选全选功能 1.vue精髓在于操作data模型来改变dom,渲染页面,而不是直接去改变dom 2.加减改变总金额功能: html:<div class="c ...
- java基础之路(一)
Java数据类型分为内置类型和扩展类型两大类,其中的内置类型就是基本数据类型,而扩展类型则是Java语言根据基本类型扩展出的其他类型(也叫引用类型)(如:class,String等).本文主要讨论的是 ...
- 详细领悟ThreadLocal变量
关于对ThreadLocal变量的理解,我今天查看一下午的博客,自己也写了demo来测试来看自己的理解到底是不是那么回事.从看到博客引出不解,到仔细查看ThreadLocal源码(JDK1.8),我觉 ...
- PCB行业版特色功能展示
普实PCB行业版,专为PCB行业需求而定制.秉承一体化.集团化.移动化为设计理念,采用互联网技术.云计算技术.移动应用技术开发的新一代系统帮助PCB企业创新管理模式.引领商业变革!系统从接到订单开始, ...
- Java面试11|Maven与Git
git的命令一定要掌握,如果学习可以参考:廖雪峰的官方网站 1.Maven 生命周期及Maven多项目聚合与继承 Maven的生命周期分如下的9个阶段. (1)clean 清理自动生成的文件,也就是t ...