多表查询(三)------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连接创建了很多的虚表,当连接表时,可以在每个表中选择任何一列
- 关于表的连接数量问题。取决于具体的数据库系统,但有一点是可定的,连接的表越多,相应时越长
- 进行多表连接时要注意指明连接条件 ,如果不指明条件,系统会对多表进行笛卡尔积,会产生巨大的记录数量
- 根据不同的需求,选择不同的连接类型
- 多表查询(三)------Union
- 多表联合查询(join、union等)
- 多表联合查询(join、union等)
- 多表联合查询(join、union等)
- 多表联合查询(join、union等)
- 多表联合查询(join、union等)
- 多表联合查询(join、union等)
- UNION ALL多表搜索查询
- sql 多表的查询 union join
- UNION联合多表查询代码举例
- 组合查询(Union)
- MySQL 两表UNION查询
- MySQL组合查询(Union)
- 【Oracle sql基础】多表查询中的集合操作union all、union、intersect、minus
- 多表查询(三)
- Hibernate深入学习(三):继承与多态查询,joined-subclass与union-subclass
- Mysql中使用UNION语句进行多表连接查询
- Mysql中使用UNION语句进行多表连接查询
- pclint设置
- 【读书笔记】有些事现在不做——一辈子也不会做了
- 使用StatSVN的
- linuxIPC——消息队列
- 今天是第一天
- 多表查询(三)------Union
- WAP调试环境
- wxWidgets动态事件表爱好者备查手册(含wxWidgets事件ID列表)
- C语言常见错误
- php语言要素 - 连载(一)
- 判断页面是否加载完毕
- VS2008,vs2010 快捷键大全
- 在Eclipse3.1中如何配置Lomboz3.1
- JSF richfaces的dataTable组件中filter在IE和Firefox下不兼容的问题