EXIST 演算子はサブクエリの生成した値が存在する場合は「TRUE」、存在しない場合は「FALSE」を返します。ANY 演算子、ALL 演算子は「=」「<」等の比較演算子と共に用いて、全体で「TRUE」または「FALSE」の評価をしますが、EXISTS 演算子だけは単独で「TRUE」または「FALSE」の評価を行います。また、サブクエリの返す値は複数の行のものでも、複数の列のものでも構いません。
SELECT * FROM 商品表
WHERE EXISTS
(SELECT * FROM 商品表
WHERE 商品名 = 'BEER');
実行結果
商品コード 商品名 単価
───────── ───── ────
101 BEER 500
102 JUICE 400
103 TEA 400
104 WINE 650
用例 のクエリは、サブクエリで商品表から商品名が 'BEER' と一致するものを出力し、値が出力されれば、商品表の全てを表示するというものです。商品表には商品名が 'BEER' というものがありますので、商品表の全てが参照されます。EXISTS にはいくつの列が返されても構いません。
相関サブクエリについても EXISTS を使用することが出来ます。相関サブクエリでは、メインクエリから受け取った各行ごとに EXISTS 演算子は「TRUE」か「FALSE」の評価を行います。
SELECT 受注番号,顧客コード FROM 受注表 JJ
WHERE EXISTS
(SELECT * FROM 商品表 SS
WHERE 商品名 = 'JUICE'
AND JJ.商品コード = SS.商品コード);
実行結果
受注番号 顧客コード
─────── ─────────
10001 001
10004 004
10007 003
まず受注表から受注番号が '10001' である行をサブクエリで使用します。
この行の商品コードを商品表の商品コードと比較します。
また同時にその商品名が 'JUICE' であるかもチェックしています。
この行の商品コードは '102' で、同時に商品表の商品名は 'JUICE' となります。
この行と商品表の各行の比較が終わったとき、サブクエリは商品表の商品名が 'JUICE' の行について、全ての列の値を出力します。EXISTS 演算子はこれを受け取って「TRUE」と評価します。そして受注番号が '10001' の行は出力されることが決まり、受注番号と顧客コードが表示されるということになります。そして同じことが受注表の全ての行に対して行われ、結局 'JUICE' を注文したときの行についてのみ出力されることにな ります。
通常のサブクエリでは、EXISTS 演算子は結果の存在有無を一度しか評価しませんが、相関サブクエリではそれぞれの行に対して評価を行います。
EXISTS 演算子には、NOT EXISTS と記述することで EXISTS 演算子と反対の役割を果たすようになります。すなわち、サブクエリの値が存在するときは「FALSE」、存在しないときは「TRUE」と評価します。