本博文所用sql语句均在oracle环境下测试通过
设有一个SPJ数据库,包含S,P,J,SPJ 4个关系模型
S(SNO,SName,Status,City);
P(Pno,Pname,Color,Weight);
J(Jno,Jname,City);
SPJ(Sno,Pno,Jno,Qty);
供应商表S由供应商表Sno,供应商姓名Sname,供应商状态Status,供应商所在城市City组成。
零件表P由零件代码Pno,零件名Pname,颜色Color,重量Weight组成。
工程项目表J由工程项目代码JNO,工程项目名JNAME,工程项目所在城市CITY组成。
供应商情况表SPJ由供应商代码SNO,零件代码PNO,工程项目代码JNO,供应数量QTY组成。
今有若干数据如下:
//建立S表
create table S
( Sno VARCHAR(4) constraint pk_S primary key,
Sname VARCHAR(10) not NULL,
Status NUMBER(2),
City VARCHAR(7)
);
INSERT into S VALUES('S1','精益','20','天津');
INSERT into S values ('S2','盛锡','10','北京');
INSERT into S VALUES ('S3','东方红','30','北京');
INSERT into S values ('S4','丰泰盛','20','天津');
INSERT into S values ('S5','为民','30','上海');
//建立P表
create table P
( Pno VARCHAR(4) constraint pk_P primary key,
Pname VARCHAR(6) not null,
Color VARCHAR(2) check (Color in('红','黄','绿','蓝','紫')),
Weight NUMBER(2) Constraint ck_P check(Weight>=0)
);
INSERT into P(Pno,Pname,Color,Weight) VALUES ('P1','螺母','红','12');
INSERT into P(Pno,Pname,Color,Weight) VALUES ('P2','螺栓','绿','17');
INSERT into P(Pno,Pname,Color,Weight) VALUES ('P3','螺丝刀','蓝','14');
INSERT into P(Pno,Pname,Color,Weight) VALUES ('P4','螺丝刀','红','14');
INSERT into P(Pno,Pname,Color,Weight) VALUES ('P5','凸轮','蓝','40');
INSERT into P(Pno,Pname,Color,Weight) VALUES ('P6','齿轮','红','30');
//建立J表
create table J
( Jno VARCHAR(2) primary key,
Jname VARCHAR(4) not NULL,
City VARCHAR(10) not NULL
);
INSERT into J(Jno,Jname,City) VALUES('J1','三建','北京');
INSERT into J(Jno,Jname,City) VALUES('J2','一汽','长春');
INSERT into J(Jno,Jname,City) VALUES('J3','弹簧厂','天津');
INSERT into J(Jno,Jname,City) VALUES('J4','造船厂','天津');
INSERT into J(Jno,Jname,City) VALUES('J5','机车厂','唐山');
INSERT into J(Jno,Jname,City) VALUES('J6','无线电厂','常州');
INSERT into J(Jno,Jname,City) VALUES('J7','半导体厂','南京');
//建立SPJ表
create table SPJ
(Sno VARCHAR(4),
Pno VARCHAR(4),
Jno VARCHAR(2),
Qty NUMBER(10) CHECK(Qty>=0),
constraint pk_SPJ primary key (Pno,Sno,Jno),
Constraint fk_S Foreign key(Sno) references S(Sno),
Constraint fk_P Foreign key(Pno) references P(Pno),
Constraint fk_J Foreign key(Jno) references J(Jno)
);
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S1','P1','J1','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S1','P1','J3','100');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S1','P1','J4','700');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S1','P2','J2','100');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S2','P3','J1','400');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S2','P3','J2','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S2','P3','J4','500');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S2','P3','J5','400');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S2','P5','J1','400');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S2','P5','J2','100');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S3','P1','J1','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S3','P3','J1','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S4','P5','J1','100');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S4','P6','J3','300');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S4','P6','J4','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S5','P2','J4','100');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S5','P3','J1','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S5','P6','J2','200');
INSERT into SPJ(Sno,Pno,Jno,Qty) VALUES('S5','P6','J4','500');
试用SQL完成下列操作
(1)找出所有供应商的姓名和所在城市
select Sname,city from S;
(2)找出所有零件的名称,颜色,重量
select Pname,color,Weight from P;
(3)找出使用供应商S1所供给零件的工程号码
//连接
select J.Jno from J,SPJ WHERE
SPJ.Sno = 'S1' AND J.jno= Spj.jno;
//子查询
select Jno from J where JNO
in (select Jno from SPJ where Sno = 'S1');
(4)找出工程项目J2使用的各种零件的名称及其数量
select Pno,Qty from SPJ where JNO = 'J2';
(5)找出上海厂商供应的所有零件号码
select Pno from P where Pno
in(select pno from SPj where Sno
in (select Sno from S where City = '上海')
);
(6)找出使用上海产的零件的工程名称
select DISTINCT Jno from SPJ where Sno
in (select Sno from S where city = '上海'
);
(7)找出没有使用天津产的零件的工程号码
select Jno from J where not EXISTS
(select * from P,SPJ where City = '天津' AND SPJ.Pno = P.Pno);
(8)把全部红色的零件改为蓝色
update table P set color = '蓝' where color = '红';
(9)由S5供应J4的零件P6改由S3供应,做出必要修改
update SPJ set Sno = 'S3'
where Jno = 'J4' AND Pno = 'P6' AND Sno = 'S5';
(10)从供应商关系中删除S2的记录,并从供应情况关系中删除相应的记录
先删除外键的SPJ表,再删除S表中相关记录
DELETE from SPJ where SPJ.Sno = 'S2';
DELETE from S where S.Sno = 'S2';
(11)请将(S1,J6,P4,200)插入到SPJ表中
INSERT into SPJ(Sno,Jno,Pno,Qty) VALUES ('S1','J6','P4','200');