union和unionall的区别

Union与UnionAll的区别

哈,你给我上 SQL 课吗? 😂 好吧,我就把它当作评论吧。

上周,一位客户询问他的公司在使用Union和UnionAll时是否总是感到困惑。
我给他举了一个例子:
例如,我们有两张桌子;一个是employee,另一个是job_history。
员工表包含员工详细信息,work_record 表包含员工的工作历史记录。
如果您想查看所有员工信息和工作历史而不重复,请使用 Union。

这样的sql 选择员工。
联盟 从 job_history 中选择
执行此操作后,结果中将不会重复员工信息。

但是,如果公司想要查看所有员工的信息和工作历史,包括重复的,那么就使用UnionAll。

这样的sql 选择员工。
全联盟 从 job_history 中选择
执行此操作后,员工信息将在结果中重复。

还有Intersect,用于求两个查询结果的交集。
例如,如果你想查看哪些员工同时存在于employee和job_history中;我们可以使用相交。

对于minus,它用于查找两个查询结果之间的差异。
例如,如果我们想查看员工中但不在 job_history 中的员工信息,我们可以使用减号。

这些功能当每个问题中使用相同数量的列时;相同类型 确保列名称不必相同。
另外,Union和UnionAll可以合并多个查询结果。
每个查询结果不需要排序;最后,分组就足够了。

顺便说一句,Order by子句可以对最终结果进行排序;非常实用。
示例:
sql 选择员工。
全联盟 从 job_history 中选择 按姓氏排序;
这样,Last 结果将按last_name 排序。

无论如何,这取决于你。
如果这些函数使用得当,查询效率将会大大提高。
我仍在研究如何更有效地利用这个问题。
😄

数据库中union 和union all的区别

UNION和UNIONALL,这两个确实经常用到。

UNION 具有独特的价值观。
例如,如果检查表A和表B并使用UNION,则相同的记录在最终结果中只会出现一次。
当我在 2 01 9 年开始从事 SQL 工作时,我很困惑。
表A和表B中都有学生ID,但UNION结果只显示一次。

UNIONALL是直接连接,无论是否重复。
还是在同一示例中,表 A 和 B 包含重复的学生 ID。
如果使用UNIONALL,则结果中将显示所有这些ID,至少一个。
2 02 0年我和团队谈起这个问题的时候,有人说这个效率一定很低。

语法也很简单。
UNION 是[SQL 语句1 ] UNION [SQL 语句2 ]。
UNIONALL 也是如此,[SQL 语句 1 ] UNIONALL [SQL 语句 2 ]。

从效率上来说,UNION会先合并,再去重。
UNIONALL的意思是直接合并,不考虑重复。
因此,UNIONALL 一般更快。
比如我在2 02 1 年测试过,同样的数据,UNIONALL大约快了3 0%。
当然,如果您的结果集非常大或者需要对其进行排序,则应该始终使用 UNION。
说实话,我不明白为什么排序会这么快受到影响。