EXISTS 演算子 - 結果が存在するか調べる -

SQL-92/99   Oracle DB2 SQL Server MySQL PostgreSQL Access

WHERE [ NOT ] EXISTS ( 副問い合せ )

 EXISTS 演算子は、副問い合せの結果が存在するかを調べるときに使用します。 このとき、副問い合せの結果が存在するとき真になります。 なお、MySQL で SOME 演算子を使用する場合には、バージョン 4.1 以降が必要です。

-- 【説明】
-- この SQL 文は、まず副問い合せである「T_13_2」表の「I1_NAME」列の値に「車体部品」が存在するとき「真」となります。 次に、この副問い合せの結果が「真」となるため、「T_13_1」表からデータを取得することになります。

SELECT * FROM T_13_1
 WHERE EXISTS (
  SELECT * FROM T_13_2
   WHERE I1_NAME = '車体部品'
 );


SERIALI1_CODEI2_CODEI_COST
203001101102500
203002201206500
203003301309800
203004201205500
203005201205600
203006202205600

-- 【説明】
-- この SQL 文は、まず副問い合せである「T_13_2」表の「I1_NAME」列の値が「特殊部品」かつ「T_13_2」表の「I1_CODE」列の値が「T_13_1」表の「I1_CODE」列の値と等しいとき「真」となります。 次に、この副問い合せの結果が「真」となるため、「T_13_1」表からデータを取得することになります。

SELECT * FROM T_13_1 AS T1
 WHERE EXISTS (
  SELECT * FROM T_13_2 AS T2
   WHERE T2.I1_NAME = '特殊部品'
    AND T2.I1_CODE = T1.I1_CODE
 );


SERIALI1_CODEI2_CODEI_COST
203003301309800

 EXISTS 演算子では、NOT 演算子を指定することで、副問い合せの結果が存在しないかを調べることができます。 このとき、副問い合せの結果が存在しないとき真になります。

-- 【説明】
-- ここで確認することは、副問い合せである「T_13_2」表の「I1_NAME」列の値に「車両部品」と一致する結果が存在しないとき「偽」となります。 しかし、副問い合せの結果に NOT 演算子が指定されているため、「偽」は「真」、「真」は「偽」と否定されます。 そのため、副問い合せの結果は「真」となるため、「T_13_1」表からデータを取得することになります。
-- 逆を言えば、「T_13_2」表の「I1_NAME」列の値に「車体部品」と一致する結果が存在するとき、副問い合せの結果は「真」から「偽」へ否定されるため、データを取得することはありません。

SELECT * FROM T_13_1
 WHERE NOT EXISTS (
  SELECT * FROM T_13_2
   WHERE I1_NAME = '車両部品'
 );


SERIALI1_CODEI2_CODEI_COST
203001101102500
203002201206500
203003301309800
203004201205500
203005201205600
203006202205600

SELECT * FROM T_13_1
 WHERE NOT EXISTS (
  SELECT * FROM T_13_2
   WHERE I1_NAME = '車体部品'
 );


問い合せ結果はありません。

参考表

T_13_1

SERIALI1_CODEI2_CODEI_COST
203001101102500
203002201206500
203003301309800
203004201205500
203005201205600
203006202205600

T_13_2

I1_CODEI1_NAMEI1_PRICE
101汎用部品 500
201車体部品2300
202車体部品2400
301特殊部品4500