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

基本表: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连接创建了很多的虚表,当连接表时,可以在每个表中选择任何一列
  • 关于表的连接数量问题。取决于具体的数据库系统,但有一点是可定的,连接的表越多,相应时越长
  • 进行多表连接时要注意指明连接条件 ,如果不指明条件,系统会对多表进行笛卡尔积,会产生巨大的记录数量
  • 根据不同的需求,选择不同的连接类型

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值