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向mysql建表语句的迁移。 直接表结构的生成sql脚本
在Oracle数据库管理系统中,建表语句是进行数据存储和管理的基础操作。Oracle支持SQL标准的CREATE TABLE语句,用于创建新的数据库表。本篇将深入探讨Oracle中的基本建表语句及其相关操作。 首先,建表语句的基本...
利用oracle存储过程,方便快捷创建大量测试表!!!!!
本文将详细介绍Oracle的基本建表语句及相关操作。 首先,创建用户是数据库管理的基础。Oracle中创建用户的基本语法如下: ```sql CREATE USER 用户名 IDENTIFIED BY 密码 DEFAULT TABLESPACE 表空间名 TEMPORARY ...
Java 操作 Oracle 数据库(建表,插数据,删除) Java 是一种广泛使用的编程语言,而 Oracle 数据库是一种功能强大且广泛使用的关系型数据库管理系统。在本文中,我们将探讨如何使用 Java 操作 Oracle 数据库,包括...
用于Oracle建系统表,如s_emp等
oracle导入导出建表空间语句:建用户;建表空间;用户授权dba;导入导出;
本话题主要关注如何利用Python的xlrd库来读取Excel文件,并根据其中的数据生成适用于Oracle数据库的建表语句。 首先,xlrd是一个Python库,专门用于读取Excel文件。它支持多种Excel文件格式,包括.xls和.xlsx,使得...
### Oracle数据库创建表与操作命令详解 #### 一、创建表`db_action`...以上就是从提供的文件中提取并整理出来的关于Oracle数据库中的建库建表及相关命令的详细介绍。这些命令可以帮助您更好地理解和操作Oracle数据库。
标题"excel2003 生成oracle 建表语句"涉及到一个实用工具,它允许用户利用Microsoft Excel 2003来创建Oracle数据库的建表语句。这个工具基于Excel的宏功能,使得非编程背景的用户也能相对轻松地生成SQL脚本,这对于...
本文将详细解析Oracle的基本建表语句以及相关的数据库操作。 首先,创建用户是数据库管理的第一步。以下是一个创建用户`han`的示例: ```sql CREATE USER han IDENTIFIED BY han DEFAULT TABLESPACE users ...
oracle建表创建代码表名用户权限以及类容。
Oracle数据库安装完毕,自带有很实用的练习用表:DEPT、EMP、BONUS、SALGRADE。很方便练习。 但是MySQL数据库安装完毕,却没有练习用表...特此,把Oracle这4个练习用表的建表语句,分别用Oracle语句和MySQL语句写出来。
在Oracle数据库系统中,"activity-oracle建表SQL"指的是创建活动相关数据表的SQL语句。Oracle数据库是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。当我们谈论“建表SQL”,意味着我们...
我们都知道在9i之前,要想获得建表和索引的语句是一件很麻烦的事。我们可以通过 export with rows=no来得到,但它的输出因为格式的问题并不能直接拿来用。而另一种方法就是写复杂的脚本来查询数据字典,但这对于一...
Oracle提供多种方式来导出建表脚本,以方便在不同环境或者进行数据重建时使用。标题中的"oracle.exportsql.(导出建表脚本)"就指的这个过程。 建表脚本通常包含了创建数据库表结构的所有SQL语句,包括表名、字段名、...
"Oracle自带建表命令"指的是Oracle数据库系统内建的SQL语句,用于创建数据表。当你使用Oracle精简版或者初次安装Oracle数据库时,可能需要手动创建数据库表来存储各种业务数据。以下是一些关于Oracle建表命令的关键...
Oracle数据库-建库、建表空间
oracle建表空间建用户
Oracle建表语句Oracle建表语句