- ベストアンサー
SQLのINとEXISTSの違い、相関問合せと相関副問合せの違いについて
- SQLのINとEXISTSは、条件式で複数の値を比較する際に使用されるが、その使い方には違いがある。INは特定の項目が、サブクエリの結果に含まれているかどうかを確認するために使用される。一方、EXISTSはサブクエリの結果が空でないかどうかを確認するために使用される。
- 相関問合せは、副問合せ文中で主問合せの表を参照することを指す。ただし、相関問合せはEXISTSの場合にのみ使用することができる。一方、INを使用している場合でも相関問合せは使われることがある。これにより、主問合せと副問合せが関連付けられ、特定の条件が満たされる場合にのみ結果を返すことができる。
- 相関副問合せは、相関問合せと同じように、副問合せ文中で主問合せの表を参照することを意味する。しかし、相関問合せと異なり、相関副問合せは副問合せが主問合せに関連するフィルタリング処理を行うために使用される。つまり、相関副問合せは副問合せの結果を条件に基づいてフィルタリングすることができる。相関副問合せは、相関問合せの一部として使用されることもある。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> ある資料によると テーブル名とキー名を読み替えてみればわかることですが、 ご提示のコードは、私が既に提示したサンプルコードと全く同一です。 > select Aコード from 品物 > where exists (select Aコード from 明細 > where 品物.Aコード=明細.Aコード) ここで、副問い合わせの「select Aコード」の「Aコード」は、 別に「Aコード」である必要はなく、「*」でも「'x'」でも何でも良いです。 exists は、その副問い合わせの結果が真(有効行がある)か偽(有効行が無い) かで判断します。 > select Aコード from 品物 > where exists (select Aコード from 明細 > where 品物.Aコード=明細.Aコード) 1.(品物)ある1行を選択 2.(明細)1で選択した行の品物.Aコードが、明細.Aコードと一致するものがあれば真となり1の行は選択される。 ここで、一致しなければ結果は偽となるため、1の行は選択されない。 3.すべての品物テーブルの行について1~2を繰り返す。 > select Aコード from 品物 > where Aコード in (select Aコード from 明細) 1.(明細)明細テーブルから明細.Aコードをすべて選択。 2.(品物)品物.Aコードが1で選択された明細.Aコードと一致するものがあればその行を選択。 ここで、一致しなければその行は選択されない。 結果的に、いずれも、品物テーブルと明細テーブルで、両方に同一のAコードが存在する Aコードが選択されます。 [0#: も] っとも、今回のような単純なケースであれば、下記のように結合を使ったほうが速いですが。。 select 品物.Aコード from 品物, 明細 where 品物.Aコード = 明細.Aコード
その他の回答 (1)
- RAPTsong
- ベストアンサー率42% (74/175)
select * from foo_tbl where key1 in (100,200,300); これは、下記のSQL文と同等です。 select * from foo_tbl where key1 = 100 or key1 = 200 or key1 = 300; select * from foo_tbl where exists (select key1 ftom baz_tbl where key1 = 200) このSQL文は、baz_tblテーブルのkey1が200である行が存在した場合、 foo_tblのすべての列を返します。 すなわち、in は選択された列のいずれかと一致した場合にその行が 選択されますが、existsの場合は、()内で選択された行が1つでもあれば 主問い合わせ側の行は有効となります。 相関は、 select * from A where exists (select 'x' from B where A.PK = B.PK) などのように使用します。 上記SQL文は下記のように書き換える事も可能です。 select * from A where PK in (select PK from B) ちなみに、相関副問い合わせは、やってみたら分かることですが、 INでもEXISTSでも使用可能です。 > ”相関副問合せ”というものがあり、相関問合せと同じものなのか 同じコトでしょう。そもそも、「相関」は副問い合わせ以外では 発生しようがないので。
お礼
回答ありがとうございます。ほとんど理解できました。 ただINとEXSITSの違いがなんとなく・・・。言われて見れば そうだなぁと思うのですがイメージがつきませんでした。 ある資料によると、 select Aコード from 品物 where exists (select Aコード from 明細 where 品物.Aコード=明細.Aコード) はINを使うと select Aコード from 品物 where Aコード in (select Aコード from 明細) と書き換えることができるそうです。 この二つは実際は どのように検索して結果を表示するのか、もう一度ご説明お願いしたいのですが・・・。