PostgreSQL EXISTS と SELECT が同時に有効です Operator(例)

⚡ スマートサマリー

PostgreSQL EXISTSは、相関サブクエリが行を返すかどうかをテストするブール演算子であり、SELECT、INSERT、UPDATE、DELETE文が一致するレコードの有無に基づいてデータを効率的にフィルタリングできるようにします。

  • ???? 構文: WHERE EXISTS (サブクエリ) は、サブクエリが少なくとも 1 行を返す場合に true を返します。
  • 🔗 相関サブクエリ: EXISTS は内部クエリと外部クエリをリンクし、共有キーに基づいて行を照合します。
  • 短絡: EXISTS関数は最初に一致した行で停止するため、大規模なテーブルでも適切に動作します。
  • 🔁 4つの声明: この演算子は、SELECT、INSERT、UPDATE、およびDELETEクエリ内で機能します。
  • 🛡️ 存在しない: 行を安全に除外し、NOT IN を破綻させる NULL トラップを回避します。
  • 🤖 AIクエリ: アシスタントはEXISTS句を生成し、相関サブクエリのパフォーマンスリスクを警告します。

PostgreSQL 選択可能なものが存在する Operaタ

存在するものは PostgreSQL?

その PostgreSQL 存在する EXISTS演算子は、サブクエリ内に行が存在するかどうかをテストします。つまり、この演算子はサブクエリと組み合わせて使用​​されます。サブクエリ内に少なくとも1つの行が見つかった場合、EXISTS演算子の条件が満たされたとみなされます。この操作は、SELECT、UPDATE、INSERT、およびDELETEステートメントと組み合わせて使用​​できます。

PostgreSQL EXISTSクエリ構文

の構文は次のとおりです。 PostgreSQL EXISTS ステートメント:

WHERE EXISTS (subquery);

上記の構文は、EXISTS演算子が引数としてサブクエリを取ることを示しています。サブクエリは単純に SELECTステートメント 列名や式のリストではなく、SELECT * で始まる必要があります。

PostgreSQL SELECT文でEXISTSを使用する

SELECT文でEXISTS演算子を使用する方法を見ていきましょう。以下のテーブルがあります。

本:

PostgreSQL SELECT文でEXISTSを使用する

価格:

PostgreSQL SELECT文でEXISTSを使用する

次のステートメントを実行します。

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

これにより、次が返されます。

PostgreSQL SELECT文の結果でEXISTSが実行されます

上記のコマンドは、ID がサブクエリによる任意のレコードの ID と一致する Book テーブル内のすべてのレコードを返す必要があります。 一致した ID は XNUMX つだけでした。 したがって、返されたレコードは XNUMX つだけです。

PostgreSQL INSERT文でEXISTSが存在します

EXISTS演算子は、 INSERT ステートメント次の 3 つのテーブルがあります。

本:

PostgreSQL INSERT文でEXISTSが存在します

価格:

PostgreSQL INSERT文でEXISTSが存在します

価格2:

PostgreSQL INSERT文でEXISTSが存在します

次に、次のステートメントを実行します。

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

価格表は次のようになりました。

PostgreSQL INSERT文の結果と共に存在する

Price5 という名前のテーブル内の ID が 2 の行が一致しました。 このレコードはその後、Price テーブルに挿入されました。

PostgreSQL UPDATE文でEXISTSを使用する

UPDATE ステートメントでは EXISTS 演算子を使用できます。

次のクエリを実行します。

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

PostgreSQL UPDATE文でEXISTSを使用する

価格表の価格列を更新しています。 私たちの目的は、ID を共有するアイテムの価格を同じにすることです。 5 行、つまり XNUMX 行だけが一致しました。

ただし、価格は同じ 205 であるため、更新は行われませんでした。 違いがある場合は、更新が行われます。

PostgreSQL DELETE文でEXISTSを使用する

A PostgreSQL DELETE ステートメントでは EXISTS 演算子を使用できます。次に例を示します。

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

価格表は次のようになりました。

PostgreSQL DELETE文でEXISTSを使用する

ID が 5 の行が削除されました。

PostgreSQL pgAdminを使用したEXISTSステートメント

SQLシェル以外にも、同じEXISTSクエリをpgAdminインターフェースを通して視覚的に実行できます。それでは、pgAdminを使ってこれらの操作を実行する方法を見ていきましょう。

SELECT文を使用

EXISTSクエリを使用する手順は次のとおりです。 PostgreSQL pgAdminを使用したSELECT文の場合:

ステップ1) pgAdminアカウントにログインしてください。pgAdminを開き、認証情報を使用してアカウントにログインしてください。

ステップ2) デモデータベースを作成します。

  1. 左側のナビゲーション バーで、[データベース] をクリックします。
  2. 「デモ」をクリックします。

PostgreSQL pgAdminを使用したEXISTSステートメント

ステップ3) クエリ エディターに次のクエリを入力します。

SELECT *
FROM Book
WHERE EXISTS (SELECT *
              FROM Price
              WHERE Book.id = Price.id);

ステップ4) 「実行」ボタンをクリックします。

PostgreSQL pgAdminを使用したEXISTSステートメント

次のような結果が返されます。

PostgreSQL pgAdminを使用したEXISTSステートメント

INSERT文あり

pgAdmin を使用して同じことを実行するには、次の手順を実行します。

ステップ1) pgAdmin アカウントにログインします。

ステップ2)

  1. 左側のナビゲーション バーで、[データベース] をクリックします。
  2. 「デモ」をクリックします。

EXISTSステートメント PostgreSQL pgAdminを使用する

ステップ3) クエリ エディターにクエリを入力します。

INSERT INTO Price
SELECT id, price
FROM Price2
WHERE EXISTS (SELECT id
              FROM Book
              WHERE Book.id = Price2.id);

ステップ4) 「実行」ボタンをクリックします。

EXISTSステートメント PostgreSQL pgAdminを使用する

価格表は次のようになります。

EXISTSステートメント PostgreSQL pgAdminを使用する

UPDATE文あり

pgAdmin を使用して同じことを実行するには、次の手順を実行します。

ステップ1) pgAdmin アカウントにログインします。

ステップ2)

  1. 左側のナビゲーション バーで、[データベース] をクリックします。
  2. 「デモ」をクリックします。

EXISTSステートメント PostgreSQL pgAdminを使用する

ステップ3) クエリ エディターにクエリを入力します。

UPDATE Price
SET price = (SELECT price
              FROM Price2
              WHERE Price2.id = Price.id)
WHERE EXISTS (SELECT id, price
FROM Price2
WHERE Price2.id = Price.id);

ステップ4) 「実行」ボタンをクリックします。

PostgreSQL pgAdminを使用したEXISTSステートメント

価格表は次のようになります。

PostgreSQL pgAdminを使用したEXISTSステートメント

DELETE文あり

pgAdmin を使用して同じことを実行するには、次の手順を実行します。

ステップ1) pgAdmin アカウントにログインします。

ステップ2)

  1. 左側のナビゲーション バーで、[データベース] をクリックします。
  2. 「デモ」をクリックします。

PostgreSQL pgAdminを使用したEXISTSステートメント

ステップ3) クエリ エディターにクエリを入力します。

DELETE FROM Price
WHERE EXISTS (SELECT *
              FROM Price2
              WHERE Price.id = Price2.id);

ステップ4) 「実行」ボタンをクリックします。

PostgreSQL pgAdminを使用したEXISTSステートメント

価格表は次のようになります。

PostgreSQL pgAdminを使用したEXISTSステートメント

このチュートリアルで使用するデータベースをダウンロードする

よくあるご質問

EXISTS は、相関サブクエリが行を返すかどうかをテストし、最初の一致で停止するため、大規模なサブクエリに適しています。IN は値をリストと比較し、小規模で定数的なセットに適しています。

サブクエリにNULLが含まれている場合、比較が不明になるため、NOT INは0行を返す可能性があります。一方、NOT EXISTSはNULLを無視し、各行を正しく評価するため、アンチジョインには信頼できる選択肢となります。

相関サブクエリは、WHERE Book.id = Price.id のように、外部クエリの列を参照します。EXISTS は、外部の各行に対してそれを再チェックし、一致するものが見つかったら true を返します。

はい。EXISTSはサブクエリが1行を生成した時点でtrueを返すため、残りの行はスキャンしません。この短絡的な動作により、大規模な相関サブクエリに対して効率的に動作します。

いいえ。EXISTSはサブクエリが行を返すかどうかのみをチェックするため、SELECT *、SELECT 1、SELECT idは同じように動作します。サブクエリ内の列リストは結果に影響しません。

サブクエリ内で結合された列にインデックスを作成し、相関条件を sargable のままにして、EXPLAIN ANALYZE を実行します。 PostgreSQL インデックスがサポートしている場合、EXISTS を効率的なセミジョインとして書き換えることがよくあります。

AIアシスタントは、平易な英語のルールをEXISTS句に変換し、相関サブクエリを構築し、NOT IN NULLの落とし穴について警告します。また、チューニングのためのインデックスやEXPLAINヒントも提案します。

はい。AIコパイロットがサブクエリのパターンを検出し、INをEXISTSに、またはNOT INをNOT EXISTSに書き換えることで、大規模テーブルにおけるNULL値の安全性とパフォーマンスを向上させます。