📜  SQL |分配

📅  最后修改于: 2022-05-13 01:54:23.987000             🧑  作者: Mango

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. 实施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. 实现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) );


重要提示:
对于除法相关查询似乎更容易编写,但执行起来可能很昂贵。

    更多的例子
  1. 列出供应所有“红色”零件的供应商。(供应模式)
  2. 检索参与“John Smith”工作的所有项目的员工姓名(公司模式)