这些天我正在研究SQL和关系代数。我被困在以下问题上。我能够为以下问题制作一个 SQL,但不知何故,我所做的关系代数看起来不对。
以下是我的表格-
Employee (
EmployeeId
, EmployeeName, EmployeeCountry)
Training (
TrainingCode
, TrainingName, TrainingType, TrainingInstructor)
Outcome
EmployeeId, TrainingCode
, Grade)
Id
所有键都用星号 * 指定。
下面是问题及其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
我无法理解上述查询的关系代数是什么?谁能帮我?
关系代数:
找一个
training
的Employee
,他拿了每%
。
实际上,在关系代数中,您需要除法运算符r ÷ s
运算符:
当我们希望用
ALL
表达查询时,使用“all”
:例:
- 哪些人在该国的银行
ALL
拥有银行账户?- 检索
Jon Smith
Training (
从事的项目的员工的姓名?
另请阅读除法运算符的滑动:
您还需要查询 % 运算符才能查询:"已参加所有培训的员工"。
首先列出所有训练代码:
TrainingCode
, TrainingName, TrainingType, TrainingInstructor)
TrainingCode
主键为: TC =
:
TrainingCode
∏ET =
(培训(
一对员工 ID 和培训代码:员工参加培训。
应用
EmployeeId, TrainingCode
∏Result =
(结果(
%除法运算,该操作通过培训代码为您提供所需的员工代码,然后应用投影以仅过滤掉员工代码。
EmployeeId
∏universal quantification
(ET % TC(
《数据库系统基础》是我一直拿在手里的书。
6.3.4 除法操作
定义除法操作是为了方便处理 涉及
all
或T(Y) = R(Z) % S(X)
的查询 条件。大多数以SQL作为主要查询的RDBMS实现 语言不直接实现除法。SQL有圆形的方式 使用"存在"、"包含"和"不存在"处理查询类型 关键词。一般的 DIVISION 运算适用于两个关系
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
和every
S
元组t
.这意味着。要使元组T
出现在 DIVISION 的结果t
中,R
的值必须与{
中的每个元组一起出现在S
中。
我还想补充一点,关系代数运算集σ
,
∏
,
⋈
,
Χ
,
-
}
%
即选择、投影、连接、笛卡尔交叉和减号是一个完整的集合;也就是说,任何其他原始的关系代数运算都可以表示为该集合中的一系列运算。除法运算∏
也可以用⋈
、 -
和T1 <-- ∏Y(R)
运算的形式表示,如下所示:
T2 <-- ∏Y((S Χ T1) - R)
T3 <-- T1 - T2
CC_73
要使用基本的关系代数运算来表示您的问题,只需将 R 替换为结果,将 S 替换为训练,将属性集 Y 替换为 EmployeeId。
我希望这有所帮助。