TL;DR:也许你的意思是你“不理解假设部分”查询的。这很好,因为没有参与查询假设。
PS:正如其他答案所指出的,这些断言似乎是矛盾的。他们不清楚,查询也是如此。我怀疑“所有人都为一家公司工作”意味着“人们在同一家公司工作”works
只为一家公司工作”;否则直截了当含义与“人们被允许出现在[employee
]但没有出现在works
”(因此失业)。我怀疑“该数据库中所有员工的姓名”意味着“employee
", per "在数据库中(例如在employee
)".
To query您只需要了解行在表中和不在表中时的状态(基本变量或查询结果)。即如何知道表的meaning aka 谓词,一个填空(命名)语句,其中列是参数:
-- employee PERSONNAME lives on STREET in CITY
在工程和数学中,传统上使用名称和参数作为简写:
-- EMPLOYEE(PERSONNAME,STREET,CITY)
包含表列的每一行都会生成一个语句,即主张通过为其列值提供参数:
(Frank, 1st Avenue, Mytown) proposition from EMPLOYEE predicate:
-- employee Frank lives on 1st Avenue in Mytown
-- EMPLOYEE(Frank, 1st Avenue, Mytown)
构成一个的行true提议去in一张桌子和那些没有的桌子。因此,每个存在的行都陈述其命题,而每个不存在的行都陈述“不是”。表保存使其谓词成为真命题的行。
关系运算符被设计为使得结果的含义/谓词是其输入的含义/谓词的特定组合:
R -- holds rows where R(...)
S -- holds rows where S(...)
R JOIN S -- holds rows where R(...) AND S(...)
R UNION S -- holds rows where R(...) OR S(...)
R MINUS S -- holds rows where R(...) AND NOT S(...)
R PROJECT columns to keep -- holds rows where FOR SOME columns to drop, R(...)
R RESTRICT condition -- holds rows where R(...) AND condition
(重新使用 SQL,这是这些的混合体(不幸的是,不忠实且笨拙),请参阅这个答案 https://stackoverflow.com/a/27682724/3404097.)
你的任务:
员工(姓名、街道、城市)
作品(人名、公司名称、工资)
公司(公司名称、城市)
管理(人员姓名、经理姓名)
查找此数据库中所有不在该公司工作的员工的姓名
第一银行公司
我们想要使某些含义/谓词成立的行表。改写一下以获得我们想要的:
-- employee PERSONNAME does not work for FBC
我们必须根据我们被赋予的含义/谓词来表达这个含义/谓词:(我必须guess这些是什么,因为你没有给它们。)
-- rough draft with only relevant columns
-- ... [employee PERSONNAME ...]
AND NOT ... [employee PERSONNAME works at COMPANY ... AND COMPANY = FBC]
-- full base predicates but drop/keep columns appropriately
-- FOR SOME STREET & CITY [employee PERSONNAME lives on STREET in CITY]
AND NOT FOR SOME COMPANY & SALARY
[employee PERSONNAME works at COMPANY for $SALARY AND COMPANY = FBC]
-- shorthand
-- FOR SOME STREET & CITY [EMPLOYEE(PERSONNAME, STREET, CITY)]
AND NOT FOR SOME COMPANY & SALARY
[WORKS(PERSONNAME,COMPANYNAME, SALARY) AND COMPANY = FBC]
对于实现这一点的行表,我们将逻辑运算符转换为关系运算符,并将基表谓词转换为名称:
PROJECT PERSONNAME (EMPLOYEE)
MINUS PROJECT PERSONNAME (RESTRICT COMPANY = FBC (WORKS))
(关系代数的变体可能有不同的运算符。)
约束条件对可能出现的应用情况和相应的数据库值有限制。它们是“假设”,因为它们被认为是正确的。他们是商业规则(包括相关程序、物理定律和数学真理以及结果其中)。与对基所保存的内容或查询“找到”的描述一样,可以使用关于当前情况的自然语言和/或使用关于当前基表值的相应关系表达式将它们重新表述为含义/谓词。 (因为它们始终为真,所以含义/谓词是语句/命题。因此它们的查询版本都将没有列和一行的表作为结果值。因此它们不需要基表。)
查询时不需要约束。它们总是评估为真实的语句,因此将它们与查询语句/命题连接(AND)不会影响哪些行进入和离开基数。 (它们确实暗示了对其组成基表的查询表达式的约束。此外,它们允许 DBMS 防止出现不可能的数据库值,并帮助用户检查对基表含义/谓词的理解。)
不过,给你这项任务的人可能不明白这一点。你可以问他们:如果这些限制中的任何一个确实发生了not持有那么将如何查询表达式有所不同吗? (答案:不会。)
尚未给出表含义/谓词。Maybe这些断言试图解释查询中“雇员”的含义以及(未给出的)含义employee
and works
.