Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么查询多个vs少一些的实体更难?_Sql_Database_Relational_Relational Algebra - Fatal编程技术网

Sql 为什么查询多个vs少一些的实体更难?

Sql 为什么查询多个vs少一些的实体更难?,sql,database,relational,relational-algebra,Sql,Database,Relational,Relational Algebra,这是数据库,粗体主键 工作(人名,公司名,薪水) 假设我们有这个问题: 查找收入超过小型银行公司每位员工的所有员工的姓名 提议的解决办法: 我们无法轻松计算出比小型银行公司的每位员工收入都高的员工,但我们可以计算出比小型银行公司的一些员工收入低的员工。我们从所有员工的集合中减去这个集合。请注意小于或等于,并且我们删除具有相同名称的记录 temp ← ∏person_name(σp(works⨯ρd(works))) 其中p是 works.person_name ≠ d.person_nam

这是数据库,粗体主键

  • 工作(
    人名
    ,公司名,薪水)
假设我们有这个问题:

查找收入超过小型银行公司每位员工的所有员工的姓名

提议的解决办法:

我们无法轻松计算出比小型银行公司的每位员工收入都高的员工,但我们可以计算出比小型银行公司的一些员工收入低的员工。我们从所有员工的集合中减去这个集合。请注意小于或等于,并且我们删除具有相同名称的记录

temp ← ∏person_name(σp(works⨯ρd(works)))
其中p是

works.person_name ≠ d.person_name ∧
works.salary ≤ d.salary ∧
d.company_name = "Small Bank Corporation"
那么答案是:

∏person_name(works) − temp

为什么我们不能很容易地计算出比小银行公司的每一位员工都赚得多的人?为什么我们可以轻松地计算出收入较低的人群?我不明白。What does works.salary查询可以很容易地表达为:

select person_name
from works
where salary > (
    select max(salary) 
    from works 
    where company_name = 'Small Bank Corporation')
我们无法轻松计算收入超过 小银行公司的每个员工,但我们可以计算集合 收入低于小银行部分员工的员工人数 公司

不是不平等造成了差异。(你可以通过在你的σ中改变它们来看到这一点。)这是每个/所有vs对某些人的作用

谓词是-(命名的)blanks语句中的true或false填充

请注意,名称及其属性是谓词的简写版本。我们称关系变量、常数或表达式的谓词为其含义

假设关系表达式e&f包含使谓词表达式e&f分别为真的行。代数运算符的设计应确保:

R
保存满足R(R.X,…)
ρS(e
带有属性R.X
保存满足E的行,其中R.X替换为S.X
e⨯f
保存满足E和F的行
e-f
保存满足E而非F的行
eUf
保存满足E或F的行
σ
条件
(e)
保存满足E和条件的行
πA(e) 保存满足某些all属性(A:E除外)的行

碰巧的是,关系中的每一个小变化都有一个意义上的小变化。请注意,该列表不包括表达式
~(e)
(“补码”),该表达式包含不在e中的行,即不在e中的行。因为(总的来说)这是一个非常多的行并且计算起来是不切实际的。但事实证明,如果我们永远不希望这些行作为查询结果(我们通常不希望),那么我们可以使用其他运算符重写。FOR ALL A:E意味着不适用于某些A:note。因此涉及FOR ALL的查询是复杂的,我们(通常)不能在外部使用FORALL。最初的意思并不复杂,但我们必须将其重新排列为一个复杂的短语,该短语由一个复杂的关系表达式计算得出

所以答案是,对于某些A:E,关系式很容易计算和可视化,但是对于所有A:E,关系式使用了复杂的廉价运算符调用来进行廉价计算,而不是人类对E的明显重排

(使用FOR ALL有各种特殊情况,直接转换为各种“除法”运算符的简单调用。但是这些特殊情况并没有简单的含义!事实证明,使用关系子集运算符表示所有查询更简单。)

(参见我的答案和他们的问题:谓词、代数和sql。)


什么是works.salary如果您正在寻找SQL中的解决方案,有许多不同的方法来表达此查询。谁提出了此解决方案?或者你是在问为什么你的解决方案不容易?@EmacsUser问题不是查询是什么,问题是为什么两个查询在一个意义上如此相似(意思),在另一个意义上如此不同(代数/sql表达式)。你的预测应该在
上运行。person\u name
d.person\u name
-- person [W.P] works for company [W.C] for salary [W.S]
W (W.P,W.C,W.S)
-- temp ← ∏works.person_name(σp(works⨯ρd(works)))
FOR SOME works.company_name, works.salary,
    d.person_name, d.company_name, d.salary:
        person [works.person_name] works for company [works.company_name]
            for salary [works.salary]
    AND person [d.person_name] works for company [d.company_name]
            for salary [d.salary]
    AND [works.salary] <= [d.salary]
    AND ...