SQL UNION 和 UNION ALL 操作符

总结一下SQL中的连接运算符!union和union all都是用来连接SQL 查询语句的!

要点一:UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同,就比如,第一条语句查询的是姓名和年龄分别是nvarchar和int类型的,那么联合的语句查询的字段也应该是同样的类型,和顺序。

要点二:默认地,UNION 操作符选取不同的值(就是加载的都不一样,不会有重复的数据,如果有两条数据一模一样,就只会出现一条数据)。如果想得到所有数据,请使用 UNION ALL(ALL不就是所有的意思嘛!)

要点三:UNION 查询结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名,意思就是两条语句查询的总数据的列名按照第一条查询语句走,比如两条查询的字段都一样,但是第一条查询语句把字段重新命名了(select Name as 姓名 from 表),这时第一列的名字就不是Name了,而是被重新命名的:“姓名”。

代码实例:

这里用两张表,一张学生表 一张教师表!字段分别是:主键  姓名(老师或学生)年龄 生日。

 

代码语法:

SELECT SName,Age from DB_Students  --第一条语句查询学生的姓名和年龄
union
SELECT TName,Age from DB_Teachers  --第二条语句查询老师的姓名和年龄

运行结果:

查询到结果是:学生所有数据和老师所有数据,可以看出,老师学生总数据的一列的列名为SName,因为第一条查询语句用的SName。下边将数据修改一下,让有重复的数据,再用上边代码执行看结果

将两张表都修改一条数据为:姓名为:小明,年龄为:15,但结果只出现一条小明的数据。

 

 

结果为:

联合的两个语句,类型要相同,顺序要相同,如果不相同,就无法执行,看代码:

SELECT SName,Age,Bitthday from DB_Students  --第一条语句查询学生的姓名和年龄和生日
union
SELECT TName,Age from DB_Teachers  --第二条语句查询老师的姓名和年龄

报错:

union会去重,union all不会,看代码:

SELECT * FROM DB_Students
SELECT * FROM DB_Students

两条同样的语句,查询全表,但是如果用union连接,就会只出现三条数据:

SELECT * FROM DB_Students
union
SELECT * FROM DB_Students

而如果用union all的话就还会出现六条数据,在效率上union all肯定要比union高的,因为少了去重这一步!

 

posted @ 2019-06-04 22:22  初晨~  阅读(5086)  评论(0编辑  收藏  举报