MySQL相交

总结:在本教程中,我们将向您介绍 INTERSECT 运算符并展示如何模拟 MySQL INTERSECT 运算符。

请注意,MySQL 不支持该 INTERSECT 运算符。本教程向您介绍如何 INTERSECT 使用连接子句模拟MySQL 中的运算符。

INTERSECT 运算符介绍

该 INTERSECT 运算符是一组操作员只返回两个查询或多个查询的不同行。

下面说明了 INTERSECT 运算符的语法。

(SELECT column_list 
FROM table_1)
INTERSECT
(SELECT column_list
FROM table_2);

该 INTERSECT 运算符比较两个查询的结果集,并返回两个查询输出的不同行。

要将 INTERSECT 运算符用于两个查询,请遵循以下规则:

  1. 查询的选择列表中的顺序和列数必须相同。
  2. 对应列的数据类型必须兼容。

下图说明了 INTERSECT 运算符。

MySQL相交
MySQL相交

左侧查询产生的结果集为 (1,2,3)。

正确的查询返回 (2,3,4) 的结果集。

该 INTERSECT 运算符返回两个结果集的不同行,其中包括 (2,3)。

与 UNION 运算符不同,运算 INTERSECT 符返回两个圆之间的交点。

需要注意的是SQL标准有三个集合运算符,其中包括 UNION , INTERSECT ,和 MINUS 。

INTERSECT 在 MySQL 中模拟

不幸的是,MySQL 不支持该 INTERSECT 运算符。但是,您可以模拟 INTERSECT 操作员。

设置实例表

以下语句创建表 t1 和 t2 ,然后将数据插入到两个表中。

CREATE TABLE t1 (
    id INT PRIMARY KEY
);

CREATE TABLE t2 LIKE t1;

INSERT INTO t1(id) VALUES(1),(2),(3);

INSERT INTO t2(id) VALUES(2),(3),(4);

以下查询从 t1 表中返回行。

SELECT id FROM t1;

ID —- 1 2 3

以下查询返回表中的行 t2 :

SELECT id
FROM t2;

ID — 2 3 4

1) 模拟 INTERSECT using DISTINCT and INNER JOIN 子句

以下语句使用 DISTINCT 运算符和 INNER JOIN 子句返回两个表中的不同行:

SELECT DISTINCT 
   id 
FROM t1
   INNER JOIN t2 USING(id);

ID —- 2 3

这个怎么运作。

  1. 该 INNER JOIN 子句从左表和右表返回行。
  2. 该 DISTINCT 操作将删除重复的行。

2)模拟 INTERSECT 使用 IN 和子查询

以下语句使用 IN 运算符和子查询返回两个结果集的交集。

SELECT DISTINCT id
FROM t1
WHERE id IN (SELECT id FROM t2);

ID —- 2 3

这个怎么运作。

  1. 子查询返回第一个结果集。
  2. 外部查询使用 IN 运算符仅选择第一个结果集中存在的值。的 DISTINCT 操作者可确保只有不同的值被选择。

在本教程中,您学习了几种 INTERSECT 在 MySQL 中模拟运算符的方法。