MySQL の交差演算子

Mehvish Ashiq 2024年2月15日
  1. MySQL の INTERSECT 演算子の概要
  2. MySQL の INTERSECT 演算子
  3. まとめ
MySQL の交差演算子

この記事は、INTERSECT 演算子について学ぶのに役立ちます。MySQL は INTERSECTMINUS/EXCEPT をサポートしていませんが、この機能をシミュレートする他の方法があります。

INTERSECT とは何か、その利点、および MySQL で INTERSECT をエミュレートする方法を学ぶためのさまざまな方法を見ていきます。

MySQL の INTERSECT 演算子の概要

INTERSECT は、2つのセットから共通の要素を取得するために使用される集合演算子です。また、2つのテーブルから DISTINCT(または共通)レコード(行)を取得するためにも使用されます。

また、INTERSECT 演算子は、2つの SELECT ステートメントの出力として取得される同一の行のみを返すと言うこともできます。交差点を理解するには、次のベン図を参照してください。

mysql の交差演算子-ベン図

ここで、黄色のグリッド領域は交差点です。INTERSECT の主な利点は、多くのテーブルから同一のレコードにアクセスできることです。

MySQLINTERSECT 演算子をサポートしていませんが、他の方法を使用してこの機能を実行できます。

MySQL の INTERSECT 演算子

すでに述べたように、INTERSECT 演算子は MySQL では使用できません。それでも、クエリの複雑さと要件に応じて、INNER JOININ 句と EXISTS 句を使用してこれをシミュレートできます。

ordercustomer という名前の 2つのテーブルを使用しています。customer テーブルのフィールドには、customer_idcustomer_firstnamecustomer_lastnamecustomer_age、および customer_salary が含まれます。

order テーブルには、order_idorder_dateorder_amount、および customer_id があります(ここでは、customer id は外部キーです)。customer テーブルと order テーブルは、データとともに次のようになります。

次のサンプルコードを使用して、両方のテーブルを作成し、データを挿入できます。

#create customer table
CREATE TABLE customer(
customer_id INT NOT NULL PRIMARY KEY,
customer_firstname VARCHAR(60) NOT NULL,
customer_lastname VARCHAR(60) NOT NULL,
customer_age INT NOT NULL,
customer_salary INT NOT NULL
);

#create order table
CREATE TABLE order(
order_id INT NOT NULL PRIMARY KEY,
order_date DATETIME NOT NULL,
order_amount INT NOT NULL,
customer_id INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
);

#insert into customer table
INSERT INTO customer VALUES
(1, 'Shajeel', 'Daniel', 23, 9000),
(2, 'Nayya', 'Preston', 54, 1500),
(3, 'James', 'Robert', 36, 2500),
(4, 'Jennifer', 'John', 29, 5000),
(5, 'Sarah', 'Paul', 15, 8000),
(6, 'Karen', 'Donald', 40, 3500);

#insert into order table
INSERT INTO order VALUES
(1, '2019-12-03 10:25:30', 500, 2),
(2, '2019-12-10 12:00:30', '1500', 4);

customer テーブル:

mysql の交差演算子-顧客データ

注文表:

mysql の交差演算子-注文データ

MySQL の INNER JOIN を介して INTERSECT をエミュレートする

order の詳細(order_idorder_amountorder_date)と customer の詳細(customer_idcustomer_firstnamecustomer_lastname)を検索して、どの customerを配置したかを確認します。注文何日に。

つまり、customer テーブルおよび order テーブルと同一の customer を見つけたいということです。また、データが 2つのテーブルからのものであることを確認する必要があります。INNER JOIN という名前の結合を使用できます。

#MySQL Version 8.0.27
SELECT 
order.order_id, customer.customer_id, customer.customer_firstname,
customer.customer_lastname,order.order_amount,order.order_date
FROM order
INNER JOIN 
customer ON order.customer_id = customer.customer_id;

上記のコードでは、customer_idcustomer テーブルと order テーブルで同じである場合、order_idcustomer_idcustomer_firstnamecustomer_lastnameorder_amount、および order_date を取得します。

出力:

mysql の交差演算子-内部結合と交差します

MySQL の IN 句を介して INTERSECT をエミュレートする

今、私たちは別の状況にあります。ここでは、顧客関連のデータのみが必要です。

このデータには、customer_idcustomer_firstnamecustomer_lastname、および customer_age が含まれます。そして、その顧客は注文テーブルに存在する必要があります。

ここでは、IN 句を使用して INTERSECT 操作をシミュレートできます。

#MySQL version 8.0.27
SELECT 
customer.customer_id, customer.customer_firstname,
customer.customer_lastname, customer.customer_age
FROM customer
WHERE customer.customer_id IN ( SELECT order.customer_id FROM order);

サブクエリは、上記の order テーブルからすべての customer_id を収集することによって最初に実行されます。次に、サブクエリの結果に customer_id が存在する顧客関連の詳細のみを SELECT します。

出力:

mysql の interx 演算子-in 句と交差します

MySQL の EXISTS 句を介して INTERSECT をシミュレートする

このシナリオでは、年齢が 45 未満の顧客の詳細のみが必要であり、少なくとも 1つの注文を行う必要があります。EXISTS 句は次のように使用されます。

次のコードでも、EXISTS 句を省略した場合に同じ出力が生成されます。

SELECT 
customer.customer_id, customer.customer_firstname, 
customer.customer_lastname, customer.customer_age
FROM customer
WHERE customer.customer_age < 45 
AND EXISTS
(SELECT order.customer_id FROM order where order.customer_id = customer.customer_id);

サブクエリが最初に実行され、order テーブルのすべての customer_id が提供されます。customer_id は両方のテーブル(order テーブルと customer テーブル)で同じです。次に、サブクエリの結果に、年齢が 45 および customer_id 未満の顧客関連の詳細のみが SELECT されます。

出力:

mysql の interx 演算子-and 句と交差します

まとめ

この記事では、1つの操作を実行するための他の多くの選択肢をまとめました。

また、MySQL で INTERSECT をシミュレートするさまざまな方法を学びました。これには、INNER JOININ 句、および EXISTS 句が含まれます。

MySQL で INTERSECT 操作をエミュレートしながら WHEREAND を使用する方法も見ました。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook