SQL |分配
当您想要找出与一组不同类型实体的所有实体交互的实体时,通常需要除法。
当我们必须评估包含关键字“all”的查询时,使用除法运算符。
使用除法运算符的一些情况是:
- 哪个人在某个城市的所有银行都有账户?
- 哪些学生完成了毕业所需的所有课程?
在所有这些查询中,关键字“all”之后的描述定义了一个包含一些元素的集合,最终结果包含满足这些要求的那些单元。
重要提示:SQL 实现不支持除法。但是,它可以使用其他操作来表示。(如交叉连接、Except、In)
分区的SQL实现
给定两个关系(表):R(x,y),S(y)。
R 和 S :表格
x 和 y :R 的列
y : S 的列
R(x,y) div S(y)均值给出与 R 中所有不同的 x 值,这些值与 S 中的所有 y 值相关联。
除法计算: R(x,y) div S(y)
脚步:
- 通过计算 R(x) x(cross join) S(y) 找出 S(y) 与 R(x) 的所有可能组合,比如 r1
- 从 r1 中减去实际的 R(x,y),比如 r2
- r2 中的 x 是那些不与 S(y) 中的每个值相关联的值;因此 R(x)-r2(x) 给了我们 x
与 S 中的所有值相关联
查询
- 实施1:
SELECT * FROM R WHERE x not in ( SELECT x FROM ( (SELECT x , y FROM (select y from S ) as p cross join (select distinct x from R) as sp) EXCEPT (SELECT x , y FROM R) ) AS r );
- 实现2:使用相关子查询
SELECT * FROM R as sx WHERE NOT EXISTS ( (SELECT p.y FROM S as p ) EXCEPT (SELECT sp.y FROM R as sp WHERE sp.x = sx.x ) );
关系代数
Using steps which is mention above:
All possible combinations
r1 ← πx(R) x S
x values with “incomplete combinations”,
r2x ← πx(r1-R)
and
result ← πx(R)-r2x
R div S = πx(R)- πx((πx(R) x S) – R)
例子
供应模式
这里sid表示供应商ID, pid表示partsID 。
表:供应商(sid,pid),零件(pid)
1. 寻找提供所有零件的供应商。
答案 1:使用实现 1
SELECT * FROM suppliers
WHERE sid not in ( SELECT sid FROM ( (SELECT sid, pid FROM (select pid from parts) as p
cross join
(select distinct sid from supplies) as sp)
EXCEPT
(SELECT sid, pid FROM supplies)) AS r );
答案 2:使用实现 2
SELECT * FROM suppliers as s
WHERE NOT EXISTS (( SELECT p.pid FROM parts as p )
EXCEPT
(SELECT sp.pid FROM supplies sp WHERE sp.sid = s.sid ) );
公司架构
2. 列出参与 dno=4 控制的所有项目的员工。
Ans 1.使用实现1
SELECT * FROM employee AS e
WHERE ssn NOT IN (
SELECT essn FROM (
(SELECT essn, pno FROM (select pno from project where dno=4)
as p cross join (select distinct essn from works_on) as w)
EXCEPT (SELECT essn, pno FROM works_on)) AS r );
Ans 2. 使用实现 2
SELECT * FROM employee AS e
WHERE NOT EXISTS (
(SELECT pno FROM project WHERE dno = 4)
EXCEPT
(SELECT pno FROM works_on WHERE essn = e.ssn) );
重要提示:对于除法相关查询似乎更容易编写,但执行起来可能很昂贵。
- 更多的例子。
- 列出供应所有“红色”零件的供应商。(供应模式)
- 检索参与“John Smith”工作的所有项目的员工姓名(公司模式)