三、SQL—数据检索④(union)
联合结果集:union
有时我们需要组合两个完全不同的查询结果集,而这两个查询结果之间没有必然的联系,只需他们显示在一个结果集中,在SQL中可以使用UNION运算符来将两个或者多个查询结果集联合为一个结果集中。
数据准备:创建一个临时工信息表
CREATE TABLE T_TempEmployee
(
FIdCardNumber VARCHAR(20),
FName VARCHAR(20),FAge INT ,
PRIMARY KEY (FIdCardNumber)
)
由于临时工没有分配工号,所以使用身份证号码FIdCardNumber来标识一个临时工,同时临时工不是实行月薪制,所以没有记录月薪信息。给临时工信息表插入初始数据
INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES("1234567890121","Sarani",33);
INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES("1234567890122","Tom",26);
INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES("1234567890123","Yalaha",38);
INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES("1234567890124","Tina",26);
INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES("1234567890125","Konkaya",29);
INSERT INTO T_TempEmployee(FIdCardNumber,FName,FAge) VALUES("1234567890126","Fotifa",46);
union:放在两个查询语句之间
如:查询公司所有员工(包括临时工)的标识号码、姓名、年龄信息
查询正式员工信息的SQL语句如下:
SELECT FNumber,FName,FAge FROM T_Employee
查询临时工信息的SQL语句如下:
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
*用UNION操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果集,SQL语句如下:
SELECT FNumber,FName,FAge FROM T_Employee
UNION
SELECT FIdCardNumber,FName,FAge
FROM T_TempEmployee
*UNION可以连接多个结果集,就像“+”可以连接多个数字一样,只要在每个结果集之间加入UNION即可
如:连接了三个结果集
SELECT FNumber,FName,FAge FROM T_Employee
WHERE FAge<30
UNION
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
WHERE FAge>40
UNION
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
WHERE FAge<30
联合结果集的原则:
1,每个结果集必须有相同的列数
2,每个结果集的列必须类型相容(数据类型相同,或能转换为同一数据类型)
3,完全重复的数据行会被合并为一条
如:每个结果集有不同列时会出现如下报错:使用UNION、INTERSECT 或EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。
错误:
SELECT FNumber,FName,FAge,FDepartment FROM T_Employee
UNION
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
第一个有四列,第二个三列,而数据库不会用空值把第二个自动补充为四列。因此,可以为第二个的第四列设置一个常量字段。如:
SELECT FNumber,FName,FAge,FDepartment FROM T_Employee
UNION
SELECT FIdCardNumber,FName,FAge,'临时工,不属于任何一个部门' FROM T_TempEmployee
*若数据不相容,则报错:表达式必须具有与对应表达式相同的数据类型。
如下:MYSQL将FAge转换为了文本类型,以便于与FName字段值匹配。
SELECT FIdCardNumber,FAge,FName FROM T_TempEmployee
UNION
SELECT FNumber,FName,FAge FROM T_Employee
该语句在其他数据库就会报错,因为其他数据库不会默认进行数据类型转换,为保证其可移植性,最好使其对应列数据类型相同。
union all:全链接,不会合并连接的相同结果集
如:上年的两个表中有重复数据,Tom和Tina在两个表中都存在,却不是同一个人。这时就可以用union all进行联合
SELECT FName,FAge FROM T_Employee
UNION ALL
SELECT FName,FAge FROM T_TempEmployee
运行结果:
FName FAge
Tom 26
Jerry 29
Jane 24
Tina 26
Smith 29
<NULL> 28
John 24
Kerry 29
Stone 23
Sarani 33
Tom 26
Yalaha 38
Tina 26
Konkaya 29
Fotifa 46