NOT EXISTS、EXISTS、LEFT JOIN、IN演算子:外部キーと行選択

2024-04-02

外部キーを持つテーブルの行を選択する方法

NOT EXISTS を使用すると、別のテーブルに一致するエントリがない行を選択できます。 構文は以下のようになります。

SELECT
    *
FROM
    table1
WHERE
    NOT EXISTS (
        SELECT
            *
        FROM
            table2
        WHERE
            table1.foreign_key_column = table2.primary_key_column
    );

この例では、table1 から table2 に一致するエントリがない行を選択します。 table1.foreign_key_columntable2.primary_key_column と一致する必要があります。

例:

SELECT
    *
FROM
    customers
WHERE
    NOT EXISTS (
        SELECT
            *
        FROM
            orders
        WHERE
            customers.customer_id = orders.customer_id
    );

このクエリは、注文したことがない顧客を選択します。

SELECT
    *
FROM
    table1
LEFT JOIN
    table2
ON
    table1.foreign_key_column = table2.primary_key_column
WHERE
    table2.primary_key_column IS NULL;
SELECT
    *
FROM
    customers
LEFT JOIN
    orders
ON
    customers.customer_id = orders.customer_id
WHERE
    orders.order_id IS NULL;
SELECT
    *
FROM
    table1
WHERE
    table1.foreign_key_column NOT IN (
        SELECT
            primary_key_column
        FROM
            table2
    );

この例では、table2 に存在しない値を持つ table1 の行を選択します。

SELECT
    *
FROM
    customers
WHERE
    customers.customer_id NOT IN (
        SELECT
            order_id
        FROM
            orders
    );

上記のいずれの方法を使用しても、外部キーを持つテーブルから、別のテーブルに一致するエントリがない行を選択できます。 どの方法を使用するかは、状況によって異なります。




NOT EXISTS を使用する方法

SELECT
    *
FROM
    customers
WHERE
    NOT EXISTS (
        SELECT
            *
        FROM
            orders
        WHERE
            customers.customer_id = orders.customer_id
    );

LEFT JOIN を使用する方法

SELECT
    *
FROM
    customers
LEFT JOIN
    orders
ON
    customers.customer_id = orders.customer_id
WHERE
    orders.order_id IS NULL;

IN 演算子を使用する方法

SELECT
    *
FROM
    customers
WHERE
    customers.customer_id NOT IN (
        SELECT
            order_id
        FROM
            orders
    );

このコードを実行するには、次のテーブルが必要です。

  • customers

    • customer_id (INT, PRIMARY KEY)
    • name (VARCHAR(255))
  • orders

    • customer_id (INT)

このコードを実行すると、次の結果が得られます。

customer_id | name
-----------+--------
1           | John Doe
2           | Jane Doe

この例では、customers テーブルには 2 つの行があり、orders テーブルには 1 つの行のみあります。 customer_id 1 の顧客は注文していますが、customer_id 2 の顧客は注文していません。

  • CASE ステートメントを使用する方法

これらの方法は、上記の 3 つの方法よりも複雑なので、ここでは説明しません。




外部キーを持つテーブルから、別のテーブルに一致するエントリがない行を選択するその他の方法

SELECT
    *
FROM
    table1
WHERE
    EXISTS (
        SELECT
            *
        FROM
            table2
        WHERE
            table1.foreign_key_column = table2.primary_key_column
    );
SELECT
    *
FROM
    customers
WHERE
    EXISTS (
        SELECT
            *
        FROM
            orders
        WHERE
            customers.customer_id = orders.customer_id
    );

FULL JOIN を使用すると、両方のテーブルに存在する行、一方のテーブルのみに存在する行、両方のテーブルに存在しない行を選択できます。 構文は以下のようになります。

SELECT
    *
FROM
    table1
FULL JOIN
    table2
ON
    table1.foreign_key_column = table2.primary_key_column
WHERE
    table2.primary_key_column IS NULL;
SELECT
    *
FROM
    customers
FULL JOIN
    orders
ON
    customers.customer_id = orders.customer_id
WHERE
    orders.order_id IS NULL;
SELECT
    *
FROM
    table1
WHERE
    CASE
        WHEN EXISTS (
            SELECT
                *
            FROM
                table2
            WHERE
                table1.foreign_key_column = table2.primary_key_column
        ) THEN
            'Has match'
        ELSE
            'No match'
    END = 'No match';
SELECT
    *
FROM
    customers
WHERE
    CASE
        WHEN EXISTS (
            SELECT
                *
            FROM
                orders
            WHERE
                customers.customer_id = orders.customer_id
        ) THEN
            'Has match'
        ELSE
            'No match'
    END = 'No match';

sql foreign-keys


SQL Serverで最大値を取得する:CASE式、IIF関数、MAX関数とCOALESCE関数の比較

SQL Server に、.NET の Math. Max のように 2 つの値を受け取り、最大値を返す関数がありますか?回答:はい、SQL Server には MAX 関数があり、複数の方法で 2 つの値の最大値を取得できます。方法 1: CASE 式を使用する...


データベースパフォーマンスの向上に役立つPostgreSQLクエリログ活用術

PostgreSQL の設定ファイル postgresql. conf を編集することで、クエリログの記録を有効にすることができます。手順postgresql. conf ファイルを開きます。デフォルトの場所は /etc/postgresql/14/main/postgresql...


MySQLクエリで「文字列Aが文字列Bに含まれるかどうか」を判定する3つの方法とサンプルコード

MySQLクエリにおいて、特定の文字列が別の文字列に含まれているかどうかを検証する方法はいくつかあります。本記事では、代表的な3つの方法と、それぞれの利点と欠点について解説します。方法1:LIKE演算子LIKE演算子は、ワイルドカード文字(%)とアンダーバー(_)を用いて、パターンマッチングを行うための演算子です。...


【初心者向け】SQLで簡単操作!あるテーブルを別のテーブルのデータで更新する方法

SQLでは、UPDATEステートメントを使って、あるテーブルのデータを別のテーブルのデータを使って更新することができます。これは、顧客情報と注文履歴を別々のテーブルに保存しているような場合などに役立ちます。基本的な構文例顧客情報テーブル (customers) と注文履歴テーブル (orders) があり、顧客ID (customer_id) で両方のテーブルが結合されている場合、以下のクエリで、orders テーブルにある顧客の最新の注文ステータスを customers テーブルの order_status カラムに更新することができます。...


Laravelマイグレーション:既存の列をNULL許容から非NULLに変更する方法

前提条件このチュートリアルを実行する前に、以下の条件を満たしていることを確認してください。Laravel がインストールされている対象となるデータベーステーブルが存在するマイグレーションファイルの作成方法を知っている手順既存のマイグレーションファイルを開く...