MySQL INTERSECT运算符


本MySQL教程将通过语法和示例说明了如何实现Mysql相交查询。

尽管MySQL中没有INTERSECT运算符,但是根据INTERSECT查询的特点,可以使用IN子句或EXISTS子句轻松模拟这种类型的查询。

首先,让我们解释什么是INTERSECT查询。INTERSECT查询返回两个或多个数据集的交集。如果两个数据集中都存在一条记录,那么该记录将被包含在INTERSECT结果集中。但是,如果记录仅存在其中一个数据集中,则会将其从INTERSECT结果中省略。

mysql相交查询

说明: 相交查询将返回蓝色阴影区域中的记录。

语法

SQL中INTERSECT运算符的语法为:

1
2
3
4
5
6
7
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
INTERSECT
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

使用IN运算符模拟INTERSECT查询

由于无法在MySQL中使用INTERSECT运算符,因此可以使用IN运算符来模拟INTERSECT查询,如下所示:

1
2
3
SELECT products.category_id
FROM products
WHERE products.category_id IN (SELECT inventory.category_id FROM inventory);

返回产品和库存表之间的都拥有的category_id。

对应的INTERSECT查询语句为:

1
2
3
4
5
SELECT category_id
FROM products
INTERSECT
SELECT category_id
FROM inventory;

附加筛选条件的相交查询

1
2
3
4
5
6
7
SELECT category_id
FROM products
WHERE category_id < 100
INTERSECT
SELECT category_id
FROM inventory
WHERE quantity > 0;

下面是在mysql使用IN运算符模拟有筛选条件的相交查询:

1
2
3
4
5
6
7
SELECT products.category_id
FROM products
WHERE products.category_id < 100
AND products.category_id IN
(SELECT inventory.category_id
FROM inventory
WHERE inventory.quantity > 0);

在此示例中,添加了WHERE子句,既过滤产品表又过滤库存表的结果。

示例-在进行相交查询时有多个字段。

下面是相交查询时返回多个字段的情况。

1
2
3
4
5
6
7
SELECT contact_id, last_name, first_name
FROM contacts
WHERE contact_id < 100
INTERSECT
SELECT customer_id, last_name, first_name
FROM customers
WHERE last_name <> 'Johnson';

在Mysql中使用EXISTS子句来模拟相交查询

1
2
3
4
5
6
7
8
9
SELECT contacts.contact_id, contacts.last_name, contacts.first_name
FROM contacts
WHERE contacts.contact_id < 100
AND EXISTS (SELECT *
FROM customers
WHERE customers.last_name <> 'Johnson'
AND customers.customer_id = contacts.contact_id
AND customers.last_name = contacts.last_name
AND customers.first_name = contacts.first_name);

使用EXISTS子句返回在contact_id小于100 的contacts表以及last_name不等于Johnson的customers表中都存在的字段数据。

因为我们是进行相交操作,因此需要按以下方式加入相交字段:

1
2
3
AND customers.customer_id = contacts.contact_id
AND customers.last_name = contacts.last_name
AND customers.first_name = contacts.first_name

这样就确保了两个结果集中都有同样的数据。


原文链接:https://codingdict.com/