MySQL でのマイナス演算

Mehvish Ashiq 2023年1月30日
  1. MySQL で MINUS 演算子をエミュレートする(8.0.27)
  2. NOT INNOT EXISTS、および LEFT JOIN/IS NULL を使用する場合
  3. まとめ
MySQL でのマイナス演算

MINUS 演算子は SQL で使用され、テーブル B に存在しないテーブル A の一意の要素を検索します。

このチュートリアルでは、MySQLMINUS 演算子をシミュレートして目的の結果を得る方法を説明します。NOT INNOT EXISTSLEFT JOIN、および IS NULL を使用して理解します。

また、前述の各メソッドの構文を確認し、それらの違いをいくつか調べます。

MySQL で MINUS 演算子をエミュレートする(8.0.27)

MySQL で NOT IN を使用する

学生とコースの関係の例を見て、データベースとデータベース内に 2つのテーブルを作成しましょう。1つは学生という名前で、もう 1つは course という名前です。

student テーブルには学生の IDFIRST_NAMELAST_NAMEGENDER があり、course テーブルには COURSE_CODECOURSE_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 でのマイナス演算-学生テーブルデータ

コースの表:

mysql でのマイナス演算-コーステーブルデータ

ここで、MySQL の MINUS 操作シミュレーションを理解するために、次の SQL クエリを記述します。

サンプルコード:

# Simulate Minus Operator in MySQL
SELECT * FROM student
WHERE student.ID NOT IN
(SELECT STUDENT_ID FROM course);

出力:

mysql でのマイナス演算 - コースのテーブルデータ

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 のマイナス演算-not exists

MySQL で LEFT JOINIS NULL を使用する

サンプルコード:

SELECT * FROM student
LEFT JOIN course on student.ID = course.STUDENT_ID
WHERE course.STUDENT_ID IS NULL;

出力:

mysql でのマイナス演算-左結合で null

上記の出力では、COURSE_CODECOURSE_TITLE、および STUDENT_ID は、これらの学生がどのコースにも登録または登録していないため、NULL として表示されます。

また、IDFIRST_NAMELAST_NAME、および GENDER 列を他のメソッドの出力と比較して、すべてが期待どおりに機能していることを確認することもできます。

NOT INNOT EXISTS、および LEFT JOIN/IS NULL を使用する場合

ここで問題となるのは、これら 3つの方法のいずれかを選択する方法です。いくつかの基本的なポイントに基づいて決定できます。

  • これら 3つの方法の主な違いは、NOT INNOT EXISTS が左側のテーブル(最初の選択クエリ)からの値のみを表示することです。
  • ただし、LEFT JOIN/IS NULL は、左テーブルと右テーブルの間に一致が見つからない場合、右テーブルの値ではなく、左テーブルと NULL 値を出力します。これは、LEFT JOIN/ IS NULL は、複数のテーブルからデータを取得するために使用されます。
  • もう 1つの違いは、LEFT JOIN/IS NULLNOT EXISTS は意味的に同等であるのに対し、NOT IN はそうではないため、右側のテーブルの NULL 値の処理方法です。
  • 右側のテーブルに同等条件を満たす行が見つからない場合、NOT EXISTSTRUE を返します。
  • NOT IN の動作は異なります。リストに行が見つかった場合、INTRUE を出力し、NOT INFALSE を返します。一方、リストに行が見つからない場合、INNULL を返し、NULL への否定は NULL であるため、NOT INNULL を返します。

まとめ

上記のすべての詳細を考慮して、MySQL は MINUS 操作をサポートしていないと結論付けましたが、MINUS 演算子をエミュレートする方法は他にもあります。ニーズ、快適さ、要件に応じて使用できます。

著者: 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