Oracle笔记(十一) 建表、更新、查询综合练习
有某个学生运动会比赛信息的数据库,保存了如下的表:
- 运动员sporter(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系号department)
- 项目item(项目编号itemid,项目名称itemname,项目比赛地点location)
- 成绩grade(运动员编号id,项目编号itemid,积分mark)
请用SQL语句完成如下功能:
1、 建表,并在相应字段上增加约束;
- 定义各个表的主键和外键约束;
- 运动员的姓名和所属系别不能为空;
- 积分要第为空值,要么为6,4,2,0,分别代表第一,二,三名和其他名次的积分,注意名次可以有并列名次,后面的排名不往前提升,例如,如果有两个并列第一,则没有第二名。
2、 向表中插入指定的数据:

- 运动员(
- 1001,李明,男,计算机系
- 1002,张三,男,数学系
- 1003,李四,男,计算机系
- 1004,王二,男,物理系
- 1005,李娜,女,心理系
- 1006,孙丽,女,数学系)
- 项目(
- X001,男子五千米,一操场
- X002,男子标枪,一操场
- X003,男子跳远,二操场
- X004,女子跳高,二操场
- X005,女子三千米,三操场)
- 积分(
- 1001,x001,6
- 1002,x001,4
- 1003,x001,2
- 1004,x001,0
- 1001,x003,4
- 1002,x003,6
- 1004,x003,2
- 1005,x004,6
- 1006,x004,4
- 1003,x002,6
- 1005,x002,4
- 1006,x002,2
- 1001,x002,0)

3、 完成如下的查询要求:
A、求出目前总积分最高的系名,及其积分。
B、找出在一操场进行比赛的各项目名称及其冠军的姓名。
C、找出参加了张三所参加的所有项目的其他同学的姓名。
D、经查张三因为使用了违禁药品,其成绩都记0分,请在数据库中作出相应修改。
E、经组委会协商,需要删除女子调高比赛项目。
一、建表

- DROP TABLE grade PURGE;
- DROP TABLE sporter PURGE;
- DROP TABLE item PURGE;
- CREATE TABLE sporter (
- sporterid NUMBER(4) PRIMARY KEY,
- name VARCHAR2(20) NOT NULL,
- sex VARCHAR2(10) CHECK (sex IN('男','女')),
- department VARCHAR2(20) NOT NULL
- );
- CREATE TABLE item (
- itemid VARCHAR2(4) PRIMARY KEY,
- itemname VARCHAR2(20) NOT NULL,
- location VARCHAR2(20) NOT NULL
- );
- CREATE TABLE grade (
- sporterid NUMBER(4) REFERENCES sporter(sporterid) ON DELETE CASCADE,
- itemid VARCHAR2(4) REFERENCES item(itemid) ON DELETE CASCADE,
- mark NUMBER(1) CHECK (mark IN (0,2,4,6))
- );

而且在Oracle之中要考虑回收站的问题。
二、增加数据
1、 增加运动员数据:

- INSERT INTO sporter(sporterid,name,sex,department) VALUES (1001,'李明','男','计算机系');
- INSERT INTO sporter(sporterid,name,sex,department) VALUES (1002,'张三','男','数学系');
- INSERT INTO sporter(sporterid,name,sex,department) VALUES (1003,'李四','男','计算机系');
- INSERT INTO sporter(sporterid,name,sex,department) VALUES (1004,'王二','男','物理系');
- INSERT INTO sporter(sporterid,name,sex,department) VALUES (1005,'李娜','女','心理系');
- INSERT INTO sporter(sporterid,name,sex,department) VALUES (1006,'孙丽','女','数学系');

2、 增加项目数据
- INSERT INTO item(itemid,itemname,location) VALUES ('x001','男子五千米','一操场');
- INSERT INTO item(itemid,itemname,location) VALUES ('x002','男子标枪','一操场');
- INSERT INTO item(itemid,itemname,location) VALUES ('x003','男子跳远','二操场');
- INSERT INTO item(itemid,itemname,location) VALUES ('x004','女子跳高','二操场');
- INSERT INTO item(itemid,itemname,location) VALUES ('x005','女子三千米','三操场');
3、 增加运动员的项目成绩

- INSERT INTO grade(sporterid,itemid,mark) VALUES (1001,'x001',6);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1002,'x001',4);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1003,'x001',2);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1004,'x001',0);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1001,'x003',4);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1002,'x003',6);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1004,'x003',2);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1005,'x004',6);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1006,'x004',4);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1003,'x002',6);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1005,'x002',4);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1006,'x002',2);
- INSERT INTO grade(sporterid,itemid,mark) VALUES (1001,'x002',0);

三、数据操作
1、 求出目前总积分最高的系名,及其积分。
1、确定所要使用的数据表:
- sporter表:求出系名称;
- grade表:找到积分;
2、确定已知的关联字段:sporter.sporterid=grade.sporterid;
第一步:将sporter表和grade表联合
- SELECT s.department,g.mark
- FROM sporter s,grade g
- WHERE s.sporterid=g.sporterid;
第二步:以上是求出每个系针对于项目获得的积分,那么下面将以上的查询分组,按照系名称分组。
- SELECT s.department,SUM(g.mark)
- FROM sporter s,grade g
- WHERE s.sporterid=g.sporterid
- GROUP BY s.department;
此时已经知道各个系的成绩了,那么对于求出总积分最高的信息,有两种做法:
- 做法一:不考虑相同积分的问题,所有的数据由高到低降序排列,取第一个数据。

- SELECT * FROM (
- SELECT s.department,SUM(g.mark) sum
- FROM sporter s,grade g
- WHERE s.sporterid=g.sporterid
- GROUP BY s.department
- ORDER BY sum DESC)
- WHERE ROWNUM=1;

- 做法二:考虑相同积分的问题,则必须首先进行分组函数的嵌套,求出最高的积分是多少,而后再用此内容与之前的分组进行过滤。

- SELECT s.department,SUM(g.mark) sum
- FROM sporter s,grade g
- WHERE s.sporterid=g.sporterid
- GROUP BY s.department
- HAVING SUM(g.mark)=(
- SELECT MAX(SUM(g.mark)) sum
- FROM sporter s,grade g
- WHERE s.sporterid=g.sporterid
- GROUP BY s.department);

2、 找出在一操场进行比赛的各项目名称及其冠军的姓名。
1、确定所要使用的数据表:
- sporter表:运动员的姓名;
- item表:项目名称;
- grade表:冠军的信息依靠成绩计算;
2、确定已知的关联字段:
- 运动员和成绩:sporter.sporterid=grade.sporterid;
- 项目和成绩:item.itemid=grade.itemid;
第一步:确定一操场进行的项目的ID
- SELECT itemid FROM item WHERE location='一操场';
第二步:求出冠军的成绩,因为各个项目有各个项目的冠军分数
- SELECT i.itemid,MAX(g.mark) max
- FROM item i,grade g
- WHERE i.location='一操场' AND i.itemid=g.itemid
- GROUP BY i.itemid;
第三步:要根据这个成绩,找到对应的运动员姓名

- SELECT s.name,g.itemid,temp.max
- FROM sporter s,grade g,(
- SELECT i.itemid iid,MAX(g.mark) max
- FROM item i,grade g
- WHERE i.location='一操场' AND i.itemid=g.itemid
- GROUP BY i.itemid) temp
- WHERE s.sporterid=g.sporterid AND temp.iid=g.itemid AND g.mark=temp.max;

第四步:找到项目名称,引入item表

- SELECT s.name,g.itemid,temp.max,i.itemname
- FROM sporter s,grade g,(
- SELECT i.itemid iid,MAX(g.mark) max
- FROM item i,grade g
- WHERE i.location='一操场' AND i.itemid=g.itemid
- GROUP BY i.itemid) temp,item i
- WHERE s.sporterid=g.sporterid AND temp.iid=g.itemid AND g.mark=temp.max
- AND g.itemid=i.itemid AND temp.iid=i.itemid;

3、 找出参加了张三所参加的所有项目的其他同学的姓名。
1、确定所要使用的数据表:
- sporter表:张三的运动员ID;
- grade表:根据它找到项目的ID;
- sporterid:根据grade表和之前的sporter表确定出的项目ID,找到运动员的编号及姓名;
2、确定已知的关联字段:sporter.sporterid=grade.sporterid;
第一步:确定张三的运动员编号
- SELECT s.sporterid
- FROM sporter s
- WHERE s.name='张三';
第二步:根据运动员的编号,找到参加的项目的编号

- SELECT g.itemid
- FROM grade g
- WHERE g.sporterid=(
- SELECT s.sporterid
- FROM sporter s
- WHERE s.name='张三');

第三步:修改以上的查询,找到所有的运动员的编号

- SELECT g.sporterid
- FROM grade g
- WHERE g.itemid IN(
- SELECT g.itemid
- FROM grade g
- WHERE g.sporterid=(
- SELECT s.sporterid
- FROM sporter s
- WHERE s.name='张三'));

第四步:根据运动员的编号找到运动员的姓名

- SELECT name
- FROM sporter
- WHERE sporterid IN(
- SELECT g.sporterid
- FROM grade g
- WHERE g.itemid IN(
- SELECT g.itemid
- FROM grade g
- WHERE g.sporterid=(
- SELECT s.sporterid
- FROM sporter s
- WHERE s.name='张三')))
- AND name<>'张三';

4、 经查张三因为使用了违禁药品,其成绩都记0分,请在数据库中作出相应修改。
现在只是知道了张三的姓名,却不知道运动员编号,而成绩需要在grade表中通过运动员编号更新。
- UPDATE grade SET mark=0 WHERE sporterid=(
- SELECT sporterid FROM sporter WHERE name='张三');
5、 经组委会协商,需要删除女子跳高比赛项目。
项目删除之后对应的成绩也应该消失,而在之前已经配置了级联删除了,所以直接删除父表即可。
- DELETE FROM item WHERE itemname='女子跳高';
Oracle笔记(十一) 建表、更新、查询综合练习的更多相关文章
- Oracle笔记(1) 简单查询、限定查询、数据的排序
Oracle笔记(四) 简单查询.限定查询.数据的排序 一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...
- Oracle 数据库(oracle Database)Select 多表关联查询方式
Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...
- 64、django之模型层(model)--建表、查询、删除基础
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...
- django之模型层(model)--建表、查询、删除基础
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...
- 一次作业过程及其问题的记录:mysql建立数据库、建表、查询和插入等
前言 这次的作业需要我建立一个小的数据库. 这次作业我使用了mysql,进行了建库.建表.查询.插入等操作. 以下是对本次作业相关的mysql操作过程及过程中出现的问题的记录. 正文 作业中对数据库的 ...
- Oracle笔记_多表查询
1 执行sql文件 @文件地址名 --执行某个sql文件: 2 多表查询 想要的数据不在同一张表,就需要多个表进行联查. 多表查询也叫做表连接查询,其中的where条件就是连接条件. 可以使用join ...
- Oracle笔记(八) 复杂查询及总结
一.复杂查询 1. 列出至少有一个员工的所有部门编号.名称,并统计出这些部门的平均工资.最低工资.最高工资. 1.确定所需要的数据表: emp表:可以查询出员工的数量: dept表:部门名称: emp ...
- Oracle 存储过程动态建表
动态sql,顾名思义就是动态执行的sql,也就是说在没执行之前是动态的拼接的. 任务 传入参数:新建的表名hd+当前的年和月,例如hd_201105表结构是:字段1:id ,类型是number,可以自 ...
- sql 建表以及查询---复杂查询之成绩排名
废话不说,直接建表 1.表Player USE T4st -- 设置当前数据库为T4st,以便访问sysobjects IF EXISTS(SELECT * FROM sysobjects WHERE ...
- oracle数据库的建表,删除字段,添加字段,修改字段,修改字段......
1. 使用oracle创建一张表: SQL> create table loginuser( id ,), username ), password ), email ), descriable ...
随机推荐
- cached占比过高
Linux手动释放缓存的方法Linux释放内存的命令:syncecho 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义 ...
- Java使用jxl写入Excel文件
首先添加jxl的maven依赖: <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl --> < ...
- 如何将Nginx注册为系统服务,开机自启动
亲测有效! 一般程序员在实际工作中,除了敲代码,很少有机会实际接触操作其它东西,例如服务器环境搭建,项目部署等等,不是领导信任或项目组核心成员,应该是没有机会实际接触的,只能通过网上资料稍微了解一下. ...
- Debezium系列随笔
0.Debezium简介 1.Run Debezium for Mysql in docker step by step 2.Run Debezium for SQLServer in docker ...
- SIFT学习笔记之二 特征提取
特征提取函数: int _sift_features( IplImage* img, struct feature** feat, int intvls, double sigma, double c ...
- std::replace函数
需包含头文件#include <algorithm> template <class ForwardIterator, class T> void replace (Forwa ...
- 第一个go程序
进入到工作空间中(我的是$HOME/go, 所以使用cd $HOME/go命令直接进入) 然后创建一个目录 src/hello( mkdir src/hello), 然后进入到该目录中(cd src/ ...
- 数字麦克风PDM转PCM与STM32 I2S接口应用----重要文档列表
数字麦克风PDM脉冲到PCM信号需要一个二次采样,ST 提过了PDM2PCM的软件包,可以完成上面的工作.软件包源码没有开源,使用手册也简洁的让人抓狂,我觉得可能是因为ST更高级的MCU直接带了硬解码 ...
- 初识gRPC
一.gRPC的概念 gRPC是Google推出的一个开源高性能的轻量级RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...
- [Agc029D]Grid game_贪心
Grid game 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_d 数据范围:略. 题解: 方法肯定很简单,就是找一处障碍待在他上面就好. ...