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
演算子をエミュレートする方法は他にもあります。ニーズ、快適さ、要件に応じて使用できます。