MySQL INTERSECT

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

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

INTERSECT运算符简介

INTERSECT运算符是一个集合运算符,它仅返回两个查询或多个查询的不同行。

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

(SELECT column_list 
FROM table_1)
INTERSECT
(SELECT column_list
FROM table_2);Code language: SQL (Structured Query Language) (sql)

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

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

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

下图说明了INTERSECT运算符。

MySQL INTERSECT

左侧查询生成结果集 (1,2,3)。

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

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

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

请注意,SQL 标准具有三个集合运算符,包括UNIONINTERSECTMINUS

在 MySQL 中模拟INTERSECT

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

设置样本表

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

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);Code language: SQL (Structured Query Language) (sql)

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

SELECT id FROM t1;Code language: SQL (Structured Query Language) (sql)
id
----
1
2
3

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

SELECT id
FROM t2;Code language: SQL (Structured Query Language) (sql)
id
---
2
3
4

1) 使用DISTINCTINNER JOIN子句模拟INTERSECT

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

SELECT DISTINCT 
   id 
FROM t1
   INNER JOIN t2 USING(id);Code language: SQL (Structured Query Language) (sql)
id
----
2
3

怎么运行的。

  1. INNER JOIN子句返回左表和右表中的行。
  2. DISTINCT运算符删除重复的行。

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

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

SELECT DISTINCT id
FROM t1
WHERE id IN (SELECT id FROM t2);Code language: SQL (Structured Query Language) (sql)
id
----
2
3

怎么运行的。

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

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

本教程有帮助吗?