SQL除法代码详解
- 前言
- 一、除运算(关系代数)
- 二、第一题:
- 2.1导入数据到SQL Server:
- 2.2理解:
- 2.2.1代码:
- 2.2.2↑代码理解和答案:
- 三、第二题:求使用了同“供应商S1所供应的全部零件”相同零件的工程号JNO
- 3.1导入数据到SQL Server:
- 3.2理解:
- 3.2.1代码:
- 3.2.2答案:
前言
话不多说,直接举例,理解更快。
一、除运算(关系代数)
以上举了两个例子,待会也是我要解释的。
第一题和第二题较大的不同就是除法右边的部分。T理解为需要被左边整除的部分。而第二题的∏PNO(σSNO=’S1’(SPJ))意思也同样,不过要先求出这个除数是什么。
二、第一题:
2.1导入数据到SQL Server:
create table R
(
A varchar(2),
B varchar(2),
C varchar(2)
)
insert into R values
('a1','b1','c2'),
('a2','b3','c7'),
('a3','b4','c6'),
('a1','b2','c3'),
('a4','b6','c6'),
('a2','b2','c3'),
('a1','b2','c1');
create table T
(
B varchar(2),
C varchar(2),
D varchar(2)
)
insert into T values
('b1','c2','d1'),
('b2','c1','d1'),
('b2','c3','d2');
2.2理解:
由关系代数“∏A( R) ÷T”可知,表T是已知数,关键在÷号的代码理解和书写。这里我们用not exists来做除法查询运算。——双重否定为肯定
表R和表T中,只有B、C字段是相同的,又因为表T是除数,所有比较时只用到A\B\C字段。
2.2.1代码:
select distinct A from R R1
where not exists
(select B,C from Twhere not exists (select * from R R2where R2.A=R1.A and R2.B=T.B and R2.C=T.C)
);
2.2.2↑代码理解和答案:
not exists:括号内查询结果不存在为真(exists:括号内查询存在为真)。每一个括号都相当于一个while循环,每个元组都会被判断并输出true或false结果给上一层循环使用。
先从外 往 里看意思:
代码第一层不解释,就是求A字段(注意别名R1)。
嵌套第二层:列出B、C字段,也很好理解(其实这里写成select 1 form T也是一样的,这里不做进一步解释)
嵌套第三层:构造一个新表,其中字段有A、B、C,每个元组的B、C分量在表R表T中都存在。
再从里 往 外看结果:
第三步返回a1(distinct不显示重复元组)。
∵a1的象集与除数表T的B、C分量一一对应,∴解得:a1
三、第二题:求使用了同“供应商S1所供应的全部零件”相同零件的工程号JNO
3.1导入数据到SQL Server:
create table SPJ
(
Sno char(4) not null,
Pno char(4) not null,
Jno char(4) not null,
Qty int not null
)
insert into SPJ
values('S1','P1','J1',200),
('S1','P1','J3',100),
('S1','P1','J4',700),
('S1','P2','J2',100),
('S2','P3','J1',400),
('S2','P3','J2',200),
('S2','P3','J4',500),
('S2','P3','J5',400),
('S2','P5','J1',400),
('S2','P5','J2',100),
('S3','P1','J1',200),
('S3','P3','J1',200),
('S4','P5','J1',100),
('S4','P6','J3',300),
('S4','P6','J4',200),
('S5','P2','J4',100),
('S5','P3','J1',200),
('S5','P6','J2',200),
('S5','P6','J4',500);
)
3.2理解:
这里÷∏PNO(σSNO=’S1’(SPJ))添加了条件,看过例一以后不难理解,这个条件应该放到嵌套第二层中,因为嵌套第三层是用来新建一个包含所有JNO的象集表的。
3.2.1代码:
select distinct JNO from SPJ S1
where not exists
(select distinct PNO from SPJ S2where SNO='S1' and not exists (select * from SPJ S3where S3.JNO=S1.JNO and S3.PNO=S2.PNO)
);
3.2.2答案:
参考文章: https://www.jianshu.com/p/b2792b955f07.
完