本题目要求编写SQL语句,在SPJ
数据库中,查询供应工程号为j1
的供应商号 sno
提示:请使用SELECT语句作答。
表结构:
CREATE TABLE j (
jno char(3) NOT NULL, -- 工程项目号
jname varchar(10) DEFAULT NULL,
city varchar(10) DEFAULT NULL,
PRIMARY KEY ( jno )
) ;
CREATE TABLE p (
pno char(3) NOT NULL, -- 零件号
pname varchar(10) DEFAULT NULL,
color char(2) DEFAULT NULL,
weight smallint DEFAULT NULL,
PRIMARY KEY ( pno )
) ;
CREATE TABLE s (
sno char(3) NOT NULL, -- 供应商号
sname varchar(10) DEFAULT NULL,
status char(2) DEFAULT NULL,
city varchar(10) DEFAULT NULL,
PRIMARY KEY ( sno )
) ;
CREATE TABLE spj (
sno char(3) NOT NULL,
pno char(3) NOT NULL,
jno char(3) NOT NULL,
qty smallint DEFAULT NULL,
PRIMARY KEY ( sno , pno , jno ),
CONSTRAINT fk_jno FOREIGN KEY ( jno ) REFERENCES j ( jno ),
CONSTRAINT fk_pno FOREIGN KEY ( pno ) REFERENCES p ( pno ),
CONSTRAINT fk_sno FOREIGN KEY ( sno ) REFERENCES s ( sno )
);
表样例:
s表:
p表:
j表:
spj表:
输出样例:
思路1:
多个供应商可能供应多个零件给多个工程,所以我们不想在结果中重复列出相同的供应商号。因此可以使用关键字distinct消除结果中的重复行(也就是去除笛卡尔积),所以就是select distinct sno,,这里可能有人会问为什么不是select distinct jno??首先jno我们已经指定条件了:jno='j1',如果在distinct jno会显的逻辑不通,其次我们的目的是查询供应工程号为j1的供应商号 sno
,也就是我们应该关注的焦点在于供应商号(而不需要关注其他细节,例如s3给j1供应了100的物件,然后s3又给j1供应了200的物件,而我们此时只需要关注的是有哪几个j1对应的供应商号,所以需要对sno去重,不需要额外关注其他细节),因此select distinct sno,然后加上from来自哪张表??spj,,最后加上条件where jno='j1',完整代码如下:
select distinct sno
from spj
where jno='j1';
思路2:
子查询,要想查到供应工程号为j1
的供应商号 sno,我们首先需要先在s表中查到供应商号的信息sno,select sno from s sno即可,接着通过sno的信息去定位j1,完整代码如下:
select sno
from s
where sno in (
select sno
from spj
where jno = 'j1'
);
思路3:
使用多表连接,把s
(供应商表)、spj
(供应零件表)和j
(工程项目表)三张表连接起来,连接条件是s.sno=spj.sno,,j.jno=spj.jno,,同思路1一样还是使用distinct把重复行去除掉。
select distinct spj.sno
from s
join spj
on s.sno = spj.sno
join j
on j.jno = spj.jno
where j.jno = 'j1';
我是阿杰,一名正在努力学习编程的在校大学生,如果你喜欢我的内容,或者有帮助到你,请点赞鼓励支持一下吧!
更多技术与交流请关注微信公众号:阿杰技术栈