当前位置:数据库 > Oracle >>

Oracle的关于建表,约束,查询等的练习

Oracle的关于建表,约束,查询等的练习
 
从建立一个简单表,到实现一些复杂查询的例子,
DROP TABLE grade;
DROP TABLE item;
DROP TABLE sporter;
CREATE TABLE sporter(
 sporterid NUMBER(4) PRIMARY KEY NOT NULL,
 name  VARCHAR(50) NOT NULL,
 易做图  VARCHAR(2) NOT NULL,
 department VARCHAR(30) NOT NULL,
 CONSTRAINT sporter_易做图_CK CHECK(易做图 IN('男','女'))
);



CREATE TABLE item(
 itemid  VARCHAR(4) PRIMARY KEY NOT NULL,
 itemname VARCHAR(50) NOT NULL,
 location VARCHAR(50) NOT NULL
);

CREATE TABLE grade(
 sporterid NUMBER(4),
 itemid  VARCHAR(4),
 mark  NUMBER(2),
 CONSTRAINT sport_grade_sporterid_fk FOREIGN KEY(sporterid) REFERENCES sporter(sporterid) ON DELETE CASCADE,
 CONSTRAINT item_grade_sporterid_fk FOREIGN KEY(itemid) REFERENCES item(itemid) ON DELETE CASCADE,
 CONSTRAINT grade_mark_CK CHECK(mark IN (6,4,2,0))
);

-- 测试数据

INSERT INTO sporter(sporterid,name,易做图,department)
 VALUES(1001,'李明','男','计算机系');
INSERT INTO sporter(sporterid,name,易做图,department)
 VALUES(1002,'王二','男','数学系');
INSERT INTO sporter(sporterid,name,易做图,department)
 VALUES(1003,'张三','男','计算机系');
INSERT INTO sporter(sporterid,name,易做图,department)
 VALUES(1004,'李四','男','物理系');
INSERT INTO sporter(sporterid,name,易做图,department)
 VALUES(1005,'李娜','女','心理系');
INSERT INTO sporter(sporterid,name,易做图,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);

 

 
要求:
1.求出目前总积分最高的系名,及其积分:
·所有的系名都在SPORTERID表之中
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
;

·不使用ROWNUM
 ·求出最大的分数值
 SELECT MAX(SUM(g.mark)) max
 FROM sporter s,grade g
 WHERE s.sporterid=g.sporterid
 GROUP BY s.department
 ·把上面的最大分数值作为子查询作为子查询
 SELECT t.* FROM (
  SELECT s.department de,SUM(g.mark) sum
  FROM sporter s,grade g
  WHERE s.sporterid=g.sporterid
  GROUP BY s.department
  ORDER BY sum DESC) t
 WHERE t.sum=(
  SELECT MAX(SUM(g.mark)) max
  FROM sporter s,grade g
  WHERE s.sporterid=g.sporterid
  GROUP BY s.department)
 ;

 

 
 
2.找出在二操场进行比赛的各个项目名称,及其冠军的姓名
·求出最高成绩的 项目ID 和 分数 
SELECT i.itemname,s.name,g.mark
FROM item i,grade g,sporter s
WHERE i.location='二操场'
AND i.itemid=g.itemid
AND s.sporterid=g.sporterid
;
·根据最高分得出
SELECT i.itemname,s.name,g.mark
FROM item i,grade g,sporter s
WHERE i.location='二操场'
AND i.itemid=g.itemid
AND s.sporterid=g.sporterid
AND g.mark IN(
 SELECT MAX(mark) FROM (
 SELECT i.itemname itemname,s.name name,g.mark mark
 FROM item i,grade g,sporter s
 WHERE i.location='二操场'
 AND i.itemid=g.itemid
 AND s.sporterid=g.sporterid
 )GROUP BY itemname
)
;

 

 
 
3.找出参加了张三所参加过的项目的其他同学的姓名
SELECT DISTINCT s.name FROM sporter s,grade g 
WHERE s.sporterid=g.sporterid
AND s.name<>'张三'
AND g.itemid IN (
 SELECT g.itemid
 FROM sporter s,grade g
 WHERE s.sporterid=g.sporterid
 AND s.name='张三'
)
;

 

 
4.经查张三因为使用了违禁药品,其成绩都记为0分,做出修改
UPDATE grade SET mark=0
WHERE sporterid=(
 SELECT sporterid FROM sporter WHERE name='张三'
);

 

 
 
5.取消山粗女子跳高比赛项目
DELETE FROM item WHERE itemname='女子跳高';

 


CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,