MySQL INTERSECT运算符
时间:2019-02-04 12:52:26 来源:igfitidea点击:
本MySQL教程将通过语法和示例说明了如何实现Mysql相交查询。
尽管MySQL中没有INTERSECT运算符,但是根据INTERSECT查询的特点,可以使用IN子句或EXISTS子句轻松模拟这种类型的查询。
首先,让我们解释什么是INTERSECT查询。INTERSECT查询返回两个或多个数据集的交集。如果两个数据集中都存在一条记录,那么该记录将被包含在INTERSECT结果集中。但是,如果记录仅存在其中一个数据集中,则会将其从INTERSECT结果中省略。
说明: 相交查询将返回蓝色阴影区域中的记录。
语法
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
这样就确保了两个结果集中都有同样的数据。