MySQL の交差演算子
この記事は、INTERSECT
演算子について学ぶのに役立ちます。MySQL は INTERSECT
と MINUS
/EXCEPT
をサポートしていませんが、この機能をシミュレートする他の方法があります。
INTERSECT
とは何か、その利点、および MySQL で INTERSECT
をエミュレートする方法を学ぶためのさまざまな方法を見ていきます。
MySQL の INTERSECT
演算子の概要
INTERSECT
は、2つのセットから共通の要素を取得するために使用される集合演算子です。また、2つのテーブルから DISTINCT
(または共通)レコード(行)を取得するためにも使用されます。
また、INTERSECT
演算子は、2つの SELECT
ステートメントの出力として取得される同一の行のみを返すと言うこともできます。交差点
を理解するには、次のベン図を参照してください。
ここで、黄色のグリッド領域は交差点
です。INTERSECT
の主な利点は、多くのテーブルから同一のレコードにアクセスできることです。
MySQL
は INTERSECT
演算子をサポートしていませんが、他の方法を使用してこの機能を実行できます。
MySQL の INTERSECT
演算子
すでに述べたように、INTERSECT
演算子は MySQL
では使用できません。それでも、クエリの複雑さと要件に応じて、INNER JOIN
と IN
句と EXISTS
句を使用してこれをシミュレートできます。
order
と customer
という名前の 2つのテーブルを使用しています。customer
テーブルのフィールドには、customer_id
、customer_firstname
、customer_lastname
、customer_age
、および customer_salary
が含まれます。
order
テーブルには、order_id
、order_date
、order_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 の INNER JOIN
を介して INTERSECT
をエミュレートする
order
の詳細(order_id
、order_amount
、order_date
)と customer
の詳細(customer_id
、customer_firstname
、customer_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_id
が customer
テーブルと order
テーブルで同じである場合、order_id
、customer_id
、customer_firstname
、customer_lastname
、order_amount
、および order_date
を取得します。
出力:
MySQL の IN
句を介して INTERSECT
をエミュレートする
今、私たちは別の状況にあります。ここでは、顧客関連のデータのみが必要です。
このデータには、customer_id
、customer_firstname
、customer_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 の 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
されます。
出力:
まとめ
この記事では、1つの操作を実行するための他の多くの選択肢をまとめました。
また、MySQL で INTERSECT
をシミュレートするさまざまな方法を学びました。これには、INNER JOIN
、IN
句、および EXISTS
句が含まれます。
MySQL で INTERSECT
操作をエミュレートしながら WHERE
と AND
を使用する方法も見ました。