欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用代码表示SQL中的除法运算

最编程 2024-08-12 07:45:52
...

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表
表R和表T中,只有B、C字段是相同的,又因为表T是除数,所有比较时只用到A\B\C字段。

2.2.1代码:

select distinct A from R R1
where not exists
(
	select B,C from T
	where not exists 
	(
		select * from R R2
		where 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中都存在。
再从里 往 外看结果:
结果1
第三步返回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 S2
	where SNO='S1' and not exists 
	(
		select * from SPJ S3
		where S3.JNO=S1.JNO and S3.PNO=S2.PNO
	)
);

3.2.2答案:

J4


参考文章: https://www.jianshu.com/p/b2792b955f07.

推荐阅读