联合查询
一、
在数据库操作中,联合查询(UNION Query)是一种非常有用的 SQL 操作,它允许我们将两个或多个 SELECT 语句的结果组合起来,这些 SELECT 语句必须具有相同数量的列,且相应列的数据类型要兼容,联合查询常用于以下情况:
当需要从多个表中获取相似结构的数据,并将它们整合到一个结果集中时,有两个不同部门的员工信息表,结构相同但数据不同,我们想获取所有员工的信息,就可以使用联合查询。
对同一表中的不同条件查询结果进行合并,比如一个订单表,我们既想查询已发货的订单,又想查询未发货的订单,并整合在一起查看。
二、语法结构
基本的联合查询语法如下:
SELECT column1, column2, ... FROM table1 UNION SELECT column1, column2, ... FROM table2;
UNION
操作符用于合并两个结果集,并且会自动去除重复的行,如果要保留所有行(包括重复行),可以使用UNION ALL
。
有两张表employees_a
和employees_b
,它们的结构都是(id, name, department)
,如果我们想获取所有员工的姓名,可以这样写查询:
SELECT name FROM employees_a UNION SELECT name FROM employees_b;
三、示例说明
假设我们有以下两个表:
表名 | 结构 | 数据 |
students_math | id (int), name (varchar), score (int) | id: 1, name: 'Alice', score: 85 id: 2, name: 'Bob', score: 90 |
students_english | id (int), name (varchar), score (int) | id: 3, name: 'Charlie', score: 88 id: 4, name: 'David', score: 95 |
(一)简单联合查询
如果我们想获取所有学生的姓名和成绩,不管他们是数学还是英语科目的学生,可以使用联合查询:
SELECT name, score FROM students_math UNION SELECT name, score FROM students_english;
结果可能如下:
name | score |
Alice | 85 |
Bob | 90 |
Charlie | 88 |
David | 95 |
(二)带条件的联合查询
如果只想获取成绩大于 80 分的学生信息,可以在每个子查询中添加条件:
SELECT name, score FROM students_math WHERE score > 80 UNION SELECT name, score FROM students_english WHERE score > 80;
此时结果为:
name | score |
Bob | 90 |
Charlie | 88 |
David | 95 |
四、相关问题与解答
(一)问题
1. 联合查询中使用UNION ALL
和UNION
有什么区别?
答:UNION
会自动去除重复的行,而UNION ALL
会保留所有的行,包括重复行,如果两个子查询中有相同的一行数据,使用UNION
只会显示一次,而UNION ALL
会显示两次,如果数据中可能存在重复且我们希望保留这些重复记录,就使用UNION ALL
;如果想要唯一的记录集,则使用UNION
。
2. 联合查询中的列数据类型不匹配会怎样?
答:在联合查询中,如果相应列的数据类型不匹配,数据库系统可能会报错,一个子查询中某列是整数类型,另一个子查询中对应列是字符串类型,这种情况下联合查询就无法成功执行,所以在编写联合查询时,要确保各个子查询中对应的列具有兼容的数据类型,比如都可以是数值类型或者都可以是字符串类型等。