MySQL INTERSECT运算符

时间:2019-02-04 12:52:26  来源:igfitidea点击:

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

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

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

mysql相交查询

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

语法

SQL中INTERSECT运算符的语法为:

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查询,如下所示:

SELECT products.category_id
FROM products
WHERE products.category_id IN (SELECT inventory.category_id FROM inventory);

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

对应的INTERSECT查询语句为:

SELECT category_id
FROM products
INTERSECT
SELECT category_id
FROM inventory;

附加筛选条件的相交查询

SELECT category_id
FROM products
WHERE category_id < 100
INTERSECT
SELECT category_id
FROM inventory
WHERE quantity > 0;

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

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子句,既过滤产品表又过滤库存表的结果。

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

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

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子句来模拟相交查询

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表中都存在的字段数据。

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

AND customers.customer_id = contacts.contact_id
AND customers.last_name = contacts.last_name
AND customers.first_name = contacts.first_name

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