有某个学生运动会比赛信息的数据库,保存了如下的表:

  • 运动员sporter(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系号department)
  • 项目item(项目编号itemid,项目名称itemname,项目比赛地点location)
  • 成绩grade(运动员编号id,项目编号itemid,积分mark)

请用SQL语句完成如下功能:

1、  建表,并在相应字段上增加约束;

  • 定义各个表的主键和外键约束;
  • 运动员的姓名和所属系别不能为空;
  • 积分要第为空值,要么为6,4,2,0,分别代表第一,二,三名和其他名次的积分,注意名次可以有并列名次,后面的排名不往前提升,例如,如果有两个并列第一,则没有第二名。

2、  向表中插入指定的数据:

  1. 运动员(
  2. 1001,李明,男,计算机系
  3. 1002,张三,男,数学系
  4. 1003,李四,男,计算机系
  5. 1004,王二,男,物理系
  6. 1005,李娜,女,心理系
  7. 1006,孙丽,女,数学系)
  8. 项目(
  9. X001,男子五千米,一操场
  10. X002,男子标枪,一操场
  11. X003,男子跳远,二操场
  12. X004,女子跳高,二操场
  13. X005,女子三千米,三操场)
  14. 积分(
  15. 1001x0016
  16. 1002x0014
  17. 1003x0012
  18. 1004x0010
  19. 1001x0034
  20. 1002x0036
  21. 1004x0032
  22. 1005x0046
  23. 1006x0044
  24. 1003x0026
  25. 1005x0024
  26. 1006x0022
  27. 1001x0020

3、  完成如下的查询要求:

A、求出目前总积分最高的系名,及其积分。

B、找出在一操场进行比赛的各项目名称及其冠军的姓名。

C、找出参加了张三所参加的所有项目的其他同学的姓名。

D、经查张三因为使用了违禁药品,其成绩都记0分,请在数据库中作出相应修改。

E、经组委会协商,需要删除女子调高比赛项目。

一、建表

  1. DROP TABLE grade PURGE;
  2. DROP TABLE sporter PURGE;
  3. DROP TABLE item PURGE;
  4. CREATE TABLE sporter (
  5. sporterid NUMBER(4) PRIMARY KEY,
  6. name VARCHAR2(20) NOT NULL,
  7. sex VARCHAR2(10) CHECK (sex IN('男','女')),
  8. department VARCHAR2(20) NOT NULL
  9. );
  10. CREATE TABLE item (
  11. itemid VARCHAR2(4) PRIMARY KEY,
  12. itemname VARCHAR2(20) NOT NULL,
  13. location VARCHAR2(20) NOT NULL
  14. );
  15. CREATE TABLE grade (
  16. sporterid NUMBER(4) REFERENCES sporter(sporterid) ON DELETE CASCADE,
  17. itemid VARCHAR2(4) REFERENCES item(itemid) ON DELETE CASCADE,
  18. mark NUMBER(1) CHECK (mark IN (0,2,4,6))
  19. );

而且在Oracle之中要考虑回收站的问题。

二、增加数据

1、  增加运动员数据:

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

2、  增加项目数据

  1. INSERT INTO item(itemid,itemname,location) VALUES ('x001','男子五千米','一操场');
  2. INSERT INTO item(itemid,itemname,location) VALUES ('x002','男子标枪','一操场');
  3. INSERT INTO item(itemid,itemname,location) VALUES ('x003','男子跳远','二操场');
  4. INSERT INTO item(itemid,itemname,location) VALUES ('x004','女子跳高','二操场');
  5. INSERT INTO item(itemid,itemname,location) VALUES ('x005','女子三千米','三操场');

3、  增加运动员的项目成绩

  1. INSERT INTO grade(sporterid,itemid,mark) VALUES (1001,'x001',6);
  2. INSERT INTO grade(sporterid,itemid,mark) VALUES (1002,'x001',4);
  3. INSERT INTO grade(sporterid,itemid,mark) VALUES (1003,'x001',2);
  4. INSERT INTO grade(sporterid,itemid,mark) VALUES (1004,'x001',0);
  5. INSERT INTO grade(sporterid,itemid,mark) VALUES (1001,'x003',4);
  6. INSERT INTO grade(sporterid,itemid,mark) VALUES (1002,'x003',6);
  7. INSERT INTO grade(sporterid,itemid,mark) VALUES (1004,'x003',2);
  8. INSERT INTO grade(sporterid,itemid,mark) VALUES (1005,'x004',6);
  9. INSERT INTO grade(sporterid,itemid,mark) VALUES (1006,'x004',4);
  10. INSERT INTO grade(sporterid,itemid,mark) VALUES (1003,'x002',6);
  11. INSERT INTO grade(sporterid,itemid,mark) VALUES (1005,'x002',4);
  12. INSERT INTO grade(sporterid,itemid,mark) VALUES (1006,'x002',2);
  13. INSERT INTO grade(sporterid,itemid,mark) VALUES (1001,'x002',0);

三、数据操作

1、  求出目前总积分最高的系名,及其积分。

1、确定所要使用的数据表:

  • sporter表:求出系名称;
  • grade表:找到积分;

2、确定已知的关联字段:sporter.sporterid=grade.sporterid;

第一步:将sporter表和grade表联合

  1. SELECT s.department,g.mark
  2. FROM sporter s,grade g
  3. WHERE s.sporterid=g.sporterid;

第二步:以上是求出每个系针对于项目获得的积分,那么下面将以上的查询分组,按照系名称分组。

  1. SELECT s.department,SUM(g.mark)
  2. FROM sporter s,grade g
  3. WHERE s.sporterid=g.sporterid
  4. GROUP BY s.department;

此时已经知道各个系的成绩了,那么对于求出总积分最高的信息,有两种做法:

  • 做法一:不考虑相同积分的问题,所有的数据由高到低降序排列,取第一个数据。
  1. SELECT * FROM (
  2. SELECT s.department,SUM(g.mark) sum
  3. FROM sporter s,grade g
  4. WHERE s.sporterid=g.sporterid
  5. GROUP BY s.department
  6. ORDER BY sum DESC)
  7. WHERE ROWNUM=1;
  • 做法二:考虑相同积分的问题,则必须首先进行分组函数的嵌套,求出最高的积分是多少,而后再用此内容与之前的分组进行过滤。
  1. SELECT s.department,SUM(g.mark) sum
  2. FROM sporter s,grade g
  3. WHERE s.sporterid=g.sporterid
  4. GROUP BY s.department
  5. HAVING SUM(g.mark)=(
  6. SELECT MAX(SUM(g.mark)) sum
  7. FROM sporter s,grade g
  8. WHERE s.sporterid=g.sporterid
  9. GROUP BY s.department);

2、  找出在一操场进行比赛的各项目名称及其冠军的姓名。

1、确定所要使用的数据表:

  • sporter表:运动员的姓名;
  • item表:项目名称;
  • grade表:冠军的信息依靠成绩计算;

2、确定已知的关联字段:

  • 运动员和成绩:sporter.sporterid=grade.sporterid;
  • 项目和成绩:item.itemid=grade.itemid;

第一步:确定一操场进行的项目的ID

  1. SELECT itemid FROM item WHERE location='一操场';

第二步:求出冠军的成绩,因为各个项目有各个项目的冠军分数

  1. SELECT i.itemid,MAX(g.mark) max
  2. FROM item i,grade g
  3. WHERE i.location='一操场' AND i.itemid=g.itemid
  4. GROUP BY i.itemid;

第三步:要根据这个成绩,找到对应的运动员姓名

  1. SELECT s.name,g.itemid,temp.max
  2. FROM sporter s,grade g,(
  3. SELECT i.itemid iid,MAX(g.mark) max
  4. FROM item i,grade g
  5. WHERE i.location='一操场' AND i.itemid=g.itemid
  6. GROUP BY i.itemid) temp
  7. WHERE s.sporterid=g.sporterid AND temp.iid=g.itemid AND g.mark=temp.max;

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

  1. SELECT s.name,g.itemid,temp.max,i.itemname
  2. FROM sporter s,grade g,(
  3. SELECT i.itemid iid,MAX(g.mark) max
  4. FROM item i,grade g
  5. WHERE i.location='一操场' AND i.itemid=g.itemid
  6. GROUP BY i.itemid) temp,item i
  7. WHERE s.sporterid=g.sporterid AND temp.iid=g.itemid AND g.mark=temp.max
  8. 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;

第一步:确定张三的运动员编号

  1. SELECT s.sporterid
  2. FROM sporter s
  3. WHERE s.name='张三';

第二步:根据运动员的编号,找到参加的项目的编号

  1. SELECT g.itemid
  2. FROM grade g
  3. WHERE g.sporterid=(
  4. SELECT s.sporterid
  5. FROM sporter s
  6. WHERE s.name='张三');

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

  1. SELECT g.sporterid
  2. FROM grade g
  3. WHERE g.itemid IN(
  4. SELECT g.itemid
  5. FROM grade g
  6. WHERE g.sporterid=(
  7. SELECT s.sporterid
  8. FROM sporter s
  9. WHERE s.name='张三'));

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

  1. SELECT name
  2. FROM sporter
  3. WHERE sporterid IN(
  4. SELECT g.sporterid
  5. FROM grade g
  6. WHERE g.itemid IN(
  7. SELECT g.itemid
  8. FROM grade g
  9. WHERE g.sporterid=(
  10. SELECT s.sporterid
  11. FROM sporter s
  12. WHERE s.name='张三')))
  13. AND name<>'张三';

4、  经查张三因为使用了违禁药品,其成绩都记0分,请在数据库中作出相应修改。

现在只是知道了张三的姓名,却不知道运动员编号,而成绩需要在grade表中通过运动员编号更新。

  1. UPDATE grade SET mark=0 WHERE sporterid=(
  2. SELECT sporterid FROM sporter WHERE name='张三');

5、  经组委会协商,需要删除女子跳高比赛项目。

项目删除之后对应的成绩也应该消失,而在之前已经配置了级联删除了,所以直接删除父表即可。

  1. DELETE FROM item WHERE itemname='女子跳高';

Oracle笔记(十一) 建表、更新、查询综合练习的更多相关文章

  1. Oracle笔记(1) 简单查询、限定查询、数据的排序

    Oracle笔记(四) 简单查询.限定查询.数据的排序   一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...

  2. Oracle 数据库(oracle Database)Select 多表关联查询方式

    Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...

  3. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  4. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  5. 一次作业过程及其问题的记录:mysql建立数据库、建表、查询和插入等

    前言 这次的作业需要我建立一个小的数据库. 这次作业我使用了mysql,进行了建库.建表.查询.插入等操作. 以下是对本次作业相关的mysql操作过程及过程中出现的问题的记录. 正文 作业中对数据库的 ...

  6. Oracle笔记_多表查询

    1 执行sql文件 @文件地址名 --执行某个sql文件: 2 多表查询 想要的数据不在同一张表,就需要多个表进行联查. 多表查询也叫做表连接查询,其中的where条件就是连接条件. 可以使用join ...

  7. Oracle笔记(八) 复杂查询及总结

    一.复杂查询 1. 列出至少有一个员工的所有部门编号.名称,并统计出这些部门的平均工资.最低工资.最高工资. 1.确定所需要的数据表: emp表:可以查询出员工的数量: dept表:部门名称: emp ...

  8. Oracle 存储过程动态建表

    动态sql,顾名思义就是动态执行的sql,也就是说在没执行之前是动态的拼接的. 任务 传入参数:新建的表名hd+当前的年和月,例如hd_201105表结构是:字段1:id ,类型是number,可以自 ...

  9. sql 建表以及查询---复杂查询之成绩排名

    废话不说,直接建表 1.表Player USE T4st -- 设置当前数据库为T4st,以便访问sysobjects IF EXISTS(SELECT * FROM sysobjects WHERE ...

  10. oracle数据库的建表,删除字段,添加字段,修改字段,修改字段......

    1. 使用oracle创建一张表: SQL> create table loginuser( id ,), username ), password ), email ), descriable ...

随机推荐

  1. cached占比过高

    Linux手动释放缓存的方法Linux释放内存的命令:syncecho 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义 ...

  2. Java使用jxl写入Excel文件

    首先添加jxl的maven依赖: <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl --> < ...

  3. 如何将Nginx注册为系统服务,开机自启动

    亲测有效! 一般程序员在实际工作中,除了敲代码,很少有机会实际接触操作其它东西,例如服务器环境搭建,项目部署等等,不是领导信任或项目组核心成员,应该是没有机会实际接触的,只能通过网上资料稍微了解一下. ...

  4. Debezium系列随笔

    0.Debezium简介 1.Run Debezium for Mysql in docker step by step 2.Run Debezium for SQLServer in docker ...

  5. SIFT学习笔记之二 特征提取

    特征提取函数: int _sift_features( IplImage* img, struct feature** feat, int intvls, double sigma, double c ...

  6. std::replace函数

    需包含头文件#include <algorithm> template <class ForwardIterator, class T> void replace (Forwa ...

  7. 第一个go程序

    进入到工作空间中(我的是$HOME/go, 所以使用cd $HOME/go命令直接进入) 然后创建一个目录 src/hello( mkdir src/hello), 然后进入到该目录中(cd src/ ...

  8. 数字麦克风PDM转PCM与STM32 I2S接口应用----重要文档列表

    数字麦克风PDM脉冲到PCM信号需要一个二次采样,ST 提过了PDM2PCM的软件包,可以完成上面的工作.软件包源码没有开源,使用手册也简洁的让人抓狂,我觉得可能是因为ST更高级的MCU直接带了硬解码 ...

  9. 初识gRPC

    一.gRPC的概念 gRPC是Google推出的一个开源高性能的轻量级RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...

  10. [Agc029D]Grid game_贪心

    Grid game 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_d 数据范围:略. 题解: 方法肯定很简单,就是找一处障碍待在他上面就好. ...