SQL INTERSECT

SQL Server 的 INTERSECT 是集合运算符之一,它从左侧查询(左表)和右侧查询(右表)返回所有共同记录。本文将向您展示如何在 SELECT 语句中使用 INTERSECT 及其用例场景。

INTERSECT 运算符允许您查找跨表的公共行。在实际应用中,您可以使用此运算符来合并不同平台或地区的销售数据,以发现购买模式。

当有两个表时,我们可以称之为左表和右表。通常,SQL Server 的 INTERSECT 运算符会合并两个或多个 SELECT 语句中的行,删除不共同或唯一的记录,并返回匹配的行。最好的部分是它会删除重复的行。

SQL INTERSECT

以下是 INTERSECT 运算符的一组规则

  1. 首先,所有 SELECT 语句中的列数必须相同。
  2. 列数据类型应相互兼容。
  3. 第三,所有 SELECT 语句中的列的顺序必须相同。

在实际示例之前,下面的图片将帮助您理解 EXCEPT 和 INTERSECT 运算符。

SQL Server INTERSECT 语法

Intersect 背后的语法是

SELECT Column_Name1, Column_Name2 ......., Column_NameN FROM Table1
INTERSECT
SELECT Column_Name1, Column_Name2 ......., Column_NameN FROM Table2

从语法定义本身可以看出,intersect 运算符逐行执行,并查找所有 select 语句中存在的行。下图显示了交集的图示表示。

VEN Diagram 1

为了进行演示,我们将在数据库中使用两个表。从下图可以看出,[Employ] 表有十条记录

而 [Employees 2016] 表有四行。只有一个不同的记录(9, Rob, Verhoff),其余三条是相同的。

SQL Server Intersect 示例

INTERSECT 通常用于检索两个表之间的公共记录。以下查询返回 Employ 和 Employees 2016 表中的所有公共记录,并显示结果集。

SELECT [ID]
      ,[FirstName]
      ,[LastName]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
FROM [Employ]
  INTERSECT
SELECT [ID]
      ,[FirstName]
      ,[LastName]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
FROM [Employees 2016]
SQL INTERSECT set operator Distinct records Example 3

SQL Server Intersect WHERE 子句示例

以下查询展示了如何将此运算符与 WHERE 子句一起使用。在此示例中,我们组合了两个语句

  • 第一个 SQL Server 结果集从 Employ 中选择记录,其年收入大于或等于 70000
  • 第二个结果集选择 [Employees 2016] 表中的所有记录。
  • 此运算符选择第一个结果集和第二个结果集中的所有公共记录。
SELECT [ID]
      ,[FirstName]
      ,[LastName]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
FROM [Employ]
WHERE [YearlyIncome] >= 70000
 INTERSECT
SELECT [ID]
      ,[FirstName]
      ,[LastName]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
FROM [Employees 2016]
INTERSECT Where Clause Example 4

Intersect 错误 – 列和数据类型不匹配

以下查询将显示在此 SQL Intersect 查询中工作时常见的错误。为此,我们将使用数据库中存在的两个表(Employee 和 [Employees 2016])。下图显示 [Employee] 表有 7 列和 14 行。

让我们看看当我们选择两个表中的所有列时出现的问题。首先,这意味着对不相等长度的列执行 intersect 操作。

SELECT [FirstName]
      ,[LastName]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
      ,[HireDate]
  FROM [Employee]
  INTERSECT
SELECT * FROM [Employees 2016]
Messages
--------
Msg 205, Level 16, State 1, Line 2
All queries combined using operator must have an equal number of expressions in their target lists.

我想您能读懂这条消息。现在,让我们稍微更改一下查询以选择相同数量的列。

SELECT [FirstName]
      ,[LastName]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
FROM [Employee]
 INTERSECT
SELECT [FirstName]
      ,[LastName]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
FROM [Employees 2016]

从下面的 Intersect 屏幕截图中,您可以看到它返回了 3 条记录。因为只有一个不同的记录(Rob, Verhoff),[Employees 2016] 中的其余三条记录也存在于 Employee 表中。我们的运算符仅选择两个表中的公共记录。

INTERSECT 6

评论已关闭。