EXISTS 演算子 - 結果が存在するか調べる -
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 = '車体部品'
);
| SERIAL | I1_CODE | I2_CODE | I_COST |
|---|---|---|---|
| 203001 | 101 | 10 | 2500 |
| 203002 | 201 | 20 | 6500 |
| 203003 | 301 | 30 | 9800 |
| 203004 | 201 | 20 | 5500 |
| 203005 | 201 | 20 | 5600 |
| 203006 | 202 | 20 | 5600 |
-- 【説明】
-- この 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
);
| SERIAL | I1_CODE | I2_CODE | I_COST |
|---|---|---|---|
| 203003 | 301 | 30 | 9800 |
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 = '車両部品'
);
| SERIAL | I1_CODE | I2_CODE | I_COST |
|---|---|---|---|
| 203001 | 101 | 10 | 2500 |
| 203002 | 201 | 20 | 6500 |
| 203003 | 301 | 30 | 9800 |
| 203004 | 201 | 20 | 5500 |
| 203005 | 201 | 20 | 5600 |
| 203006 | 202 | 20 | 5600 |
SELECT * FROM T_13_1
WHERE NOT EXISTS (
SELECT * FROM T_13_2
WHERE I1_NAME = '車体部品'
);
問い合せ結果はありません。
参考表
T_13_1 |
|
||||||||||||||||||||||||||||
T_13_2 |
|
||||||||||||||||||||||||||||