有某个学生运动会比赛信息的数据库,保存了如下的表:
运动员sporter(运动员编号sporterid,运动员姓名sportername,运动员性别sex,所属系号department)
项目item(项目编号itemid,项目名称itemname,项目比赛地点location)
成绩grade(运动员编号id,项目编号itemid,积分mark)
请用SQL语句完成如下功能:
1.建表,并在相应字段上增加约束
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
)
完成如下的查询要求:
|-求出目前总积分最高的系名,及其积分
|-找出一操场进行比赛的各项目名称及其冠军的姓名
|-找出参加了张三所参加的所有项目的其他同学的姓名
|-经查张三因为使用了违禁药品,其成绩都记为0分,请在数据库中作出相应修改
|-经组委会协商,需要删除女子跳高比赛项目
--删除数据表
drop table sporter purge;
drop table item purge;
drop table grade purge;
--创建数据表
create table sporter(
sporterid number(4),
name varchar2(20) not null,
sex varchar2(20),
department varchar2(20),
constraint pk_sporterid primary key (sporterid)
);
create table item(
itemid varchar2(4),
itemname varchar2(20) not null,
location varchar2(20) not null,
constraint pk_itemid primary key (itemid)
);
create table grade(
sporterid number(4),
itemid varchar2(4),
mark number(1),
constraint fk_sporterid foreign key (sporterid) references sporter(sporterid) on delete cascade,
constraint fk_itemid foreign key (itemid) references item(itemid) on delete cascade
);
--增加测试数据--运动员
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,‘孙俪‘,‘女‘,‘数学系‘);
--增加测试数据--项目
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‘,‘女子三千米‘,‘三操场‘);
--增加测试数据--成绩
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);
--事物提交
commit;
数据操作
- 求出目前总积分最高的系名,及其积分
确定要使用的数据表:
|-grade表:统计出总积分
|-sporter表:系名称
确定已知的关联字段:
|-运动员和成绩:sporter.sporterid=grade.sporterid
第一步:换一个查询方式,查询出每个系的名称和所取得的各个成绩
select s.department,g.mark
from sporter s,grade g
where s.sporterid=g.sporterid;
第二步:以上的查询存在有重复数据,所以可以直接分组,使用sum()函数统计总成绩。
select s.department,sum(g.mark)
from sporter s,grade g
where s.sporterid=g.sporterid
group by s.department;
第三步:要想求出最高的成绩,那么久需要统计函数嵌套,而统计函数嵌套之后不允许出现任何的字段,包括分组字段。
select max(sum(g.mark))
from sporter s,grade g
where s.sporterid=g.sporterid
group by s.department;
第四步:将第二步的返回结果进行分组后过滤,用第三步的结果进行过滤
select s.department,sum(g.mark)
from sporter s,grade g
where s.sporterid=g.sporterid
group by s.department
having sum(g.mark) =(
select max(sum(g.mark))
from sporter s,grade g
where s.sporterid=g.sporterid
group by s.department
);
找出在一操场进行比赛的各项目名称及其冠军的姓名 确定要使用的数据表 |-item表:项目名称 |-sporter表:姓名 |-grade表:成绩
确定已知的关联字段
|-项目和成绩:item.itemid=grade.itemid;
|-运动员和成绩:sporter.sporterid=grade.sporterid
第一步:找出所有一操场所有举办项目的编号,因为只有通过编号才能找到成绩
select itemid
from item
where location=‘一操场‘;
第二步:找到在此标号之中举办的项目的冠军成绩
select itemid,max(mark)
from grade
where itemid in(
select itemid
from item
where location=‘一操场‘)
group by itemid;
第三步:找到符合此成绩的运动员数据
select g.sporterid
from grade g,(
select itemid iid,max(mark) max
from grade
where itemid in(
select itemid
from item
where location =‘一操场‘)
group by itemid) temp
where g.itemid=temp.iid and g.mark=temp.max;
第四步:增加项目信息和运动员信息
select g.sporterid,s.name,g.mark,i.itemname
from grade g,(
select itemid iid,max(mark) max
from grade
where itemid in(
select itemid
from item
where location =‘一操场‘)
group by itemid) temp,item i,sporter s
where g.itemid=temp.iid and g.mark=temp.max
and temp.iid=i.itemid and s.sporterid=g.sporterid;
3. 找出参加了张三所参加过的项目的其他同学的姓名
确定要使用的数据表
|-sporter表:运动员姓名
|-grade表:项目编号
第一步:找到张三的运动员编号
select sporterid
from sporter where name=‘张三‘;
第二步:张三所有参加的项目都在grade表中
select itemid
from grade
where grade.sporterid=(
select sporterid
from sporter
where name=‘张三‘
);
第三步:根据此项目编号找到运动员编号
select sporterid
from grade
where itemid in(
select itemid
from grade
where grade.sporterid=(
select sporterid
from sporter
where name=‘张三‘));
第四步:根据运动员编号查找运动员信息
select *
from sporter
where sporterid in(
select sporterid
from grade
where itemid in(
select itemid
from grade
where grade.sporterid=(
select sporterid
from sporter
where name=‘张三‘)))
and name !=‘张三‘;
4. 经查张三因为使用了违禁药品,其成绩都记为0分,请在数据库中作出相应的修改。
update grade set mark=0
where sporterid =(
select sporterid
from sporter
where name=‘张三‘
);
5. 经组委会协商,需要删除女子跳高的比赛项目。
delete from item where itemname=‘女子跳高‘;