MySQL でのマイナス演算
MINUS 演算子は SQL で使用され、テーブル B に存在しないテーブル A の一意の要素を検索します。
このチュートリアルでは、MySQL で MINUS 演算子をシミュレートして目的の結果を得る方法を説明します。NOT IN、NOT EXISTS、LEFT JOIN、および IS NULL を使用して理解します。
また、前述の各メソッドの構文を確認し、それらの違いをいくつか調べます。
MySQL で MINUS 演算子をエミュレートする(8.0.27)
MySQL で NOT IN を使用する
学生とコースの関係の例を見て、データベースとデータベース内に 2つのテーブルを作成しましょう。1つは学生という名前で、もう 1つは course という名前です。
student テーブルには学生の ID、FIRST_NAME、LAST_NAME、GENDER があり、course テーブルには COURSE_CODE、COURSE_TITLE、および STUDENT_ID 列があります。
サンプルコード:
/*
create the database and use it for table creation and other manipulation*/
CREATE SCHEMA db_practice_minus_operator;
USE db_practice_minus_operator;
# create student table
CREATE TABLE db_practice_minus_operator.student (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    FIRST_NAME VARCHAR(64) NOT NULL,
    LAST_NAME VARCHAR(64) NOT NULL,
    GENDER VARCHAR(30) NOT NULL
);
#create course table
CREATE TABLE course (
    COURSE_CODE VARCHAR(60) NOT NULL,
    COURSE_TITLE VARCHAR(64) NOT NULL,
    STUDENT_ID INT NOT NULL,
    PRIMARY KEY(COURSE_CODE),
    FOREIGN KEY (STUDENT_ID) REFERENCES student(ID)
);
course テーブルには科学の科目しかありません。どの科学コースにも登録していない学生を知りたいのです。テーブルにデータを入力して、student テーブルと course テーブルを見てみましょう。
サンプルコード:
# populate student table
INSERT INTO
student(FIRST_NAME, LAST_NAME,GENDER)
VALUES
('Shaajeel', 'Daniel', 'Male'),
('Nayya', 'Preston', 'Female'),
('James', 'Robert', 'Male'),
('Jennifer', 'John', 'Female'),
('Sarah', 'Paul', 'Female'),
('Karen', 'Donald','Female'),
('Thomas', 'Christopher','Male'),
('Lisa', 'Mark', 'Female'),
('Anthony', 'Richard', 'Male'),
('Matthew', 'Charles', 'Male');
# populate course table
INSERT INTO
course(COURSE_CODE, COURSE_TITLE, STUDENT_ID)
VALUES
(125854, 'Biology', 1),
(542968, 'Mathematics', 2),
(125648, 'Computer Science', 5),
(654891, 'Physics', 4),
(483215, 'Chemistry', 8),
(147934, 'Artificial Intelligence',6);
両方の表の現在のデータは次のようになります。
学生のテーブル:

コースの表:

ここで、MySQL の MINUS 操作シミュレーションを理解するために、次の SQL クエリを記述します。
サンプルコード:
# Simulate Minus Operator in MySQL
SELECT * FROM student
WHERE student.ID NOT IN
(SELECT STUDENT_ID FROM course);
出力:

MySQL で NOT EXISTS を使用する
サンプルコード:
# Simulate Minus Operator in MySQL
SELECT * FROM student std
WHERE NOT EXISTS
(SELECT STUDENT_ID FROM course  WHERE std.ID = STUDENT_ID);
出力:

MySQL で LEFT JOIN と IS NULL を使用する
サンプルコード:
SELECT * FROM student
LEFT JOIN course on student.ID = course.STUDENT_ID
WHERE course.STUDENT_ID IS NULL;
出力:

上記の出力では、COURSE_CODE、COURSE_TITLE、および STUDENT_ID は、これらの学生がどのコースにも登録または登録していないため、NULL として表示されます。
また、ID、FIRST_NAME、LAST_NAME、および GENDER 列を他のメソッドの出力と比較して、すべてが期待どおりに機能していることを確認することもできます。
NOT IN、NOT EXISTS、および LEFT JOIN/IS NULL を使用する場合
ここで問題となるのは、これら 3つの方法のいずれかを選択する方法です。いくつかの基本的なポイントに基づいて決定できます。
- これら 3つの方法の主な違いは、
NOT INとNOT EXISTSが左側のテーブル(最初の選択クエリ)からの値のみを表示することです。 - ただし、
LEFT JOIN/IS NULLは、左テーブルと右テーブルの間に一致が見つからない場合、右テーブルの値ではなく、左テーブルとNULL値を出力します。これは、LEFT JOIN/IS NULLは、複数のテーブルからデータを取得するために使用されます。 - もう 1つの違いは、
LEFT JOIN/IS NULLとNOT EXISTSは意味的に同等であるのに対し、NOT INはそうではないため、右側のテーブルのNULL値の処理方法です。 - 右側のテーブルに同等条件を満たす行が見つからない場合、
NOT EXISTSはTRUEを返します。 NOT INの動作は異なります。リストに行が見つかった場合、INはTRUEを出力し、NOT INはFALSEを返します。一方、リストに行が見つからない場合、INはNULLを返し、NULLへの否定はNULLであるため、NOT INもNULLを返します。
まとめ
上記のすべての詳細を考慮して、MySQL は MINUS 操作をサポートしていないと結論付けましたが、MINUS 演算子をエミュレートする方法は他にもあります。ニーズ、快適さ、要件に応じて使用できます。
