当前位置: 首页 > 面试题库 >

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

慕高阳
2023-03-14
问题内容

这些天,我正在研究SQL和关系代数。我被困在以下问题上。我可以针对以下问题创建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

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


问题答案:

关系代数:

查找IdEmployee谁采取了 每天 training

实际上,您需要在关系代数中进行
除法%运算

r聽梅聽s当我们希望用以下方式表达查询时使用鈥渁ll鈥�

例子:

  1. 这听的人听有无听一听银行账户听,在听听ALL听的听银行听在听的听的国家吗?
  2. 检索从事所从事ALL项目的员工的姓名Jon Smith

另请阅读除法运算符的这张幻灯:

您还需要查询%运算符来查询:“已接受 所有 培训的员工”。

首先列出所有培训代码:

Training ( TrainingCode, TrainingName, TrainingType, TrainingInstructor)

主键是 TrainingCode

TC = TrainingCode(训练)

一对employeeID和trainingCode:一名员工参加了培训。

ET = EmployeeId, TrainingCode(结果)

应用%除法操作,该操作可为您提供所需的带有trainingCode的员工代码,然后应用投影仅过滤出员工代码。

Result = EmployeeId(ET%TC)

我经常掌握《数据库系统基础知识》一书。

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。

T(Y)除法的结果是一个关系包括一个元组t,如果元组出现在关系与 以及与 为元组 。这意味着。为了使元组出现在DIVISION的结果中,必须将的值 与中的每个元组结合出现。 tRRtR[Y] = ttR[X] = tSeveryStTtRS除法运算是为了方便定义用于与查询处理,其涉及universal quantificationall

条件。大多数将SQL作为主要查询语言的RDBMS实现并不直接实现除法。SQL具有使用EXISTS,CONTAINS和NOT
EXISTS关键字处理查询类型的全面方法。

一般的DIVISION运算适用于两个关系T(Y) = R(Z) % S(X),其中X 鈯� ZY = 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

我也想补充的是,组关系代数运算,即选择,投影,连接,笛卡尔十字和减号是一个 完整的 集;
也就是任何其他原始关系代数运算都可以表示为该集合中的一系列运算。除法运算 ,也可以在的形式表示,和 操作如下:{σ,∏,⋈,Χ,-}%∏⋈-*

T1 <– ∏Y(R)
T2 <– ∏Y((S Χ T1) - R)
T3 <– T1 - T2

要使用基本的关系代数运算表示您的问题,只需将R替换为Outcome,将S替换为Training,将属性集Y替换为EmployeeId。

希望对您有所帮助。



 类似资料:
  • 我的要求就像,我有一个json文件数据如下。,{Key1: value e1, key2: value 2,......}带有文件名example.json 应将其插入sql server,取名称:示例数据如下,Id key1 key2 1 value 1 value 2 我正在寻找一种解决方案,这样就不会有任何Java层的复杂性,比如首先将这些数据转换为JavaBean,然后使用Java数据库驱

  • 问题内容: 如何将以下SQL查询转换为ActiveRecord关系,以便可以使用范围对其进行扩展? 这是我必须尝试直接使用Arel的东西吗? 我尝试将其分解为作用域/子查询,但是子查询上的选择最终在封闭查询中,因此引发PostgreSql错误,因为未在封闭语句中的GROUP BY或ORDER BY中指定该列。 更新: 您认为它是PostgreSql是正确的。我尝试了您的查询,但是对于直接查询和Ac

  • 问题内容: 我编写了一些SQL查询,希望将其转换为关系代数。但是,某些查询使用聚合运算符,而我不知道如何转换它们。值得注意的是,它们使用COUNT和GROUP BY .. HAVING运算符。 这是模式: 水手( sid ,sname,评分)储备( sid , 出价 ,价格)船( 出价 ,bname) 这是我正在做的一个示例:查找恰好2个水手保留的所有船只的出价和名称。 允许的关系代数运算:选择,

  • 我在用org。乔达。时间LocalDate和LocalDateTime。我从外部源获得一个Unix时间戳,并希望从中生成一个LocalDate(时间)。关键是,在该外部系统的界面中定义,所有日期/时间都在UTC时区内。因此,我希望避免从该时间戳到本地系统的任何默认时区的任何隐式转换,这可能与UTC不同。有一个LocalDateTime的构造器用于这些事情,所以我尝试(作为一个例子): 结果让我有点

  • 选择从…起其中R.WORK_YM=201611 如何将R.WORK_YM更改为字符串值?

  • 问题内容: 我需要一个解决方案将String转换为字节数组,而无需像这样更改: 输入: 输出: 当我使用 那么回复是 但我希望回复是 问题答案: 您应始终确保序列化和反序列化使用相同的字符集,这会将字符映射到字节序列,反之亦然。默认情况下,String.getBytes()和新的String(bytes)使用默认字符集,该字符集可能是特定于语言环境的。 使用getBytes(Charset)重载