SQL
1SELECT * 2FROM table_a a 3INNER JOIN table_b b ON a.col1 = b.col1;
SQL
1SELECT * 2FROM table_a a 3WHERE EXISTS ( 4 SELECT * 5 FROM table_b b 6 WHERE a.col1 = b.col1 7);
上記の2つのSQLは、同じ結果が返ります。
Q.あなたはJOIN派ですか?EXISTS派ですか?
どのような規模の案件を想定して頂いても構いません。
使い分けるならば、どういう場合でどちらを選択しますか?
長いこと、色々な人の意見を聞いてみたいと思っていたので、是非お気軽にご回答下さい。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答3件
2
上記の2つのSQLは、同じ結果が返ります。
つまり、
table_a
とtable_b
は粒度col1
はtable_a
やtable_b
の主キー、あるいはユニークキーtable_a
とtable_b
は 1 対 0..1 な関係
ということですね?
もしそうなのであれば、SELECT 句を a.* にしたうえで JOIN を使うかもしれません。
特に根拠があるわけではありませんが、相関サブクエリよりもただの結合の方が RDBMS による最適化の余地がありそうな気がするからです。
例えば、EXISTS だと table_a
から駆動する以外に選択肢が無さそうですが、JOIN なら table_b
から駆動できるかもしれません。
もし、table_a
が 100万件に対して、table_b
が 100件しかないのであれば、その差は歴然だと思います(極端な例だと思いますが)。
ただ、もし、その2つのテーブルの粒度が同じではなく、1 対 0..N な関係なのだとしたら、JOIN の方には GROUP BY も必要になるはずなので、そんなことをするぐらいなら EXISTS にすると思います。
投稿2015/09/01 13:04
総合スコア4512
2
ベストアンサー
理想論で言えば、table_aのカラムがメインでtable_bを絞込み条件としてのみ見る場合はEXISTSを使いたくなります。
逆に、table_b固有のカラムに興味があるようなクエリを書く場合はJOINを使います。
質問タイトルは前者に該当すると思うので、EXISTSの方が好みですかね。
後は使うDBMSの特性とパフォーマンス要件次第です。
よく話題にあがる例で言えばMySQL(特に古いバージョン)は相関サブクエリがどうしても遅くなるので、JOINに寄る事が多いです。最終的には実行計画と測定結果を見て決める話ですが。
月並みな回答ですね・・・。
私も色々な方の回答が気になります!
投稿2015/09/01 12:41
編集2015/09/01 12:46総合スコア594
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
0
場合によりけりかと
EXISTS : 結果にtable_b の情報を使用しない場合
JOIN : 結果にtable_b の情報を使用する場合
結果が同じでも、確か『EXISTS』の方がパフォーマンスがよい様な記事を見たことがあります。
うろ覚えですみません。
投稿2015/09/03 01:01
総合スコア12
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
関連した質問
Q&A
解決済
sqlでfrom句に複数テーブルを指定し、結合条件を記載しない場合の取得結果について
回答5
クリップ3
更新
2016/03/14
Q&A
解決済
【Googleスプレッドシート】QUERY関数のselect でF列とL列の値を合計したい
回答1
クリップ0
更新
2023/03/26
Q&A
受付中
oracleで変数を利用したい
回答2
クリップ0
更新
2023/03/16
Q&A
解決済
PostgreSQL15 書き込みが出来ない
回答1
クリップ1
更新
2023/03/23
意見交換
受付中
EntityFrameworkでの親子関係保証および重複回避の実現方法
回答6
クリップ0
更新
2023/03/21
Q&A
解決済
pythonーselenium4で、select_by_valueでエラー
回答1
クリップ0
更新
2023/03/26
Q&A
解決済
PHPによるbindValueとLIKEを使用した日付検索について
回答2
クリップ0
更新
2023/03/15
Q&A
受付中
php Undefined array key エラー等の解決方法を教えてください。
回答2
クリップ0
更新
2023/03/27
同じタグがついた質問を見る
SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2015/09/03 04:19