多表查询(三)------Union

来源:互联网 发布:中央网络报 编辑:程序博客网 时间:2024/04/29 15:01

基本表:http://blog.csdn.net/qinyushuang/archive/2010/12/31/6110245.aspx

1、关系的集合运算

  • R并S。R或者S中元素的集合,一个元素在并集中只出现一次,即使它在两个集合中都存在
  • R交S,在R或者S中都存在的元素的集合
  • R差S。存在于集合R中且不存在于S中的元素的集合。

注意:R差S不等于S差R。

 

 

2、union 

SQL提供了union运算符,对集合进行关系并运算,但是没有直接提供集合交和集合差的操作,可以用其他方法来实现。

eg:在student表中,查询选修了1号或者10号课程的学生的学号,姓名,所在系信息。

 

查询结果:

上面的例子用or来实现如下:

 

查询结果:

观察上面两组结果可以知道:or运算符的结果比用union运算符的结果多出了两条重复的记录。因为集合操作自动去除重复的元组。而or运算符则不具备这个功能。当然也可以用distinct关键字去除上面结果中重复的记录。

另外,如果使用union运算符想要保留重复的记录的话,可以在union后面使用all关键字指明。即在union后加了all关键字后,结果和上面使用or的结果 是一样的。

 

eg2:对不同表的不同字段采用union运算符

在student表和teacher表中,查询选修了1号或者10号课程的学生姓名,所在系,课程号信息,以及1号或者10号课程的教师的姓名,所在系,课程号信息。

 

可见对于union运算符,只要求列的类型匹配即可,列名是可以不同的,如上面例子中的sname和tname;

如果要对union运算后的结果排序,可以在order by 后用序号的形式,这样就不用考虑结果存在列名问题。当然如果给不同列名取了相同的列名,则也不存在这个问题。

 

eg3:多表连接的综合运用

从student表中查询至少修过“计算机入门”或者“生物工程概论”两门课程中的一门的学生学号,姓名及所修课程名和课程成绩

分析:课程号和课程成绩在course表中,而学生的学号和姓名信息在student表中,显然需要对两个表根据cno进行等值内连接,分别查询两门课程之一的信息,而后进行集合并运算

查询代码如下:

 

查询结果如下:

 

3、多表连接的注意问题:

  • 连接多个表时,可以认为它们被连接成了一个表,尽管没有创建一个物理表,但是SQL连接创建了很多的虚表,当连接表时,可以在每个表中选择任何一列
  • 关于表的连接数量问题。取决于具体的数据库系统,但有一点是可定的,连接的表越多,相应时越长
  • 进行多表连接时要注意指明连接条件 ,如果不指明条件,系统会对多表进行笛卡尔积,会产生巨大的记录数量
  • 根据不同的需求,选择不同的连接类型