SQL 中 or 和union

access2010查询中SQL数据操纵中写union,联合查询,将多个查询结果合并起来时,系统会自动去掉重复元组,做操作的时候感觉和or语句做出来的结果一样,就在想这两个有什么区别呢,所以上网查了查,真的有写它们之间的关系。

SQL 中 or 和union的区别:
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
select * from users1 union select * from user2
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
or是把符合两个条件的都查询出来取并集,不会去掉相同的记录。
select * from user1 where q = '1' or q='2'
就是把q = '1'和 q='2 的所有结果都返回,不去重的。

总结一下就是union会删除重复的记录,or不会去掉重复的记录,二者都是对结果集的合并。

另外一篇文章中提到where子句中使用or会引起全表扫描,一般的用union来代替or。事实证明,这种说法对于大部分都是适用的
看来,用union在通常情况下比用or的效率要高的多。但是如果or两边的查询列是一样的话,那么用union反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。

后来又思考了一下or和in的区别,or 是或者 两个条件满足一个就可以。in 用在于包含 (一段语句或者几个值 ),还有说in是把父查询源表和子查询表作hash连接。or是对父查询表作loop循环,每次loop循环再对子查询表进行查询。

猜你喜欢

转载自blog.csdn.net/lisainan66/article/details/106040944