きり丸の技術日記

技術検証したり、資格等をここに残していきます。

SQLで条件が一致しないレコードを特定する(NOT EXISTS)

小ネタ。

特定の条件に一致するレコードを取得するのはINNER JOIN等を使う方法は知ってましたが、一致しないレコードを取得する方法を知らなかったのでメモします。

環境

  • MySQL
    • 8

実装

NOT EXISTSを使えば条件一致しないレコードを特定できます。逆に条件一致するレコードを調べるときはEXISTSを使えば特定できます。

SELECT *
FROM users
WHERE NOT EXISTS(SELECT 1 FROM user_profiles WHERE users.id = user_profiles.id)

検証方法

USERSテーブルとUSER_PROFILESテーブルを用意します。関連を1:0...1にします。このときに関連がないUSERSテーブルの4, 5を取得できれば検証完了です。

CREATE TABLE users
(
    id INTEGER NOT NULL
);

CREATE TABLE user_profiles
(
    id      INTEGER NOT NULL,
    user_id INTEGER
);

INSERT INTO users (id) value (1), (2), (3), (4), (5);
INSERT INTO user_profiles (id, user_id) value (1, 1), (2, 2), (3, 3);

ユースケース

  • 不具合調査
  • 開発

ソースコード

なし

終わりに

正直当たり前レベルの記事ではあります。開発環境だとレコード数が少ないので無理やり何とかしてましたが、本番環境だとレコード数が多かったのでこの方法が必要でした。

ある程度大きい会社になると、データの安全性の面からIT監査法人から開発と運用を分けるように指示されてしまうのでなかなか使う機会がなかったです。こういう細かい技を今のうちにどんどん覚えていきたいですね。