建表、更新、查询综合练习

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

        运动员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;

 


数据操作

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

    确定要使用的数据表:

    |-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='女子跳高';

        

    

本文出自 “10281302” 博客,转载请与作者联系!

你可能感兴趣的:(更新,建表,查询综合练习)