MySQL INTERSECT运算符

时间:2019-11-20 08:52:06  来源:igfitidea点击:

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

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

INTERSECT运算符简介

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

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

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

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

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

  • 查询的选择列表中的顺序和列数必须相同。

  • 相应列的数据类型必须兼容。

下图说明了INTERSECT运算符。

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

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

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

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

请注意,SQL标准具有三个集合运算符,包括UNION,INTERSECT和MINUS。

在MySQL中模拟INTERSECT

不幸的是,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)使用DISTINCT和INNER JOIN子句模拟INTERSECT

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

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

这个怎么运作。

  • INNER JOIN子句从左表和右表返回行。

  • DISTINCT运算符删除重复的行。

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

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

SELECT DISTINCT id
FROM t1
WHERE id IN (SELECT id FROM t2);
id
----
2
3

这个怎么运作。

  • 子查询返回第一个结果集。

  • 外部查询使用IN运算符选择仅在第一个结果集中存在的值。
    DISTINCT运算符可确保仅选择不同的值。

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