学生(身份证,姓名,地址,城市,出生年份)
课程(代码,课程名称,长度周期,机构°)
机构(instNr,instName,instCity)
需要(id°,代码°)列出未参加数据库课程的学生的ID和名称。
t1←σschoolName=数据库(课程)
t2←t1⋈取得
t3←t2⋈学生
t4←πid,name(t3)
t5←πid,姓名(学生)
R←t5 \ t4
我不明白t5背后的逻辑。如何选择已从关系中删除的id和名称?你能用¬?
做另一种方式吗?答案 0 :(得分:0)
RA(关系代数)运算符返回给定输入关系值的值。 (与整数的日常添加一样。)它们不会更改或建立与变量或常量名称相关联的值。这不属于代数。名称可能与新值关联的唯一方法是将←
定义为变量赋值而不是常量声明。你必须告诉我们。无论哪种方式,它都不是关系代数运算符。它是一种语言中的符号,其表达式不仅包括表示关系(终端)和嵌套代数运算符调用(非终端)的名称。在某种意义上,我们可以认为它是该语言的运算符,但它不是代数的运算符。无论哪种方式,您的代码都不会将第二个值与同名相关联。
(有些RA具有输入名称和关系值的运算符以消除输入的歧义。但是使用这样的输入名称将变量/常量名称与输出上的值相关联不是RA操作。)
(RA可以将其关系概念定义为包含名称和一组元组,因此它可以具有代数重命名运算符,该运算符采用名称和关系并在其名称部分中返回与给定名称的关系。但同样,这不会影响与用于标识输入关系的任何变量/常量名称相关联的值。)
重新“做另一种方式”:通常我们假设一些RA运营商&某种方式来命名关系值,然后有一组明显的查询表达式:我们采用一个表达式来表示其关联值,我们采用一个表达式作为运算符调用来表示调用运算符的值其参数表达式的值。 (与日常整数算术表达式一样。)
但是一个特定的查询语言虽然根据这样的表达式定义,但实际上可能不允许你写任何或所有这样的表达式。 (例如关系元组微积分和域微积分。)和/或它可能在表达式重新排列方面定义其他表达式而不明确给出相应的运算符。
(关系代数的一些演示将RA运算符与受RA启发的查询语言表达混淆。然后可能存在查询表达式,其结果取决于作为参数出现的变量/常量名称,而不仅仅是由显示为参数的名称。然后可能存在您可能无法通过操作符调用嵌套编写的查询表达式,并且可能需要您通过赋值/声明将值与名称相关联。)