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学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的...
用于记录自己的学习过程的练习笔记,内容是关于oracle的建表需要用到的一些常用的语法和一些常用的函数,例如:字符串函数,时间函数,数学函数等.
c语言学习
人脸识别项目源码实战
人脸识别项目源码实战
本图书进销存管理系统管理员功能有个人中心,用户管理,图书类型管理,进货订单管理,商品退货管理,批销订单管理,图书信息管理,客户信息管理,供应商管理,库存分析管理,收入金额管理,应收金额管理,我的收藏管理。 用户功能有个人中心,图书类型管理,进货订单管理,商品退货管理,批销订单管理,图书信息管理,客户信息管理,供应商管理,库存分析管理,收入金额管理,应收金额管理。因而具有一定的实用性。 本站是一个B/S模式系统,采用Spring Boot框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得图书进销存管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高图书进销存管理系统管理效率。 关键词:图书进销存管理系统;Spring Boot框架;MYSQL数据库
基于动态规划和模型预测控制的并联混合电动汽车最佳控制 简介:利用动态规划,使用模型预测控制,实现对并联混合动力电动汽车的最佳控制,并降低总体成本函数 使用动态规划可以实现混合动力电动汽车的优化控制 混合动力电动汽车的模型预测控制是通过使用动态规划在缩短的时域内实现的 代码为纯matlab脚本,附带说明电子文档 ,并联混合电动汽车; 动态规划; 模型预测控制; 最佳控制; 总体成本函数; Matlab脚本。,动态规划与模型预测控制在并联混合动力电动汽车的最优控制策略
人脸识别项目实战
2025 DeepSeek技术全景解析-重塑全球AI生态的中国力量.pdf
能够爬取非会员视频和音频资源,可通过ffmpeg等工具将视频资源和音频资源合并
基于差分进化算法DE的机器人路径规划 本产品基于优化的差分进化算法,专为机器人山地路径规划而设计 通过模拟差分进化过程中的变异、交叉与选择机制,算法能够智能探索并确定最优行进路线,全面考量路径长度、能量消耗及地形适应性 优化之处在于融合了动态差分权重与精英保留策略,显著增强了算法的搜索效率和求解质量,有效规避了早熟收敛的风险 该算法在山地这一复杂且多变的自然环境中展现出卓越性能,完美适配于机器人探险、山地救援、环境监测等多种应用场景 我们矢志为用户提供卓越、稳健的机器人路径规划方案,推动各类山地作业迈向更为精确与高效的路径规划新时代 ,差分进化算法DE; 机器人路径规划; 山地路径规划; 算法优化; 早熟收敛风险规避; 山地探险应用场景; 环境监测场景。,DE算法赋能机器人,优化山地路径规划方案
情侣游戏情侣飞行棋10元真心话大冒险情侣情趣骰子php源码 ----- 程序特色 ----- 1、完整的分销制度,可自定义多种不同的返佣比例 2、支持情侣飞行棋、情趣骰子,多种等级 3、无感微信自动授权登录,支持微信第三方授权登录 4、完全开源无加密
HeidiSQL的12.2.0.6576安装压缩包
监护人,小孩和玩具数据集 4647张原始图片 监护人 食物 孩子 玩具 精确率可达85.4% yolov5pytorch格式
本课程是 PHP 进阶系列之 Swoole 入门精讲,系统讲解 Swoole 在 PHP 高性能开发中的应用,涵盖 协程、异步编程、WebSocket、TCP/UDP 通信、任务投递、定时器等核心功能。通过理论解析和实战案例相结合,帮助开发者掌握 Swoole 的基本使用方法及其在高并发场景下的应用。 适用人群: 适合 有一定 PHP 基础的开发者、希望提升后端性能优化能力的工程师,以及 对高并发、异步编程感兴趣的学习者。 能学到什么: 掌握 Swoole 基础——理解 Swoole 的核心概念,如协程、异步编程、事件驱动等。 高并发处理——学习如何使用 Swoole 构建高并发的 Web 服务器、TCP/UDP 服务器。 实战项目经验——通过案例实践,掌握 Swoole 在 WebSocket、消息队列、微服务等场景的应用。 阅读建议: 建议先掌握 PHP 基础,了解 HTTP 服务器和并发处理相关概念。学习过程中,结合 官方文档和实际项目 进行实践,加深理解,逐步提升 Swoole 开发能力。
机器人先进视觉赛-基于深度学习yolov8的3D识别项目源码含gui界面(最新发布).zip 实现机器人的3D目标识别和分割功能 支持深度图像的处理和分析 【资源详情说明】 【1】该项目为近期精心打造开发,完整代码。同时,配套资料一应俱全,涵盖详细的设计文档 【2】项目上传前源码经过严格测试,在多种环境下均能稳定运行,功能完善且稳定运行,技术研究、教学演示还是项目实践,都能轻松复现,节省时间和精力。 【3】本项目面向计算机相关专业领域的各类人群,对于高校学生,可作为毕业设计、课程设计、日常作业的优质参考;对于科研工作者和行业从业者,可作为项目初期立项演示,助力快速搭建原型,验证思路。 【4】若具备一定技术基础,可在此代码上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 【5】小白,在配置环境或运行项目时遇到困难,可提供远程指导和全方位技术支持。 欢迎下载学习本项目资源,期待与你共同探讨技术问题,交流项目经验!
Matlab实现TSO-XGBoost多变量回归预测 Matlab实现TSO-XGBoost多变量回归预测,金枪鱼算法优化XGBoost多变量回归预测 1.data为数据集,7个输入特征,1个输出特征 2.MainTSO XGboost.m为主程序文件,其他为函数文件,无需运行 3.命令窗口输出R2、MAE、MAE和RMSEP等评价指标,可在下载区获取数据和程序内容 注意程序和数据放在一个文件夹,文件夹不可以XGBoost命名,因为有函数已经用过,运行环境为 Matlab2018及以上,预测效果如下 ,TSO-XGBoost; 多变量回归预测; Matlab实现; 金枪鱼算法优化; 评价指标; 预测效果; 文件夹结构; 运行环境,Matlab中TSO-XGBoost多变量回归预测优化实践
实时音视频SRT协议中文完整版
学习WiFi,入手资料
c语言学习