在维护人事系统的时候,遇到两张无关的表的联合问题,就是将两张相互之间没有字段可以联系的表,但具有共同的名字的字段,合在一个报表中显示出来。这时就引出了union的使用。
什么是UNION?
它sql语句中的一种操作符,可以合并多个select语句结果集。但是需要注意的是select语句必须具有相同数量的列,且列必须具有相同的数据类型。
基本语法:
<span style="font-size:24px;">Selectcolumn_name(s) from table_name1 Union Select column_name(s)from table_name2</span>
实例:
将两张表user1和user2合并起来,数据如下:
id | name | sex |
---|---|---|
1 | 张三 | 男 |
2 | 李四 | 女 |
3 | 王五 | 男 |
id | name | sex |
---|---|---|
1 | 张三 | 男 |
2 | 马六 | 男 |
3 | 小七 | 女 |
Sql 语句是:
<span style="font-size:24px;">select * from user1 union select * from user2</span>
结果:
id | name | sex |
1 | 张三 | 男 |
2 | 李四 | 女 |
2 | 马六 | 男 |
3 | 王五 | 男 |
3 | 小七 | 女 |
使用union会将重复的数据自动去除,如果想保留重复的数据,可以使用union all操作符进行连接,如下:
<span style="font-size:24px;">select * from user1 union all select * from user2</span>
结果如下:
id | name | sex |
1 | 张三 | 男 |
2 | 李四 | 女 |
3 | 王五 | 男 |
1 | 张三 | 男 |
2 | 马六 | 男 |
3 | 小七 | 女 |
这样可以将两张表的数据合并在一起,但是还没有达到我想要的效果,我想要的是所有数据按照递增或递减的顺序进行显示,这样我可以知道总共有多少条数据,而不是上述的两种结果,仅仅是将原数据表的数据取出来。
在上述的基础上我们可以继续优化,
<span style="font-size:24px;">select ROW_NUMBER() over(order by id) as '序号',id,name,sex from (select * from user1 union all select * from user2)k</span>
显示结果如下:
序号 | id | name | sex |
1 | 1 | 张三 | 男 |
2 | 1 | 张三 | 男 |
3 | 2 | 马六 | 男 |
4 | 2 | 李四 | 女 |
5 | 3 | 王五 | 男 |
6 | 3 | 小七 | 女 |
小结:
SQL语句中有很多操作符可以使我们的操作变得更加简单,不需要做太多的查询而得到我们想要的结果。熟练掌握这些操作符的用法会给我们的操作带来极大的方便,大大提升我们的效率,达到事半功倍的效果。