3つわからないことがあります。
1.SQLのINとEXISTSって何が違うんですか?
本を見ると
・WHERE 項目 IN(select・・・)
・WHERE EXISTS(select・・・)
INはWHEREとの間に何か入り、EXISTSは何も入ってないようですが・・。違いがわかりません。
2.そして、上の質問の続きですが、副問合せ文中で主問合せの表を参照する
ことを相関問合せと、いうらしいのですが、解説を見ると、existsのときの
み相関問合せは使える、ように書いてあります。しかし別の本ではINを使用
してるときでもこの相関問合せが使われていて・・・・・??何がなん
だかわからなくなりました。
3.そしてまた別の本では、”相関副問合せ”というものがあり、相関問合せと同じ
ものなのか、違うものなのかわかりません。ぱっと見た限りでは相関問合せと同じに見えるのですが・・・
No.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コード
No.1
- 回答日時:
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 明細)
と書き換えることができるそうです。
この二つは実際は
どのように検索して結果を表示するのか、もう一度ご説明お願いしたいのですが・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- 英語 英語の文法について複合関係詞の譲歩の用法について質問です 1 2023/04/01 19:21
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- 弁護士・行政書士・司法書士・社会保険労務士 ★行政書士試験の行政法についての質問になります。 行政事件訴訟法についての質問になります。 問 A県 1 2023/08/13 13:09
- Oracle SQL update方法 2 2022/06/22 14:07
- 数学 【数学ⅲ】三角関数と合成関数の微分について 4 2022/07/07 21:44
- 物理学 英語表現についてどうもわからないので教えて貰えないでしょうか? 具体的には以下の文の中でreflec 1 2023/04/29 20:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CREATE テーブルでの複数外部...
-
Order by句でバインド変数を使...
-
Access終了時の最適化が失敗?
-
SQL 特定のカラムが最大値のレ...
-
10営業日前の日付を取得したい...
-
沿線コード
-
娘の学校から出た暗号解読です...
-
Excelファイルのデータをテーブ...
-
GROUP BYを行った後に結合した...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
-
SQL文で右から1文字だけ削除す...
-
DataGridViewの内容をDBに反映...
-
select句副問い合わせ 値の個...
-
他のテーブルを参照した値はupd...
-
最新の日付とその金額をクエリ...
-
ADO VBA 実行時エラー3021
-
Accessで別テーブルの値をフォ...
-
ヘッダレコードとトレーラレコ...
-
ファイル書込みで一行もしくは...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
CREATE テーブルでの複数外部...
-
Order by句でバインド変数を使...
-
沿線コード
-
SQLServer 日付が直前のレコー...
-
Excelファイルのデータをテーブ...
-
10営業日前の日付を取得したい...
-
SQLの実行結果が異なる
-
SQLに関して
-
【SQL】またぎデータの検索の仕方
-
SQLにて縦を横へ展開
-
ヤマト急便のチェックデジット...
-
スペシャリストの方! 助けてく...
-
SQL GROUP BY
-
娘の学校から出た暗号解読です...
-
SQLで<>を使用するとき、
-
GROUP BYを行った後に結合した...
-
Accessで別テーブルの値をフォ...
-
Oracleでの文字列連結サイズの上限
-
SELECTで1件のみ取得するには?
おすすめ情報