什么是联合查询
联合查询,也叫合并查询,是指查询多个表的结果合并在一起输出。在SQL Server中,可以使用UNION、UNION ALL、INTERSECT和EXCEPT等关键字来实现联合查询。
使用联合查询的原因
当需要从多个表中检索数据时,联合查询能够帮助我们快捷地获得要查找的数据,而且可以将多个查询结果整合在一起,方便进行数据分析和处理。
使用UNION实现联合查询
UNION的使用
UNION关键字可以用于将两个或多个SELECT语句的结果合并成一个结果集。需要注意的是,使用UNION做联合查询时,要求使用联合查询的两个SELECT语句必须具有相同的列数和相似的数据类型。
以下是使用UNION实现联合查询的一般语法:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
例如,我们有两个表sales2019和sales2020,分别记录了两年的销售数据:
-- sales2019表结构
CREATE TABLE sales2019 (
id INT IDENTITY(1,1) PRIMARY KEY,
product VARCHAR(50) NOT NULL,
sales_volume INT NOT NULL,
sales_revenue DECIMAL(10, 2) NOT NULL,
sales_date DATE NOT NULL
);
-- sales2020表结构
CREATE TABLE sales2020 (
id INT IDENTITY(1,1) PRIMARY KEY,
product VARCHAR(50) NOT NULL,
sales_volume INT NOT NULL,
sales_revenue DECIMAL(10, 2) NOT NULL,
sales_date DATE NOT NULL
);
我们可以使用以下SELECT语句实现对这两个表的联合查询:
SELECT '2019' AS year, product, sales_volume, sales_revenue, sales_date
FROM sales2019
UNION
SELECT '2020' AS year, product, sales_volume, sales_revenue, sales_date
FROM sales2020;
上述SQL将返回2019年和2020年的销售数据,其中使用year列区别两年的数据。
UNION ALL的使用
UNION ALL关键字在使用上与UNION类似,不同之处在于它不会去除重复的行,而是返回所有行。
以下是使用UNION ALL实现联合查询的一般语法:
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
例如,我们可以使用以下SELECT语句获得2019年和2020年的销售数据,同时还需要显示销售数据所对应的年份信息:
SELECT '2019' AS year, product, sales_volume, sales_revenue, sales_date
FROM sales2019
UNION ALL
SELECT '2020' AS year, product, sales_volume, sales_revenue, sales_date
FROM sales2020;
使用INTERSECT和EXCEPT实现联合查询
除了使用UNION和UNION ALL实现联合查询,SQL Server还提供了INTERSECT和EXCEPT关键字实现联合查询。
INTERSECT关键字
INTERSECT关键字可以用于求两个SELECT语句的交集,返回两个查询结果集中共同存在的行。
以下是使用INTERSECT实现联合查询的一般语法:
SELECT column_name(s) FROM table1
INTERSECT
SELECT column_name(s) FROM table2;
例如,我们可以使用以下SELECT语句实现求sales2019表和sales2020表中共同存在的销售数据:
SELECT product, sales_volume, sales_revenue, sales_date
FROM sales2019
INTERSECT
SELECT product, sales_volume, sales_revenue, sales_date
FROM sales2020;
EXCEPT关键字
EXCEPT关键字可以用于求两个SELECT语句的差集,返回第一个查询结果集中存在,且第二个查询结果集中不存在的所有行。
以下是使用EXCEPT实现联合查询的一般语法:
SELECT column_name(s) FROM table1
EXCEPT
SELECT column_name(s) FROM table2;
例如,我们可以使用以下SELECT语句实现求sales2019表中存在,但sales2020中不存在的销售数据:
SELECT product, sales_volume, sales_revenue, sales_date
FROM sales2019
EXCEPT
SELECT product, sales_volume, sales_revenue, sales_date
FROM sales2020;
总结
联合查询是SQL Server中常用的查询技术,可以帮助我们高效地从多个表中获取需要的数据。在使用联合查询时,需要注意SELECT语句的列数和数据类型等必须相同或相似,同时需要根据实际需求选择合适的联合查询关键字。