HOME»基本情報技術者試験掲示板»INとEXISTSの違い
投稿する
INとEXISTSの違い [2017]
名無しさん(No.1)
何回か調べたり解説を読んだりしたのですが、どうしてもこれの二択になった時迷ってしまいます 判断する時にいい方法とかってありますでしょうか
2019.10.16 15:13
ジョンさん(No.2)
この投稿は投稿者により削除されました。(2019.10.16 22:46)
2019.10.16 22:46
トーシロさん(No.3)
条件に一致するものがあるかないかだけを調べたいならEXISTSでいいですし、一致するレコードも欲しいわがままさんならIN句で取り出せばいいだけです。
例えば会員表の中に○○さんが要るかどうかを調査したいだけならEXISTSで十分ですし、さらにその人のレコードを選択して、個人情報なりを調べたい状況であればIN句を使えばいいでしょう。
問題を見てレコードの内容が必要なければEXISTS、でいいんじゃないかと思います。基本的にはIN句の方が汎用性があって便利なので迷ったらIN句を選ぶのが無難かもしれません。
求めていた内容と違ってたらすみません。
例えば会員表の中に○○さんが要るかどうかを調査したいだけならEXISTSで十分ですし、さらにその人のレコードを選択して、個人情報なりを調べたい状況であればIN句を使えばいいでしょう。
問題を見てレコードの内容が必要なければEXISTS、でいいんじゃないかと思います。基本的にはIN句の方が汎用性があって便利なので迷ったらIN句を選ぶのが無難かもしれません。
求めていた内容と違ってたらすみません。
2019.10.16 22:49
ジョンさん(No.4)
INとEXISTの違いを細かく説明してほしいとなると少々厄介ですが
****************
SELECT 列名 FROM 表
WHERE【 】 (SELECT~)
****************
のような副問い合わせの時に
【 】にINとEXIST、どっちを使えばよいか?なら簡単です。
●INの場合
WHEREと【IN】の間に列名の指定が必要。
つまりWHERE 列名【IN】(SELECT~)・・・となる。
●EXISTの場合
【EXIST】のみ。
つまりWHERE 【EXIST】(SELECT~)・・・になる。
見当違いな回答だったらすみません。
****************
SELECT 列名 FROM 表
WHERE【 】 (SELECT~)
****************
のような副問い合わせの時に
【 】にINとEXIST、どっちを使えばよいか?なら簡単です。
●INの場合
WHEREと【IN】の間に列名の指定が必要。
つまりWHERE 列名【IN】(SELECT~)・・・となる。
●EXISTの場合
【EXIST】のみ。
つまりWHERE 【EXIST】(SELECT~)・・・になる。
見当違いな回答だったらすみません。
2019.10.16 23:06
Rさん(No.5)
IN演算子は、INを挟んで左側のデータが、INを挟んで右側の【リスト】の中にあるかを真偽で判定します。
対して、EXISTS演算子は、続く副問い合わせに「行が存在するか否か」を真偽で判定します。
IN演算子は様々な比較対象があります。
・単数列、単数行との比較
列A IN (データ1) ← = による比較と同義
・単数列、複数行との比較
列A IN (データ1, データ2, データ3) ← 1列3行の選択が行われる副問い合わせ
・複数列、複数行との比較
(列A , 列B) IN ( (データ1, データ2), (データ3, データ4) ) ←2行2列
EXISTS演算子は、単なる比較ではなく、前述のとおり「副問い合わせの結果が1行以上あるかないか」で判定しています。
変わっているのは、EXISTSを用いる場合には、副問い合わせの中で、主問い合わせで出現する列を利用することができます。
SELECT a, b, c FROM T1
WHERE EXISTS (
SELECT d FROM T2
WHERE T1.a = T2.d )
普通なら、副問い合わせでT1の列aにはアクセスできません。
しかし、EXISTSを利用する場合はアクセスすることができます。
対して、EXISTS演算子は、続く副問い合わせに「行が存在するか否か」を真偽で判定します。
IN演算子は様々な比較対象があります。
・単数列、単数行との比較
列A IN (データ1) ← = による比較と同義
・単数列、複数行との比較
列A IN (データ1, データ2, データ3) ← 1列3行の選択が行われる副問い合わせ
・複数列、複数行との比較
(列A , 列B) IN ( (データ1, データ2), (データ3, データ4) ) ←2行2列
EXISTS演算子は、単なる比較ではなく、前述のとおり「副問い合わせの結果が1行以上あるかないか」で判定しています。
変わっているのは、EXISTSを用いる場合には、副問い合わせの中で、主問い合わせで出現する列を利用することができます。
SELECT a, b, c FROM T1
WHERE EXISTS (
SELECT d FROM T2
WHERE T1.a = T2.d )
普通なら、副問い合わせでT1の列aにはアクセスできません。
しかし、EXISTSを利用する場合はアクセスすることができます。
2019.10.17 16:08
Rさん(No.6)
☆よさそうな判断方法
EXISTSの説明でも述べた通り、「副問い合わせから主問い合わせにアクセスできる」というのが非常に大きな特徴です。
この特徴は、主問い合わせにアクセスしていなければ、「EXISTSの意味があまりない」ことがほとんどです。(わざとアクセスしない場合もあるんでしょうが。。。少なくともFEの過去問でそんなことはなかったはず)
つまり、【副問い合わせを確認し、主問い合わせで射影された列を参照していれば】EXISTSを利用する可能性が大きいです。
EXISTSの説明でも述べた通り、「副問い合わせから主問い合わせにアクセスできる」というのが非常に大きな特徴です。
この特徴は、主問い合わせにアクセスしていなければ、「EXISTSの意味があまりない」ことがほとんどです。(わざとアクセスしない場合もあるんでしょうが。。。少なくともFEの過去問でそんなことはなかったはず)
つまり、【副問い合わせを確認し、主問い合わせで射影された列を参照していれば】EXISTSを利用する可能性が大きいです。
2019.10.17 16:11
名無しさん(No.7)
分かりやすく教えてくださってありがとうございます!おかげで良く分かりました!
2019.10.18 11:29