组合查询知识点

在ORACLE里,提供了一些关键字用于操纵多张表的数据集合

–     UNION

–     UNION ALL

–     INTERSECT

–     Minus

 

 

首先,我们创建一张新的表,这张表的结构和student表一样,数据由我们自己录入。我们可以使用复制表的语法

 

 

然后插入一些新的学生数据

 

 

下面,如果我们想1次性地对外返回这2张表的所有数据时,我们可以使用union

 

 

也可以使用union all

 

 

 

 

 

 

 

 

结果是一样的,那么union和union all到底有什么区别呢?

让我们再插入一些数据

 

 

现在,我们发现student和new_student中出现了2条相同的记录,然后我们分别使用union和union all来查询数据看看结果

使用union

 

 

使用union all

 

 

也就是说,union会自动驱除掉2张表里重复的数据,如果有重复的数据的话只显示1次,而union all不会驱除重复的数据,是纯粹地将2张表的所有数据查出来“拼接”在了一起

 

注意,不论使用union 还是union all,都需要表之间查询的列的个数和类型相匹配

 

 

当然,并不需要2张表的结构完全一样,我们只需要查询的列相匹配即可,例如查询student和subject里的所有学号

 

 

之前,我们学习过了向1张表里插入来自另外1张表的信息

 

 

那么,能不能向1张表里插入来自多张表的数据呢?

利用union all,我们可以很轻松地实现这样的功能。

现在向new_student_test表中插入来自student和new_student这2张表的数据

 

只要我们需要可以任意连接多张表,3,4,5张都可以

 

 

现在我们想要查询出student和new_student中重复的数据,可以使用子查询这样做

 

 

但是,我们可以更简单地使用Intersect 取交集 即专门查询重复的数据

 

 

 

同理,我们也可以简单地使用minus 取减集

 

 

 

 

 

 

 

注意是上面的查询结果集合减去下面的结果集合

因此minus并不能获得2张表里不重复的数据

 

 

如果想要查询2张表里不重复的记录的话,可以换个角度思考

2张表中不重复的记录等于2张表中的所有记录减去2张表中重复的记录

那么使用组合查询再结合子查询我们可以达到目的

 

 

 

 

minus同样可以用于oracle的分页语句中(但是不规范,超过200条记录后可能会出错

例如查询第11条至第15条记录

第11条至第15条记录等于前15条检录减去前10条记录

posted @ 2009-07-31 11:17  小开的一天  阅读(351)  评论(0编辑  收藏  举报