我们想列出公司中所有员工(包括临时工)的姓名和年龄信息,那么可以执行下面的SQL语句:
SELECT FName, FAge FROM T_Employee
UNION SELECT FName, FAge FROM T_TempEmployee
执行结果:
+---------+------+
| fname | fage |
+---------+------+
| Tom | 25 |
| Jerry | 28 |
| Potter | NULL |
| Jane | 23 |
| Tina | 25 |
| Smith | 28 |
| NULL | 27 |
| Timmy | 25 |
| Stone | 35 |
| Sarani | 32 |
| Yalaha | 37 |
| Konkaya | 28 |
| Fotifa | 45 |
| James | 23 |
+---------+------+
仔细观察结果集,我们发现输出的结果和预想的是不一致的。在正式员工中有名为Tom、年龄为26,以及姓名为Tina、年龄为26,而临时工也有姓名为Tom、年龄26以及姓名为Tina、年龄为26的两名员工。也就是说正式员工和临时工中存在崇明和年龄重复的现象,但是在查询结果中却将重复的信息只保留了一条,也就是只有一个姓名为Tom、年龄为26的员工和一个姓名为Tina、年龄为26的员工。
这是因为默认情况下,UNION合并了两个查询结果集,其中完全重复的数据行被合并为一条。如果需要在联合结果集中返回所有记录而不管它们是否唯一,则需要在UNION后使用ALL,比如下面的SQL语句:
SELECT FName, FAge FROM T_Employee
UNION ALL SELECT FName, FAge FROM T_TempEmployee
+------+---------+
| fage | fname |
+------+---------+
| 25 | Tom |
| 28 | Jerry |
| NULL | Potter |
| 23 | Jane |
| 25 | Tina |
| 28 | Smith |
| 27 | NULL |
| 25 | Timmy |
| 35 | Stone |
| 32 | Sarani |
| 25 | Tom |
| 37 | Yalaha |
| 25 | Tina |
| 28 | Konkaya |
| 45 | Fotifa |
| 23 | James |
+------+---------+