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高的,因为少了去重这一步!