这些天,我正在研究SQL和关系代数。我被困在以下问题上。我可以针对以下问题创建SQL,但是以某种方式我制作的关系代数看起来不正确。
以下是我的表格-
Employee ( EmployeeId, EmployeeName, EmployeeCountry) Training ( TrainingCode, TrainingName, TrainingType, TrainingInstructor) Outcome `(**EmployeeId, TrainingCode**, Grade)`
Employee (
EmployeeId
, EmployeeName, EmployeeCountry)
Training (
TrainingCode
, TrainingName, TrainingType, TrainingInstructor)
Outcome
`
**
所有键都用星号*指定。
以下是该问题及其SQL查询,它们可以正常工作-
查找参加过所有培训的员工的ID。
SQL Qyery:
SELECT X.EmployeeID FROM (SELECT EmployeeID, COUNT(*) AS NumClassesTaken FROM OutCome GROUP BY EmployeeID ) AS X JOIN (SELECT COUNT(*) AS ClassesAvailable FROM Training) AS Y ON X.NumClassesTaken = Y.ClassesAvailable
我无法理解上述查询的关系代数是什么?有人可以帮我吗?
关系代数:
查找Id的Employee谁采取了 每天 training。
Id
Employee
training
实际上,您需要在关系代数中进行 除法%运算:
%
r聽梅聽s当我们希望用以下方式表达查询时使用鈥渁ll鈥�: 例子: 这听的人听有无听一听银行账户听,在听听ALL听的听银行听在听的听的国家吗? 检索从事所从事ALL项目的员工的姓名Jon Smith?
r聽梅聽s当我们希望用以下方式表达查询时使用鈥渁ll鈥�:
r聽梅聽s
鈥渁ll鈥�
例子:
ALL
Jon Smith
另请阅读除法运算符的这张幻灯:
您还需要查询%运算符来查询:“已接受 所有 培训的员工”。
首先列出所有培训代码:
Training ( TrainingCode, TrainingName, TrainingType, TrainingInstructor)
主键是 TrainingCode :
TC = 鈭 TrainingCode(训练)
TC =
一对employeeID和trainingCode:一名员工参加了培训。
ET = 鈭 EmployeeId, TrainingCode(结果)
ET =
EmployeeId, TrainingCode
应用%除法操作,该操作可为您提供所需的带有trainingCode的员工代码,然后应用投影仅过滤出员工代码。
Result = 鈭 EmployeeId(ET%TC)
Result =
我经常掌握《数据库系统基础知识》一书。
6.3.4除法运算 除法运算是为了方便定义用于与查询处理,其涉及universal quantification或all 条件。大多数将SQL作为主要查询语言的RDBMS实现并不直接实现除法。SQL具有使用EXISTS,CONTAINS和NOT EXISTS关键字处理查询类型的全面方法。 一般的DIVISION运算适用于两个关系T(Y) = R(Z) % S(X),其中X ⊆ Z 和Y = Z - X(因此Z = X ∪ Y);那是Y属性的集合,R不是属性的,S例如X = {A}, Z = {A, B} then Y = {B},B 关系中不存在属性S。
除法运算是为了方便定义用于与查询处理,其涉及universal quantification或all 条件。大多数将SQL作为主要查询语言的RDBMS实现并不直接实现除法。SQL具有使用EXISTS,CONTAINS和NOT EXISTS关键字处理查询类型的全面方法。
一般的DIVISION运算适用于两个关系T(Y) = R(Z) % S(X),其中X ⊆ Z 和Y = Z - X(因此Z = X ∪ Y);那是Y属性的集合,R不是属性的,S例如X = {A}, Z = {A, B} then Y = {B},B 关系中不存在属性S。
T(Y)除法的结果是一个关系包括一个元组t,如果元组出现在关系与 以及与 为元组 。这意味着。为了使元组出现在DIVISION的结果中,必须将的值 与中的每个元组结合出现。 tRRtR[Y] = ttR[X] = tSeveryStTtRS除法运算是为了方便定义用于与查询处理,其涉及universal quantification或all
universal quantification
all
条件。大多数将SQL作为主要查询语言的RDBMS实现并不直接实现除法。SQL具有使用EXISTS,CONTAINS和NOT EXISTS关键字处理查询类型的全面方法。 一般的DIVISION运算适用于两个关系T(Y) = R(Z) % S(X),其中X 鈯� Z和Y = Z - X(因此Z = X 鈭� Y);这是Y属性的集合,R不是属性的属性,S例如X = {A}, Z = {A, B} then Y = {B},B 关系中不存在属性S。 T(Y)除法的结果是一个关系包括一个元组 t ,如果元组出现在关系与 以及与 为元组 。这意味着。为了使元组出现在DIVISION的结果中,必须将的值 与中的每个元组结合出现。 _t R_``R`` _t R_[Y] = _t_`` _t R_[X] = _t_ S everyS tT tR``S
条件。大多数将SQL作为主要查询语言的RDBMS实现并不直接实现除法。SQL具有使用EXISTS,CONTAINS和NOT EXISTS关键字处理查询类型的全面方法。
一般的DIVISION运算适用于两个关系T(Y) = R(Z) % S(X),其中X 鈯� Z和Y = Z - X(因此Z = X 鈭� Y);这是Y属性的集合,R不是属性的属性,S例如X = {A}, Z = {A, B} then Y = {B},B 关系中不存在属性S。
T(Y) = R(Z) % S(X)
X 鈯� Z
Y = Z - X
Z = X 鈭� Y
Y
R
S
X = {A}, Z = {A, B} then Y = {B}
B
T(Y)除法的结果是一个关系包括一个元组 t ,如果元组出现在关系与 以及与 为元组 。这意味着。为了使元组出现在DIVISION的结果中,必须将的值 与中的每个元组结合出现。 _t R_``R`` _t R_[Y] = _t_`` _t R_[X] = _t_ S everyS tT tR``S
T(Y)
t
_t R_``R`` _t R_[Y] = _t_`` _t R_[X] = _t_ S
every
T
R``S
我也想补充的是,组关系代数运算,即选择,投影,连接,笛卡尔十字和减号是一个 完整的 集; 也就是任何其他原始关系代数运算都可以表示为该集合中的一系列运算。除法运算 ,也可以在的形式表示,和 操作如下:{σ,∏,⋈,Χ,-}%∏⋈-*
{σ,∏,⋈,Χ,-}%∏⋈-*
T1 <– ∏Y(R) T2 <– ∏Y((S Χ T1) - R) T3 <– T1 - T2
要使用基本的关系代数运算表示您的问题,只需将R替换为Outcome,将S替换为Training,将属性集Y替换为EmployeeId。
希望对您有所帮助。