这些天我正在研究SQL和Relational Algebra。我坚持以下问题。我能够为下面的问题制作一个SQL,但不知怎的,我所做的关系代数看起来并不合适。
以下是我的表格 -
Employee (
的EmployeeId
, EmployeeName, EmployeeCountry)
Training (
的TrainingCode
, TrainingName, TrainingType, TrainingInstructor)
Outcome
(
EmployeeId, TrainingCode
, Grade)
所有键都用星号*。
指定以下是问题及其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
我无法理解上述查询的关系代数是什么?任何人都可以帮我吗?
答案 0 :(得分:4)
关系代数:
查找每个
Id
Employee
的{{1}}。
实际上你需要division %
operator in relational algebra:
当我们希望使用training
表达查询时,会使用
r ÷ s
:示例:
- 哪些人必须在
银行帐户“all”
银行在国内?- 检索
醇>ALL
项ALL
工作的Jon Smith
员工的姓名?
另请阅读this slid以获取除法运算符:
您的查询还需要查询%运算符:“已完成所有培训”的员工。
首先列出所有培训代码:
Training (
的TrainingCode
强>, TrainingName, TrainingType, TrainingInstructor)
主键是: TrainingCode
:
TC =
ΠTrainingCode
(培训)
一对employeeID和trainingCode:员工接受培训。
ET =
ΠEmployeeId, TrainingCode
(结果)
应用%Division操作,通过trainingCode为您提供所需的员工代码,然后应用投影仅过滤员工代码。
Result =
ΠEmployeeId
(ET%TC)
"Fundamentals of Database Systems"是我一直掌握的书。
6.3.4 DIVISION Operation
DIVISION操作的定义是为了方便处理 涉及
universal quantification
或all
的查询 条件。大多数RDBMS实现以SQL作为主要查询 语言不直接实现分工。 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的结果是一个关系包含一个元组tR
如果 元组R
出现在关系tR[Y] = t
中tR[X] = tS
,以及 {em>every
元组的S
t
。这意味着。要使元组T
出现在DIVISION的结果t
中,R
的值必须出现在{{ 1}}与S
中的每个元组组合使用。
我还想补充一下关系代数运算{
σ
,
∏
,
的 ⋈
强> ,
的 Χ
强> ,
的 -
强> }
即选择,投影,加入,笛卡尔十字和减号是完整集;也就是说,任何其他原始关系代数运算都可以表示为来自该集合的一系列运算。分部操作%
也可以表示为 ∏
, ⋈
和 -
操作如下:
T1 <-- ∏Y(R)
T2 <-- ∏Y((S Χ T1) - R)
T3 <-- T1 - T2
要使用基本关系代数运算来表示您的问题,只需将R替换为Outcome,将S替换为Training,将属性设置Y替换为EmployeeId。
我希望这有帮助。