SQL-92/99 Oracle Db2 SQL Server MySQL PostgreSQL Access
WHERE [ NOT ] EXISTS ( 副問い合せ )
EXISTSは副問い合せの結果が存在するかを調べるときに使用します。
このとき副問い合せの結果が存在するとき真になります。
関連キーワード
SQL実行例の説明(1)
・T1_SAMPLE表から副問い合せの結果が真のときデータを取得します。
・副問い合わせの結果が偽であればT1_SAMPLE表からデータは取得しません。
SQL実行の結果(1-1)
・条件式に一致する副問い合わせの結果リストはI1_NAMEに車体部品が存在するか。(左)
・副問い合わせの結果が真となるのでT1_SAMPLE表からデータを取得します。(右)
SELECT * FROM T1_SAMPLE
WHERE EXISTS (
SELECT * FROM T2_SAMPLE
WHERE I1_NAME = '車体部品'
);
I1_CODE | I1_NAME | I1_PRICE |
---|---|---|
101 | 汎用部品 | 500 |
201 | 車体部品 | 2300 |
202 | 車体部品 | 2400 |
301 | 特殊部品 | 4500 |
T2_SAMPLE
SERIAL | I1_CODE | I_COST |
---|---|---|
203001 | 101 | 2500 |
203002 | 201 | 6500 |
203003 | 301 | 9800 |
203004 | 201 | 5500 |
203005 | 201 | 5600 |
203006 | 202 | 5600 |
T1_SAMPLE
SERIAL | I1_CODE | I_COST |
---|---|---|
203001 | 101 | 2500 |
203002 | 201 | 6500 |
203003 | 301 | 9800 |
203004 | 201 | 5500 |
203005 | 201 | 5600 |
203006 | 202 | 5600 |
SQL実行の結果(1-2)
・条件式に一致する副問い合わせの結果リストはI1_NAMEに特殊部品が存在するか、かつ、I1_CODEの値がT1_SAMPLE表のI1_CODEと等しいの値が存在するか。(左)
・副問い合わせの結果が真となるのでT1_SAMPLE表からデータを取得します。(右)
SELECT * FROM T1_SAMPLE AS T1
WHERE EXISTS (
SELECT * FROM T2_SAMPLE AS T2
WHERE I1_NAME = '特殊部品'
AND T2.I1_CODE = T1.I1_CODE
);
I1_CODE | I1_NAME | I1_PRICE |
---|---|---|
101 | 汎用部品 | 500 |
201 | 車体部品 | 2300 |
202 | 車体部品 | 2400 |
301 | 特殊部品 | 4500 |
T2_SAMPLE
SERIAL | I1_CODE | I_COST |
---|---|---|
203001 | 101 | 2500 |
203002 | 201 | 6500 |
203003 | 301 | 9800 |
203004 | 201 | 5500 |
203005 | 201 | 5600 |
203006 | 202 | 5600 |
T1_SAMPLE
SERIAL | I1_CODE | I_COST |
---|---|---|
203003 | 301 | 9800 |
SQL実行例の説明(2)
・NOTが指定された場合には副問い合わせの結果が真であれば偽、偽であれば真と否定されます。
SQL実行の結果(2-1)
・条件式に一致する副問い合わせの結果リストはI1_NAMEにエンジン部品が存在するか。(左)
・副問い合わせの結果は偽となるが、NOTが指定されているので副問い合わせの結果は真(偽の否定)となるのでT1_SAMPLE表からデータを取得します。(右)
SELECT * FROM T1_SAMPLE
WHERE NOT EXISTS (
SELECT * FROM T2_SAMPLE
WHERE I1_NAME = 'エンジン部品'
);
I1_CODE | I1_NAME | I1_PRICE |
---|---|---|
101 | 汎用部品 | 500 |
201 | 車体部品 | 2300 |
202 | 車体部品 | 2400 |
301 | 特殊部品 | 4500 |
T2_SAMPLE
SERIAL | I1_CODE | I_COST |
---|---|---|
203001 | 101 | 2500 |
203002 | 201 | 6500 |
203003 | 301 | 9800 |
203004 | 201 | 5500 |
203005 | 201 | 5600 |
203006 | 202 | 5600 |
T1_SAMPLE
SERIAL | I1_CODE | I_COST |
---|---|---|
203001 | 101 | 2500 |
203002 | 201 | 6500 |
203003 | 301 | 9800 |
203004 | 201 | 5500 |
203005 | 201 | 5600 |
203006 | 202 | 5600 |
SQL実行の結果(2-2)
・条件式に一致する副問い合わせの結果リストはI1_NAMEに車体部品が存在するか。(左)
・副問い合わせの結果は真となるが、NOTが指定されているので副問い合わせの結果は偽(真の否定)となるのでT1_SAMPLE表からデータを取得しません。(右)
SELECT * FROM T1_SAMPLE
WHERE NOT EXISTS (
SELECT * FROM T2_SAMPLE
WHERE I1_NAME = '車体部品'
);
I1_CODE | I1_NAME | I1_PRICE |
---|---|---|
101 | 汎用部品 | 500 |
201 | 車体部品 | 2300 |
202 | 車体部品 | 2400 |
301 | 特殊部品 | 4500 |
T2_SAMPLE
ID | L_NAME | F_NAME | SEX |
---|---|---|---|
100101 | 山田 | 晴男 | 1 |
100102 | 山田 | 愛 | 2 |
100103 | 鈴木 | 二郎 | 1 |
100104 | 田中 | 栄吉 | 1 |
100105 | 木村 | 匠 | 1 |
T1_SAMPLE
問い合せ結果はありません。