在SQL连接的情况下如何将SQL转换为关系代数?

时间:2013-09-25 06:34:58

标签: sql join relational-database relational-algebra

这些天我正在研究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

我无法理解上述查询的关系代数是什么?任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:4)

关系代数:

  

查找每个 Id Employee的{​​{1}}。

实际上你需要division % operator in relational algebra

  当我们希望使用training表达查询时,会使用

r ÷ s

     

示例:

     
      
  1. 哪些人必须在“all”银行在国内?
  2. 银行帐户   
  3. 检索ALLALL工作的Jon Smith员工的姓名?
  4.   

另请阅读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 quantificationall的查询   条件。大多数RDBMS实现以SQL作为主要查询   语言不直接实现分工。 SQL有圆形的方式   使用EXISTS,CONTAINS和NOT EXISTS处理查询类型   关键词。

     

一般DIVISION操作适用于两个关系T(Y) = R(Z) % S(X),其中X ⊆ Z Y = Z - X(以及Z = X ∪ Y); YR的属性集,而不是S   X = {A}, Z = {A, B} then Y = {B}的属性,例如BS   属性在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。

我希望这有帮助。