1.3.2 关系运算

1.3.2 关系运算

关系数据库之所以得到普及,是因为关系数据库的数据结构较简单,所有的数据均采用关系进行组织,任何对关系所进行的运算结果仍然是关系。除了具备集合的交、并、差等基本关系运算以外,还包括专门的关系运算,主要包括选择运算、投影运算和联接运算。

1.选择运算

选择运算是对关系中的元组按照一定的规则进行筛选,是对行的指定。例如,Student关系包含以下元组,如表1-3所示。

表1-3 Student关系

img4

如果设置规则为“性别='男'”,则经过选择运算得到的结果集如表1-4所示。

表1-4 经过选择运算得到的结果集

img5

设置的规则又称条件,一般是一个条件表达式。可以看出:经过选择运算最终得到的结果集仍然是一个关系。

2.投影运算

如果我们并不需要Student关系的所有属性,可以使用投影运算。投影运算是对列的筛选。例如我们仅仅需要得到学生的姓名和所在班级,可以使用投影运算,仅仅指定Sname和Class两列。对表1-3的运算结果如表1-5所示。

表1-5 经过投影运算的结果集

img6

同样,经过投影运算最终得到的结果集仍然是一个关系。

3.联接运算

联接运算可以将多个关系联接成一个关系,是对所有关系属性即列的合并。联接运算主要包括内部联接和外部联接。内部联接又叫等值联接,外部联接包含左联接和右联接。

1)内部联接

内部联接按照某个或某几个等值字段进行联接。如果关系A中某元组的字段1与关系B中某元组的字段2值相等,就会把来自这两个关系的两个元组所有的列进行合并。最终得到的关系既包含来自关系A的属性,也包含来自关系B的属性。

例如,如果要查询某个学生的选课情况,最终显示学生的学号、姓名、课程号和成绩。由于在StudentCourse关系中无学生的姓名属性,因此,必须将Student关系和StudentCourse关系进行等值联接。联接条件设为:Student.StuNo=StudentCourse.StuNo。

假设StudentCourse关系包含的元组如表1-6所示。

表1-6 StudentCourse关系包含的元组

img7

续表

img8

经过内部联接得到的关系如表1-7所示。

表1-7 关系Student与关系StudentCourse内部联接的结果集

img9

由于StuNo(学号)属性是关系Student和StudentCourse的共同属性,因此在该属性前均要加上关系名称,关系名称与属性名称之间用小数点隔开。其他属性均属于其中的一个关系,因此不需要指定关系名称。如果对联接后的结果再经过投影运算就可以得到所需要的信息,如表1-8所示。

表1-8 联接后经过投影运算的结果集

img10

2)左联接

利用内部联接只能将关系A中某个字段与关系B中某个字段相等的两个元组进行列的合并。对于上例,结果集中只存在有选课信息的学生信息。如果结果集中需要包含所有学生的信息,包括有选课的和无选课的学生,利用左联接可以实现此目的。

设左联接运算符左方关系为A,右方关系为B。左联接与内部联接一样,也需要设置等值条件。区别是左联接会得到关系A中所有元组,如果关系A的某个元组按照等值条件在关系B中有与之对应的元组,就将这两个元组进行列的合并,构成结果集的一个元组。如果在关系B中找不到与之对应的元组,也会包含在结果集中。

例如,如果要查询所有学生的选课情况,包括没有选课信息的学生。将关系Student作为关系A,关系StudentCourse作为关系B,等值条件同上例,经过左联接得到的关系如表1-9所示。

表1-9 关系Student与关系StudentCourse左联接的结果集

img11

3)右联接

右联接会得到关系B中所有元组。如果关系B的某个元组按照等值条件,在关系A中有与之对应的元组,就将这两个元组进行列的合并。如果在关系A中找不到与之对应的元组,也会包含在结果集中。上例中,只要将关系Student作为关系B,关系StudentCourse作为关系A,利用右联接也会得到相同的结果。所以左联接和右联接可以相互转换,只要交换两个关系的位置即可。