我想问下数据库INSERT语句中的union all有什么用呢?

昨天我在超市买了牛奶,发现保质期只有3 天。
时间太短了,让我有点惊讶。
等等,那是另一回事了。
我突然想到3 天的保质期和数据库中的查询语句有些类似。

比如我想在数据库的两个表中查找员工信息,相当于数学中的交集。
我可以使用查询语句:
从员工中选择,部门 = 'IT' 经理 从员工中选择,部门 = 'HR';
这个查询就像冰箱里的牛奶一样,只取出符合条件的部分。

相反,如果我只想找到IT部门的员工,这对应于数学中的差集。
我可以使用另一个搜索:
从员工中选择 WHERE 部门 = 'IT' 除了从员工中选择 WHERE 部门 = 'HR';
这就好比超市里的牛奶,只挑选IT部门的,其他部门的不包括在内。

再比如,我想在两个表中列出所有员工信息,不管他们是否属于IT部门。
这对应于数学中的并集。
我可以使用查询语句:
从员工中选择 WHERE 部门 = 'IT' UNION 从员工中选择 WHERE 部门 = 'HR';
就像超市里的牛奶一样,不管有没有3 天保质期,都是配制好的。

但是如果是超市买的牛奶,保质期短也没关系。
如果你操作数据库的话,就需要小心了。
毕竟,数据丢失或失败是一件大事。
因此,查询语句必须像牛奶一样新鲜、准确。
等等,那是另一回事了。
我突然想到,数据库中的查询语句是不是也像牛奶一样,越新鲜越有价值呢?

数据库中union 和union all的区别

上次帮同事查数据,他搞了好久,终于发现用的是UNIONALL。
结果出现了很多重复的记录,让后续的扫描变得特别麻烦。
我告诉他在你的情况下使用 UNION 不是更好吗?他一开始不相信,就尝试了一下,结果再也没有发生过。

记得刚学SQL的时候,我多次混淆UNION和UNIONALL。
记得有一次我在公司加班到晚上1 1 点,这就是我在屏幕前摸不着头脑的原因。
查了资料并向大师请教后,大师给我举了一个例子。
这肯定是联盟正在发生的事情。
当时我突然想到,我想,这不是很简单吗?
但是到了实际使用的时候,问题就出现了。
有时你知道两个结果集肯定不重复,所以使用 UNIONALL 速度非常快。
但有时候你不确定,还是用UNION保险比较好。
排序问题也很烦人。
上次有一个请求。
客户想要按日期排序。
结果我用了UNIONALL。
最后数据也差不多找到了,但是顺序完全乱了。
重新排列顺序后,又花了半天时间。

等等,还有别的事。
我发现某些数据库系统以不同方式处理 UNION。
例如,MySQL 和 Oracle 在处理空值的方式上存在差异。
记得有一次我用MySQL写了一个UNION查询,发现null值被当成了“空”,这和预想的不一样。
后来改用了Oracle的写法。
这提醒我,在使用UNION时,必须要考虑到数据库兼容性问题。







这就是联盟成功的原因。
但如果数据量特别大或者性能要求特别高,还是需要了解基本原理。
就像上一个项目,数据量是千万级,使用UNIONALL查询会需要几秒钟的时间。
只需使用 UNION 即可。
这背后的原理是什么?

数据库的左连接是如何实现的

合并结果集意味着合并两个查询结果。

Union SELECT 示例 SELECT FROM t1 UNION SELECT FROM t2
UNIONALL 不会像 SELECT FROM t1 UNION ALL SELECT FROM t2 那样删除重复项。

Inner join是一种方言,标准是Inner JOIN;例如 SELECT FROM emp INNER JOIN dept ON emp.deptno = dept.deptno
如果不满足,则左 JOIN 填充 NULL。
LIKE SELECT FROM emp LEFT JOIN dept ON emp.deptno = dept.deptno。

SELECT FROM emp RIGHT JOIN Dept ON Dept ON emp.deptno = dept.deptno 将整个右表连接到右侧。

自然连接会自动查找与 SELECT FROM emp NATURAL JOIN dept 具有相同名称和类型的列。

给自己计时。