プロが教える店舗&オフィスのセキュリティ対策術

3つわからないことがあります。

1.SQLのINとEXISTSって何が違うんですか?

本を見ると

・WHERE 項目 IN(select・・・)

・WHERE EXISTS(select・・・)

INはWHEREとの間に何か入り、EXISTSは何も入ってないようですが・・。違いがわかりません。

2.そして、上の質問の続きですが、副問合せ文中で主問合せの表を参照する
ことを相関問合せと、いうらしいのですが、解説を見ると、existsのときの
み相関問合せは使える、ように書いてあります。しかし別の本ではINを使用
してるときでもこの相関問合せが使われていて・・・・・??何がなん
だかわからなくなりました。


3.そしてまた別の本では、”相関副問合せ”というものがあり、相関問合せと同じ
ものなのか、違うものなのかわかりません。ぱっと見た限りでは相関問合せと同じに見えるのですが・・・

A 回答 (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コード
    • good
    • 0

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でも使用可能です。

> ”相関副問合せ”というものがあり、相関問合せと同じものなのか
同じコトでしょう。そもそも、「相関」は副問い合わせ以外では
発生しようがないので。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。ほとんど理解できました。
ただINとEXSITSの違いがなんとなく・・・。言われて見れば
そうだなぁと思うのですがイメージがつきませんでした。


ある資料によると、

select Aコード from 品物
where exists (select Aコード from 明細
          where 品物.Aコード=明細.Aコード)

はINを使うと

select Aコード from 品物
where Aコード in (select Aコード from 明細)

と書き換えることができるそうです。
この二つは実際は
どのように検索して結果を表示するのか、もう一度ご説明お願いしたいのですが・・・。
          

お礼日時:2005/09/12 07:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!