MySQL 中数据的检索(八:联合结果集)
2018-03-21 21:25
357 查看
有的时候需要组合两个完全不同的查询结果集,而这两个查询结果之间没有必然的联系,只是我们需要将他们显示在一个结果集中而已。可以使用 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 运算符要放置在两个查询语句之间。
SELECT FNumber,FName,FAge FROM T_Employee # 查询正式员工信息
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee #查询临时工信息用 UNION 操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果集。
查询公司所有员工(包括临时工)的标识号码、姓名、年龄信息:
SELECT FNumber,FName,FAge FROM T_Employee
UNION
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee用 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:是每个结果集必须有相同的列数; 如果第一个结果集返回了 4 列数据,第二个结果集则返回了 3 列数据,数据库系统并不会用空值将第二个结果集补足为 4 列。 如果需要将未知列补足为一个默认值,那么可以使用常量字段: 下面的 SQL 语句就将第二个结果集的与 FDepartment 对应的字段值设定为 “临时工,不属于任何一个部门”: SELECT FNumber,FName,FAge,FDepartment FROM T_Employee UNION SELECT FIdCardNumber,FName,FAge,'临时工,不属于任何一个部门' FROM T_TempEmployee 原则2:每个结果集的列必须类型相容。 也就是说结果集的每个对应列的数据类型必须相同或者能够转换为同一种数据类型。 SELECT FIdCardNumber,FAge,FName FROM T_TempEmployee UNION SELECT FNumber,FName,FAge FROM T_Employee 此语句在 MySQL 中可以正确执行,因为 MYSQL 将 FAge 转换为了文本类型,以便于与FName字段值匹配, 但这个 SQL 语句在 MSSQLServer、Oracle、DB2中执行则会报错,因为这些数据库系统不会像 MYSQL 那样进行默认的数据类型转换。 三、UNION ALL 列出公司中所有员工(包括临时工)的姓名和年龄信息,那么我们可以执行下面的SQL语句: SELECT FName,FAge FROM T_Employee UNION SELECT FName,FAge FROM T_TempEmployee 可以发现输出的结果和预想的是不一致的,在正式员工中有姓名为 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 四、联合结果集应用 查询员工的最低年龄和最高年龄,临时工和正式员工要分别查询: SELECT '正式员工最高年龄',MAX(FAge) FROM T_Employee UNION SELECT '正式员工最低年龄',MIN(FAge) FROM T_Employee UNION SELECT '临时工最高年龄',MAX(FAge) FROM T_TempEmployee UNION SELECT '临时工最低年龄',MIN(FAge) FROM T_TempEmployee 查询每位正式员工的信息,包括工号、工资,并且在最后一行加上所有员工工资额合计: SELECT FNumber,FSalary FROM T_Employee UNION SELECT '工资合计',SUM(FSalary) FROM T_Employee 打印出打印5以内自然数以及它们的平方数: SELECT 1,1 * 1 UNION SELECT 2,2 * 2 UNION SELECT 3,3 * 3 UNION SELECT 4,4 * 4 UNION SELECT 5,5 * 5 列出公司中所有员工(包括临时工)的姓名,将重复的姓名过滤掉: SELECT FName FROM T_Employee UNION SELECT FName FROM T_TempEmployee 分别列出正式员工和临时工的姓名,要保留重复的姓名: SELECT '以下是正式员工的姓名' UNION ALL SELECT FName FROM T_Employee UNION ALL SELECT '以下是临时工的姓名' UNION ALL SELECT FName FROM T_TempEmployee
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 运算符要放置在两个查询语句之间。
SELECT FNumber,FName,FAge FROM T_Employee # 查询正式员工信息
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee #查询临时工信息用 UNION 操作符连接这两个查询语句就可以将两个查询结果集联合为一个结果集。
查询公司所有员工(包括临时工)的标识号码、姓名、年龄信息:
SELECT FNumber,FName,FAge FROM T_Employee
UNION
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee用 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:是每个结果集必须有相同的列数; 如果第一个结果集返回了 4 列数据,第二个结果集则返回了 3 列数据,数据库系统并不会用空值将第二个结果集补足为 4 列。 如果需要将未知列补足为一个默认值,那么可以使用常量字段: 下面的 SQL 语句就将第二个结果集的与 FDepartment 对应的字段值设定为 “临时工,不属于任何一个部门”: SELECT FNumber,FName,FAge,FDepartment FROM T_Employee UNION SELECT FIdCardNumber,FName,FAge,'临时工,不属于任何一个部门' FROM T_TempEmployee 原则2:每个结果集的列必须类型相容。 也就是说结果集的每个对应列的数据类型必须相同或者能够转换为同一种数据类型。 SELECT FIdCardNumber,FAge,FName FROM T_TempEmployee UNION SELECT FNumber,FName,FAge FROM T_Employee 此语句在 MySQL 中可以正确执行,因为 MYSQL 将 FAge 转换为了文本类型,以便于与FName字段值匹配, 但这个 SQL 语句在 MSSQLServer、Oracle、DB2中执行则会报错,因为这些数据库系统不会像 MYSQL 那样进行默认的数据类型转换。 三、UNION ALL 列出公司中所有员工(包括临时工)的姓名和年龄信息,那么我们可以执行下面的SQL语句: SELECT FName,FAge FROM T_Employee UNION SELECT FName,FAge FROM T_TempEmployee 可以发现输出的结果和预想的是不一致的,在正式员工中有姓名为 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 四、联合结果集应用 查询员工的最低年龄和最高年龄,临时工和正式员工要分别查询: SELECT '正式员工最高年龄',MAX(FAge) FROM T_Employee UNION SELECT '正式员工最低年龄',MIN(FAge) FROM T_Employee UNION SELECT '临时工最高年龄',MAX(FAge) FROM T_TempEmployee UNION SELECT '临时工最低年龄',MIN(FAge) FROM T_TempEmployee 查询每位正式员工的信息,包括工号、工资,并且在最后一行加上所有员工工资额合计: SELECT FNumber,FSalary FROM T_Employee UNION SELECT '工资合计',SUM(FSalary) FROM T_Employee 打印出打印5以内自然数以及它们的平方数: SELECT 1,1 * 1 UNION SELECT 2,2 * 2 UNION SELECT 3,3 * 3 UNION SELECT 4,4 * 4 UNION SELECT 5,5 * 5 列出公司中所有员工(包括临时工)的姓名,将重复的姓名过滤掉: SELECT FName FROM T_Employee UNION SELECT FName FROM T_TempEmployee 分别列出正式员工和临时工的姓名,要保留重复的姓名: SELECT '以下是正式员工的姓名' UNION ALL SELECT FName FROM T_Employee UNION ALL SELECT '以下是临时工的姓名' UNION ALL SELECT FName FROM T_TempEmployee
相关文章推荐
- MySQL 中数据的检索(五:抑制数据重复)
- MySQL 中数据的检索(六:计算字段)
- MySQL 中数据的检索(七:不从实体表中取的数据)
- MySQL 中数据的检索(一:select 语句的基本用法)
- MySQL 中数据的检索(二:高级数据过滤)
- MySQL 中数据的检索(三:数据分组)
- MySQL 中数据的检索(四:限制结果集行数)
- Mysql联合查询UNION和UNION ALL的使用介绍
- mysql的联合索引
- MySQL联合查询语法内联、左联、右联、全联
- MySQL联合查询语法内联、左联、右联、全联
- 关于MYSQL中like 检索汉字问题。
- MySQL(二)数据的检索和过滤
- MySQL全文检索
- MySQL全文检索中Like索引的实现
- 4、MySQL 8.0参考手册 连接到服务器并断开连接3.3.4从表中检索信息
- MySQL连接查询(交叉连接,左连接,右连接,全连接,子查询,联合查询)
- 解决MySQL 在 Java 检索遇到timestamp空值时报异常的问题
- 05、MySQL外键、联合查询和子查询
- MySQL--操作简记(select检索、order by排序数据)