PostgreSQL:Using where EXISTS clause
任意のSQLクエリが別のSQLクエリ内で使用されている場合、それはサブクエリと呼ばれます。 複雑なクエリは、大きなクエリを複数のサブクエリに分割することで簡単に記述できます。 EXISTS句は、SQL文のサブクエリとともに使用されます。 EXISTSの出力は、サブクエリによって返されるレコードの数に依存しますが、レコードの値には依存しません。 関連するサブクエリが少なくとも1つの行を返す場合、EXISTSの結果はtrueになります。 Select、insert、updateおよびdelete文でEXISTS句およびNOT EXISTS句を使用する方法は、このチュートリアルではさまざまな例を使用して示しています。
EXISTS句の構文:
FROM table_name1
WHERE EXISTS(SELECT1
FROM
table_name2
WHERE col1=table_name1.col1);
company、items、customersという名前の三つのテーブルを作成し、いくつかのデータを挿入します。 次のselectクエリを実行して、これらのテーブルの内容を表示します。
項目から*を選択します;
お客様から選択*;
例-1:Select query
(a)EXISTS
のUSING EXISTS句次のクエリは、companyテーブルに基づいてitemsテーブルからレコードを取得します。 このサブクエリは、companyテーブルのcompany_idがitemsテーブルのcompany_idと等しく、phoneフィールドの値が空でないcompanyテーブルからすべてのレコードを検索します。 会社テーブルに電話番号を持たないレコードが1つあり、このレコードは出力から省略されます。
FROM items
WHERE EXISTS(SELECT1
FROM company
WHERE items.company_id=会社。company_idおよびcompany。電話<>”);
出力:
LGのレコードには、会社テーブルに電話エントリがありません。 したがって、出力には表示されません。
(b)NOT EXISTS
NOT EXISTS句はEXISTS句の反対です。 次のクエリは、サブクエリがfalseを返すときにitemsテーブルからそれらのレコードを取得します。
FROM items
WHERE NOT EXISTS(SELECT1
FROM company
WHERE items.company_id=会社。company_idおよびcompany。website_urlがNULLである);
出力:
website_urlがNULLであるcompanyテーブルにレコードがありません。 したがって、subqueryの出力はすべてのレコードに対してfalseであり、itemsテーブルのすべてのレコードが取得されます。
例-2: Using EXISTS句IN INSERTクエリ
次のinsertクエリによると、companyテーブルとcustomersテーブルの両方のcompany_idが等しい場合、データはitemsテーブルに挿入されます。
(company_id)
SELECT company_id
FROM customers
WHERE EXISTS(sELECT1
FROM company,customers
WHERE customers.company_id=会社。会社名);
出力:
customersテーブルのcompany_idには、値が1と2の三つのエントリがあります。 そのため、サブクエリは3回trueを返し、3つのレコードが挿入されます。
selectクエリを実行して、itemsテーブルの内容を確認します。
例-3:Using EXISTS clause in UPDATE query
次のクエリは、company_idが1であり、サブクエリがtrueを返すitemsテーブルのレコードを更新します。
set name=’Nokia’
where company_id=1AND EXISTS(SELECT1
FROM items
WHERE name=’Not Assign’);
出力:
ここで、サブクエリは3回trueを返し、company_idは3つのレコードに対して1です。 更新クエリを実行した後、三つのレコードが更新されます。
selectクエリを実行して、itemsテーブルの内容を確認します。
例-4:Using EXISTS clause in DELETE query
次のクエリでは、company_idが1であり、サブクエリがtrueを返すitemsテーブルのレコードが削除されます。
where company_id=1AND EXISTS(SELECT1
FROM items
WHERE name=’Not Assign’);
出力:
company_idの値が1のレコードが3つあり、1つのレコードに名前の値が’Not Assign’があります。 したがって、条件は3回trueになり、itemsテーブルから3つのレコードが削除されます。
selectクエリを実行して、itemsテーブルの内容を確認します。
このチュートリアルを読んだ後、SQLクエリでEXISTS句を使用するという明確なアイデアが得られました。