--重点推荐使用natural join,inner join!!!,尽量避免使用广义的笛卡尔积
--重点推荐使用natural join,inner join!!!,尽量避免使用广义的笛卡尔积
--重点推荐使用natural join,inner join!!!,尽量避免使用广义的笛卡尔积--设有一个SPJ数据库,
--包括S,P,J,SPJ四个关系模式:--供应商表S(英文全称为:supplier)
--S(SNO,SNAME,STATUS,CITY)
--供应商代码Sno,供应商名称Sname,供应商状态Status,供应商所在城市City--零件表P(英文名称为:Part)
--P(PNO,PNAME,COLOR,WEIGHT)
--Pno零件代码,Pname零件名称,Color零件的颜色,Weight零件的重量--工程项目表J(英文全称为Project,因为之前已经使用了P作为零件的简称,所以这里选择了J作为项目工程表的名字)
--J(JNO,JNAME,CITY)
--工程项目代码Jno,工程项目名称Jname,工程项目所在城市City--供应情况表SPJ(英文全称supplier-part-project)
--SPJ(SNO,PNO,JNO,QTY)
--供应商代码Sno,零件代码Pno,工程项目代码Jno,供应数量Qty/*--供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成;--S(SNO,SNAME,STATUS,CITY)S表SNO  SNAME  STATUS  CITYS1  精益  20  天津S2  盛锡  10  北京S3  东方红  30  北京S4  丰泰盛  20  天津S5  为民  30  上海--零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成;
--P(PNO,PNAME,COLOR,WEIGHT)P表PNO  PNAME  COLOR  WEIGHTP1  螺母  红  12P2  螺栓  绿  17P3  螺丝刀  蓝  14P4  螺丝刀  红  14P5  凸轮  蓝  40P6  齿轮  红  30--工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;
--J(JNO,JNAME,CITY)J表JNO  JNAME  CITYJ1  三建  北京J2  一汽  长春J3  弹簧厂  天津J4  造船厂  天津J5  机车厂  唐山J6  无线电厂  常州J7  半导体厂  南京--供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,
--表示某供应商 供应某种零件 给某工程项目的数量为QTY。
--SPJ(SNO,PNO,JNO,QTY)SPJ表SNO  PNO  JNO  QTYS1  P1  J1  200S1  P1  J3  100S1  P1  J4  700S1  P2  J2  100S2  P3  J1  400S2  P3  J2  200S2  P3  J4  500S2  P3  J5  400S2  P5  J1  400S2  P5  J2  100S3  P1  J1  200S3  P3  J1  200S4  P5  J1  100S4  P6  J3  300S4  P6  J4  200S5  P2  J4  100S5  P3  J1  200S5  P6  J2  200S5  P6  J4  500*/
请根据以上内容完成下面题目,写出相应的SQL语句.
2、创建表
--创建供应商表S
--供应商代码Sno,供应商名称Sname,供应商状态Status,供应商所在城市City
create table S
(Sno char(2) primary key,           --假设供应商代码的长度为定长2Sname varchar2(9) ,--假设供应商的名称最多为三个汉字Status varchar2(3)  not null,--假设供应商供应状态为最多有三个数字City varchar2(15)    not null        --假设城市最长为5个字符的汉字
);            drop table S;
--查询S表的所有信息
select * from S;
--查询表的结构--创建零件P表
--Pno零件代码,Pname零件名称,Color零件的颜色,Weight零件的重量
create table P
(Pno char(2), --假设Pno为2位定长的字符Pname    varchar2(9) not null,    --假设Pname最多有三个汉字Color char(3) check (Color in('红','绿','蓝')), --颜色只能是一个汉字,并且这个字只能为红绿蓝三种中的一种Weight smallint not null,--重量是个整数,并且不能为空constraint PK_P primary key (Pno)
);--删除P表定义及其数据
drop table P;
--查询P表的所有信息
select * from P;--创建工程项目表J表
--工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成;
create table J
(Jno char(2) , --假设工程项目代码是由定长的两位字符组成Jname varchar2(12), --假设工程名称最多为长度为4的汉字组成City varchar2(15), --假设工程项目所在的城市的名称最多含有5个汉字constraint PK_J primary key (Jno)
);--删除J表定义及其数据
drop table J;
--查询J表的所有信息
select * from J;--创建供应情况表SPJ表
--供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成
create table SPJ
(Sno char(2),Pno char(2),Jno char(2),Qty int constraint C1 check(Qty between 0 and 1000),constraint SPJKey primary key(Sno,Pno,Jno),constraint FK_Sno foreign key(Sno) references S(Sno) on delete cascade,constraint FK_Pno foreign key(Pno) references P(Pno) on delete cascade,constraint FK_Jno foreign key(Jno) references J(Jno) on delete cascade
);--删除SPJ表定义及其数据
drop table SPJ;
--查询SPJ表的所有信息
select * from SPJ;--使用该语句可以查询当前数据库的字符编码:我这里是
--SIMPLIFIED CHINESE_CHINA.ZHS16GBK
--如果是UTF-8:则一个汉字占三个字符的大小
--如果是GBK:则一个汉字占两个字符的大小
--为了避免出错:这里我统一按照一个汉字占三个字符的标准(UTF-8)
select userenv('language') from dual;3、插入数据
--向供应商表中插入数据
--向S表中插入数据--S表--   SNO  SNAME  STATUS  CITY--   S1  精益  20  天津--   S2  盛锡  10  北京--   S3  东方红  30  北京--   S4  丰泰盛  20  天津--   S5  为民  30  上海
insert
into S(Sno,Sname,Status,City)
values('S1','精益','20','天津');insert
into S(Sno,Sname,Status,City)
values('S2','盛锡','10','北京');insert
into S(Sno,Sname,Status,City)
values('S3','东方红','30','北京');insert
into S(Sno,Sname,Status,City)
values('S4','丰泰盛','20','天津');insert
into S(Sno,Sname,Status,City)
values('S5','为民','30','上海');select * from S;--向P表中插入有效数据
--P(PNO,PNAME,COLOR,WEIGHT)--P表--PNO  PNAME  COLOR  WEIGHT--P1  螺母  红  12--P2  螺栓  绿  17--P3  螺丝刀  蓝  14--P4  螺丝刀  红  14--P5  凸轮  蓝  40--P6  齿轮  红  30
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);--查询P表中的所有数据
select *
from P;--向J表中插入有效数据
--J(JNO,JNAME,CITY)-- J表--JNO  JNAME  CITY--J1  三建  北京--J2  一汽  长春--J3  弹簧厂  天津--J4  造船厂  天津--J5  机车厂  唐山--J6  无线电厂  常州--J7  半导体厂  南京
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','半导体厂','南京');
--查询J表中的所有数据
select *
from J;--向SPJ表中插入有效数据
--SPJ(SNO,PNO,JNO,QTY)/* SPJ表SNO  PNO  JNO  QTYS1  P1  J1  200S1  P1  J3  100S1  P1  J4  700S1  P2  J2  100S2  P3  J1  400S2  P3  J2  200S2  P3  J4  500S2  P3  J5  400S2  P5  J1  400S2  P5  J2  100S3  P1  J1  200S3  P3  J1  200S4  P5  J1  100S4  P6  J3  300S4  P6  J4  200S5  P2  J4  100S5  P3  J1  200S5  P6  J2  200S5  P6  J4  500*/
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);--查询SPJ表中的所有数据
select *
from SPJ;--查询S表中的所有数据
select *
from S;
--查询P表中的所有数据
select *
from P;
--查询J表中的所有数据
select *
from J;
--查询SPJ表中的所有数据
select *
from SPJ;
4、请用SQL语句完成下面题目的查询。
(1)求供应工程J1零件的供应商号码SNO:
select Sno
from SPJ
where Jno='J1';--可以使用distinct关键字去掉重复的元组
select distinct Sno
from SPJ
where Jno='J1';
(2)求供应工程J1零件P1的供应商号码SNO:
select Sno
from SPJ
where Jno='J1' and Pno='P1';
(3)求供应工程J1零件为红色的供应商号码SNO:
--这时候我们发现这里涉及到供应商代码Sno,供应工程Jno,这两个字段处于SPJ表中
--而零件的颜色在P表中出现,在其他的表中都没有出现,这时候就需要使用多表的连接查询--使用子查询来实现对该条件的查询
--关键分析过程:显然这种做法最后得到的结果是不正确的.
--1.首先在SPJ表中确定供应工程J1零件的零件代码Pno得到一个结果集
select distinct Pno
from SPJ
where Jno='J1';
--2.然后在P表中筛选出零件的颜色为红色的零件的零件号(从上面得到的结果集中进行筛选)
select Pno
from P
where Color='红' and Pno in (select distinct Pno from SPJwhere Jno='J1');
--3.因为最后需要得到的字段是Sno,我们有了Pno需要得到Sno,
--这时候我们可以在SPJ表中根据Pno的值查找出对应的Sno字段
select distinct Sno
from SPJ
where Pno in (select Pnofrom Pwhere Color='红' and Pno in (select distinct Pno from SPJwhere Jno='J1'))
--显然这种方式得到的结果也是正确的:
--因为目标列是要得到SPJ.Sno--那么久说明了有时候的多表查询是不能够使用子查询进行替换的,
--表面上看上去是相同的,但是可能不是等价的替换--方式一:使用等值连接实现该查询要求
--这种使用广义的笛卡尔积的方式我们是需要极力避免的方式.
--分析关键过程:
--1.涉及到的数据表供应商供应情况表SPJ和零件表P
--2.将供应商供应情况表SPJ和零件表P表进行内连接
--3.确定连接时的关联字段SPJ表和P表的关联字段为Pno
select  distinct  SPJ.Sno
from SPJ,P
where SPJ.Jno='J1' and SPJ.Pno=P.Pno and Color='红';--方式二:使用inner join关键字来实现该查询要求:
select    Sno
from P inner join SPJ
on SPJ.Pno=P.Pno and Jno='J1' and Color='红';--根据目标列进行投影的时候发现出现了重复的元组,这时候可以使用distinct关键去掉重复的元组
select distinct Sno
from P inner join SPJ
on SPJ.Pno=P.Pno and Jno='J1' and Color='红';--方式三:使用自然连接来实现该查询要求:
select Sno
from P natural join SPJ
where Jno='J1'  and Color='红';--使用distinct关键字去掉重复的元组
select distinct Sno
from P natural join SPJ
where Jno='J1' and Color='红';--方式四:使用子查询和in关键字来实现该查询条件
--1.首先在P表中确定零件的颜色(颜色字段只是在P表中出现)为红色的零件的零件号Pno
select Pno
from P
where Color='红';
--2.然后需要在SPJ表中查询供应工程代码为J1的并且该它的零件的颜色为红色的那些元组的Sno值
select Sno
from SPJ
where Jno='J1' and Pno in(select Pnofrom Pwhere Color='红');--方法五:使用子查询和exist关键字来实现该查询条件
select distinct Sno
from SPJ where Jno = 'J1' and exists (select Pno from P where color = '红' and P.Pno = SPJ.Pno);(4)求没有使用天津供应商生产的红色零件的工程号JNO:
--分析过程:
--如果我们将工程代码的所有取值看成全集的话
--那么使用了天津供应商生产的零件的工程代码的取值构成集合A,
--使用的红色零件的工程代码的取值构成集合B,
--那么使用了天津供应商生产的红色零件的工程代码的取值为集合C
--那么我们可以得到:C=A∩B
--那么没有使用天津供应商生产的红色零件的工程代码的取值应该为:
--U-(A∩B)--方式一:
--首先我们查询出使用天津供应商生产的红色零件的工程号JNO
--这种方式其实只是在显示上消除了笛卡尔积的问题,
--但是笛卡尔积的情况依然是存在的,因为数据库的查询机制
--是逐行进行查询的,实际上的笛卡尔积依然是存在的.select distinct Jno
from S,P,SPJ
where S.Sno=SPJ.Sno and P.Pno=SPJ.Pno
and City='天津' and Color='红';--然后查询出没有使用天津供应商生产的红色零件的工程号JNO
select  Jno
from J
where Jno not in (select  Jnofrom S,P,SPJwhere S.Sno=SPJ.Sno and P.Pno=SPJ.Pnoand City='天津' and Color='红');--在内层查询的时候我们可以去掉重复的元组来提升外层查询的速度
--然后查询出没有使用天津供应商生产的红色零件的工程号JNO
select  Jno
from J
where Jno not in (select  distinct Jnofrom S,P,SPJwhere S.Sno=SPJ.Sno and P.Pno=SPJ.Pnoand City='天津' and Color='红');--我开始采用的是这种方式:
--其实我实际上是想将S表,P表,SPJ表使用S.Sno=SPJ.Sno
--和P.Pno=SPJ.Sno等条件将S表,P表,SPJ表进行内连接,
--但是使用下面这种方式是不能够达到这种想法的:
--下面这种写法:将S表和SPJ表进行内连接,将P表和SPJ表进行内连接,
--然后将S表和SPJ表进行内连接得到的表与将P表和SPJ表进行内连接得到的表
--进行笛卡尔积.这样显然和上面我的想法是不同的.这样得到的记录数是19*19=361;
select *
from S inner join SPJ on S.Sno=SPJ.Sno,
SPJ  inner  join P on P.Pno=SPJ.Pno--并且这个时候我按照这个查询语句进行查询的时候会提示
--:ORA-00918: 未明确定义列
--这里的原因是:
--1.将S表和SPJ表进行内连接,-->得到19行记录,这里面包含一个SPJ.Jno
--2.将P表和SPJ表进行内连接,-->得到19行记录,这里面包含一个SPJ.Jno
--3.将上面的两个内连接的做广义的笛卡尔积,得到19*19=361行记录
--在这种情况下使用select Jno显然是不行的,最后得到的表中有两个Jno
--并且这两个Jno的所属都是SPJ表,这时显然是不能确定需要查询出那个字段--我开始没理解的时候还是用了select SPJ.Jno,发现这样也是不行的
--原因是最后得到的表中的Jno的所属都是SPJ,这时候显然是不能够确定
--需要将那个字段查询出来的.
--虽然这种方式是不可行的,但是我觉得还是应该将理由想清楚.
select  Jno
from J
where Jno not in (select *from S inner join SPJ on S.Sno=SPJ.Sno,SPJ  inner  join P on P.Pno=SPJ.Pnowhere S.City='天津' and P.Color='红');--错误方式二:
--ORA-00905: 缺失关键字
--我开始是这么写过,始终想不明白一直报错:缺失关键字
--后来才发现不能这么写:这说明inner join ...on..(join和on是成对出现的)
select Jno
from J
where Jno not in(select distinct Jnofrom S inner join SPJ inner  join P on  SPJ.Pno=P.Pno and S.Sno=SPJ.Sno where City='天津'  and Color='红');--方式二:使用内连接inner join来实现该查询要求:
--首先我们查询出使用天津供应商生产的红色零件的工程号JNO
select distinct Jnofrom S inner join SPJ on S.Sno=SPJ.Sno inner  join P on  SPJ.Pno=P.Pnowhere City='天津'  and Color='红';--然后查询出没有使用天津供应商生产的红色零件的工程号JNO
select Jno
from J
where Jno not in(select distinct Jnofrom S inner join SPJ on S.Sno=SPJ.Sno inner  join P on  SPJ.Pno=P.Pnowhere City='天津'  and Color='红');
--方式三:使用自然连接natural join 来实现该查询要求
--使用自然连接可以消除重属性名的属性列.推荐使用这种方式
--首先我们查询出使用天津供应商生产的红色零件的工程号JNO
select  distinct Jno
from S natural  join P natural join  SPJ
where City='天津'  and Color='红';--然后查询出没有使用天津供应商生产的红色零件的工程号JNO
select Jno
from J
where Jno not in(select Jnofrom S natural join P natural join SPJwhere City='天津' and Color='红');
--使用内连接方式就是按照关联字段来进行连接,连接完成之后会去掉重属性名的列
--如果将两个没有相同属性名的数据表进行natural join 也会成功.
--只是此时是将这两个表做笛卡尔积
select *
from S natural join P;select *
from S natural join J;--方式四:使用子查询和exists配合使用实现该查询要求:
select distinct Jno from J where not exists (
select Jno from SPJ natural join P natural join P where City = '天津' and Color = '红'
and SPJ.Jno=J.Jno); --方式五:使用子查询和exist配合使用实现该查询要求:
select distinct Jno
from J
where Jno not in ( select Jno from SPJwhere Sno in (select Sno from S where City = '天津') and Pno in (select Pno from P where Color = '红'));(5)求至少用了供应商S1所供应的全部零件的工程号JNO:
--此题比较难以理解:
--方式一:使用子查询和exists关键字
select distinct jno
from spj spjx
where not exists (select pno from spj where sno = 'S1' and pno not in( select pno from spj where jno = spjx.jno));
--方式二:使用子查询和exists关键字
select distinct jno
from spj spjx
where not exists(select * from spj spjy where sno = 'S1' and not exists(select *from spj where jno = spjx.jno and pno = spjy.pno));5、请用SQL语句完成下面题目的查询。
--重点推荐使用natural join,inner join!!!,尽量避免使用广义的笛卡尔积
--重点推荐使用natural join,inner join!!!,尽量避免使用广义的笛卡尔积
--重点推荐使用natural join,inner join!!!,尽量避免使用广义的笛卡尔积
--只涉及到单张表的简单查询:
(1)找出所有供应商的姓名和所在城市。
select Sname,City
from S;
(2)找出所有零件的名称、颜色、重量。
select Pname,Color,Weight
from P;
(3)找出使用供应商S1所供应零件的工程号码。
select Jno
from SPJ
where Sno='S1';
--涉及到多张表的连接查询或者子查询
(4)找出工程项目J2使用的各种零件的名称及其数量。
--方式一:使用消除笛卡尔积的方式
select Pname,Qty
from P,SPJ
where P.Pno=SPJ.Pno and Jno='J2';
--方式二:使用内连接的方式实现该查询要求:
select Pname,Qty
from P inner join SPJ on P.Pno=SPJ.Pno
where Jno='J2';--上面的那种方式也可以省略inner
select Pname,Qty
from P join SPJ on P.Pno=SPJ.Pno
where Jno='J2';
--方式三:使用自然连接的方式实现该查询要求:
--在使用自然连接的时候我们不需要指定连接条件
--它会按照表的相同字段来进行连接,并去掉重复的属性列
select Pname,Qty
from P natural join SPJ
where Jno='J2';
(5)找出上海厂商供应的所有零件号码。
--方式一:消除的笛卡尔积:效率较低
select distinct Pno
from S,SPJ
where S.Sno=SPJ.Sno and S.City='上海';--方式二:使用内连接inner join来实现
select distinct Pno
from S inner join SPJ on S.Sno=SPJ.Sno
where S.City='上海';--方式三:使用自然连接实现该查询要求:推荐使用这种方式
select distinct Pno
from S natural join SPJ
where S.City='上海';--方式四:使用子查询和in关键字来实现该查询
--首先查询出上海供应商的供应商代码
select Sno
from S
where S.City='上海';
--然后查询出使用上海供应商的零件号
select Pno
from SPJ
where Sno in(select Snofrom Swhere S.City='上海');--方式五:使用子查询和exist关键字来实现该查询
select distinct Pno
from SPJ where exists (select Snofrom S where City = '上海'and S.Sno = SPJ.Sno);
(6)找出使用上海产的零件的工程名称。
--方式一:使用消除笛卡尔积的方式实现子查询
select distinct Jname
from S,J,SPJ
where S.Sno=SPJ.Sno and J.Jno=SPJ.Jno and S.City='上海';--方式二:使用内连接的方式来实现该查询
select distinct Jname
from S inner join SPJ on S.Sno=SPJ.Sno inner join J on SPJ.Jno=J.Jno
where  S.City='上海';--使用内连接的时候join关键字可以省略
select distinct Jname
from S join SPJ on S.Sno=SPJ.Sno  join J on SPJ.Jno=J.Jno
where  S.City='上海';--方式三:使用自然连接的方式实现该查询
--这里不能够使用自然连接?NATURAL JOIN
--注意 j 和 s 表都有属性 city
--select Jname
--from S natural join SPJ on S.Sno=SPJ.Sno natural join J on SPJ.Jno=J.Jno
--where S.City='上海';--select *
--from S natural join J;--select S.*,J.*
--from S natural join SPJ  natural join J
--where S.City='上海';--方式三:使用子查询来实现该子查询
--首先在S表中确定供应商城市为上海的供应商代码
select distinct Sno
from S
where S.City='上海';--然后根据已知的Sno在SPJ表确定生产的工程代码Jno
select distinct Jno
from SPJ
where Sno in (select Snofrom Swhere S.City='上海');--最后根据已知的Jno在J表中确定工程名称Jname
select Jname
from J
where Jno in (select distinct Jnofrom SPJwhere Sno in(select Snofrom Swhere S.City='上海'));    --方式四:使用子查询和exists关键字来实现该子查询
select distinct jname
from j
where exists(select * from spj natural join swhere city = '上海' and jno = j.jno);
(7)找出没有使用天津产的零件的工程号码。
--我们可以先找出使用了天津产的零件的工程号码,
--方式一:使用消除笛卡尔积的方式
select distinct Jno
from S,SPJ
where S.Sno=SPJ.Sno and City='天津';
--然后使用整个的工程代码集合减去上面的工程号码
select Jno
from J
where Jno not in(select Jnofrom S,SPJwhere S.Sno=SPJ.Sno and City='天津');--方式二:使用内连接的方式实现该查询
--我们可以先找出使用了天津产的零件的工程号码,
select distinct Jno
from S inner join SPJ on S.Sno=SPJ.Sno
where City='天津';--然后使用整个工程代码集合减去上面的工程代码
select Jno
from J
where Jno not in(select distinct Jnofrom S inner join SPJ on S.Sno=SPJ.Snowhere City='天津');--方式三:使用自然连接来实现该查询要求
--我们可以先找出使用了天津产的零件的工程代码,
select Jno
from S natural join SPJ
where City='天津';
--然后使用整个工程代码集合减去上面的工程代码集合
select Jno
from J
where Jno not in(select Jnofrom S natural join SPJwhere City='天津');--方式四:使用子查询和in关键字来实现该子查询
--我们首先可以使用供应商城市为天津在S表中得到供应商代码Sno
select distinct Sno
from S
where City='天津';
--然后根据已知的Sno在SPJ表中查询工程代码Jno
select distinct Jno
from SPJ
where Sno in(select distinct Snofrom Swhere City='天津');--最后使用整个的工程代码的集合减去满足条件的工程代码集合
select Jno
from J
where Jno not in(select distinct Jnofrom SPJwhere Sno in (select distinct Snofrom Swhere City='天津'));--方式五:使用子查询和exists关键字来实现查询
--这里用的是SPJ表中Jno减去的,不考虑没有使用零件的工程
select distinct Jno
from SPJ SPJX
where not exists (select Jno from SPJ natural join swhere City = '天津' and Jno = SPJX.Jno);(8)把全部红色零件的颜色改成蓝色。
--更新操作
update P
set Color='蓝'
where Color='红';--检查是否更改
select *
from P;
(9)由S5供给J4的零件P6改为由S3供应。
--更新操作
update SPJ
set Sno='S3'
where Sno='S5' and Pno='P6' and Jno='J4';--检查是否更改
select * from SPJ;
(10)从供应商关系中删除供应商号是S2的记录,并从供应情况关系中删除相应的记录。
--删除操作
--从供应商关系中删除供应商号是S2的记录
delete from S
where Sno='S2';insert
into S(Sno,Sname,Status,City)
values('S2','盛锡','10','北京');delete from SPJ
where Sno='S2';select * from S;
select * from P;
select * from J;
select * from SPJ;
--从这个例子可以看出oracle数据库默认选择的删除是级联删除
--在删除S表中指定被引用的元组时,同时也会删除SPJ表中相关的元组
--供应情况关系中删除相应的记录
(11)请将(S2,J6,P4,200)插入供应情况关系。
--插入操作
insert
into SPJ values('S2','P4','J6',200);
6、请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。
--创建供应情况的视图
create view S_P_J(Sno,Pno,Qty)
as
select Sno,Pno,Qty
from SPJ;--查询视图
select * from S_P_J;针对该视图完成下列查询:
(1)找出三建工程项目使用的各种零件代码及其数量
--方式一:创建视图,查询子句使用消除笛卡尔积的方式
create view Project_Infor
as
select distinct Pno,SPJ.Qty
from J,SPJ
where J.Jno=SPJ.Jno and Jname='三建';--方式二:创建视图,查询子句使用内连接的方式
create view Project_Infor
as
select distinct SPJ.Pno,SPJ.Qty
from J inner join SPJ on J.Jno=SPJ.Jno
where Jname='三建';--方式三:创建视图,查询子句使用自然连接的方式
create view Project_Infor
as
select distinct Pno,Qty
from J natural join SPJ
where Jname='三建';--方式四:创建试图,查询子句使用子查询和in关键字来实现
create view Project_Infor
as
select distinct Pno,Qty
from SPJ
where Jno in(select Jnofrom Jwhere Jname='三建');--首先在J表中根据Jname='三建'查询出Jno
select Jno
from J
where Jname='三建';--然后根据已知的Jno集合在SPJ表中确定Pno,Qty
select distinct Pno,Qty
from SPJ
where Jno in(select Jnofrom Jwhere Jname='三建');
--查询视图
select * from Project_Infor;
--删除视图
drop view Project_Infor;
(2)找出供应商S1的供应情况
--创建视图
create view S1_Infor
as
select *
from SPJ
where Sno='S1';--查询视图
select * from S1_Infor;--删除视图
drop view S1_Infor;

数据库SQL查询练习相关推荐

  1. Python学习日志16 - 数据库SQL查询

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志16课 - 数据库SQL查询 DQL ...

  2. 视频教程-数据库SQL查询,最佳案例讲解-SQL Server

    数据库SQL查询,最佳案例讲解 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥19.00 立即订阅 ...

  3. WordPress 常用数据库SQL查询语句大全

    https://www.wpdaxue.com/wordpress-sql.html 在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容 ...

  4. PostgreSQL数据库sql查询如何获取汉字拼音首字母

    一.前言 在实际开发过程中,经常会使用模糊查询,根据某个关键字模糊搜索,一般是 name like '%123%' 这样查,但是如果某个关键字用户不记得呢,只知道首字母,又如何模糊查询呢?例如,查询 ...

  5. [数据库] SQL查询语句表行列转换及一行数据转换成两列

    本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法.子查询的应用.decode函数的用法.希望文章对你有所帮助~ 1.创建数据库表及插入数据 2.子查询统计不同 ...

  6. Oracle数据库SQL查询结果去重——ROW_NUMBER() OVER

    完整SQL selectcxsj,zs,djjg,row_flag from (selectplcx.QUERY_START_DATE || ' 至 ' || plcx.QUERY_END_DATE ...

  7. 各数据库SQL查询结果多行数据合并成一行

    SQL查询结果多行数据合并成一行 一.Oracle函数多行数据合并成一行 二.Mysql函数多行数据合并成一行 三.sqlserver函数多行数据合并成一行 四.postgresql函数多行数据合并成 ...

  8. oracle数据库sql查询,oracle数据库中常用经典SQL查询

    2010-06-03 14:25:15 来自 --1.查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_ ...

  9. 一个数据库SQL查询的数次轮回

    本文译自:http://coding-geek.com/how-databases-work 我们使用数据库,直观感受上是客户端发送一个 SQL,数据库把这个SQL执行一下,查出来数据返回给客户端.但 ...

最新文章

  1. Java并发面试,幸亏有点道行,不然又被忽悠了
  2. CF908D New Year and Arbitrary Arrangement
  3. FreeBSD 8.0候选版本RC3发布
  4. IDEA配置自定义maven库
  5. 即使总和【杭州电-2015】 附加题
  6. 多个18B20组成测温系统
  7. Vuex 入门前的小菜 - “Vue 中的简单状态共享机制实现”
  8. oracle忘记密码,修改密码
  9. [译]如何在visual studio中调试Javascript
  10. 图像还可以这样玩!如何用OpenCV处理图像?
  11. c语言程序设计数据存储方案,c语言程序设计“第02章数据的存储及运算.ppt
  12. 学位论文多级标题编号与图表编号
  13. 一加8T真机渲染图泄露:后置四摄+双闪光灯
  14. 分享2个第三方社会化分享按钮及分享工具
  15. Observer(观察者)模式
  16. C++中的模板template typename T
  17. 威纶通触摸屏做主站(客户端)与modsim虚拟从站通过MODBUS TCP/IP通讯测试
  18. linux截屏 保存目录,linux设置截屏图片的保存路径
  19. 我的世界服务器皮肤文件夹在哪里,我的世界青龙皮肤文件,启动侠皮肤文件夹在哪个文件夹...
  20. 力扣多线程练习----交替打印FooBar---打印零与奇偶数

热门文章

  1. 登录界面——渗你千千万万遍
  2. 如何判断高估还是低估
  3. c语言设计题目代码,C语言课程的设计题目.doc
  4. app毕业设计 基于uni-app框架商城app、图书商城app毕设题目课题选题作品(2)后台管理功能
  5. 字节跳动实习校招社招内推
  6. 解决Macbook双系统 找不到麦克风问题
  7. 使用计算机的目标要求,【热门】计算机教学计划三篇
  8. 【全基因组关联分析GWAS专题1】——群体结构
  9. 一篇难得的关于傅里叶分析的好文
  10. mac删除分区并合并分区