• ベストアンサー
  • 暇なときにでも

INNER JOINの有用性

INNER JOINの有用性 内部結合時に「INNER JOIN」と記述する有用性を教えてください。 内部結合を行なう際は、一般的には FROM句にテーブル名を列挙し WHERE句にテーブル間結合条件を列挙する という形式をとります。少なくとも私は。 これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。 私がぱっと思いつくレベルであれば、 「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の 2種類の条件が混在している。混乱を避ける為これを分離する」 と、屁理屈をこねることも可能ですが、 FROM句にテーブルと「INNER JOIN」記述を混在させるほうが よっぽど分かりにくいように感じます。 あとさらに強いて言えば、「LEFT JOIN」にしたり「INNER JOIN」にしたりを 頻繁に切り替える場合とか。そんなこともまずないと思いますが…。 なので、「INNER JOIN」を使用する有用性をまったく感じません。 あえて使用する意味はあるのでしょうか? 質問は ・内部結合時に「INNER JOIN」を使用する有用性があるのか? ・有用性があるのであればどのような場合か? です。よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数5692
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3

本質的な差異はありません。 パフォーマンスに差が出るという事も 常識的にはありえないと思います。 今のオプティマイザはそんなに質は悪くありません。 20年以上前のDBもしくは無名で信用性の無いDBをあえて 使うという状況でもない限り気にしなくていいと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど。特に差は無いのですね。 あとは趣味嗜好の差ですかね。 参考になりました。ありがとうございました。

関連するQ&A

  • ちょっと見かけないinner joinについて

    どなたか以下の構文について教えて下さい。 どこのDBMSで使用されるものなのでしょう? SELECT B.項目1, B.項目2, A.項目2, A.項目3 FROM ( ( SELECT * FROM Bテーブル WHERE 項目3>"1" ) B INNER JOIN ( SELECT * FROM Aテーブル WHERE 項目2=10 ) A ON B.項目1=A.項目1; 意味はわかるのですが、普通のinner joinとは違うもので。

  • inner join left joinについて

    inner join left joinの動きについては 理解しているつもりなのですが どういったテーブルの時innerにして どんなテーブルの時left joinにするかが わかりません inner join left join の選択方法 ※どっちを使えばよいかの見極め方について 教えて下さい

  • WHERE句で結合。INNER JOINとの違い

    MySQLで複数テーブルからデータ取得する際、 FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、 「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか? ・「INNER JOIN」と同じ意味でしょうか? ・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか? ・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか? ・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…

    • ベストアンサー
    • MySQL

その他の回答 (2)

  • 回答No.2
  • yambejp
  • ベストアンサー率51% (3827/7415)

>わからないとまったく役に立たない情報になってしまいます。 そうじゃなくて、SQLのチューニングなんてトライアンドエラーだと いうことでしょう。 方法が複数ある、どれが速いかわからないという情報をもっておけば チューニングの際によりよい方法を模索できるのです。 それとJOIN系の処理にはUSINGが使えたり、サブクエリで結合する ときに可読性がたかかったりする場合もあるので、スピード以外でも JOINを使う意義はあると思います。 運用上たいてい主テーブルがあってそれに正規化されたテーブルを くっつけていくことが多いでしょうから、感覚的(心情的)にも どちらかといえばWHEREにテーブルを列記することの方がまれじゃ ないですか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

確かにUSINGが使えるというのは、「INNER JOIN」ならではですね。 それから、あなたは特に理由がなければ「INNER JOIN」を使う ということなのですよね。「INNER JOIN」を好んで使おうとする 人もいるということがわかり参考になりました。 ありがとうございました。

質問者からの補足

# サブクエリで結合するときに可読性がたかかったりする場合もある この点はイメージできませんでした。 出来れば具体的な例を挙げていただきたいです。 よろしくお願いします。

  • 回答No.1

>・有用性があるのであればどのような場合か? 「結果だけ」を見れば「同じ結果を返す」のであるから、好きな方を使えば良い。有効性、無効性の問題ではない。 だたし「どのデータベースエンジンを使うか」により、決定的で致命的な差異が発生する。 結果が同じでも「結果が抽出されるに至るまでのトランザクションの量」が、エンジンごとに違う。 データベースエンジンごとに、得手、不得手があるので 「WHERE句で結合を書くと総当り全件がトランザクションされてからWHERE句により絞り込みされるが、JOIN句で書くと結合を行った部分のみがトランザクションされてからWHERE句により絞り込みされるので、JOIN句で書いた方が圧倒的に早い」 と言うエンジンと 「JOIN結合は他のSQL構文と互換性を持たせるだけのオマケ的存在で動作が非常に遅く、総当り全件をトランザクションさせてからWHERE句で抽出した方が圧倒的に早い」 と言うエンジンがあったりする。 馬鹿の一つ覚え的に「WHERE句で出来るからINNER JOINなんか要らない」と思っていると「INNER JOINって書けば一瞬で結果が返って来るのに、わざわざ結果が出るのに5秒もかかるSQL文を書いている」なんて事が起きている事に気付けない。 結果が同じでも、そこに至るまでの過程が異なるのであるから「適材適所」を心がけるべし。 要は「WHEREで書いた方が動作が速いエンジンではWHEREで、INNER JOINで書いた方が動作が速いエンジンではINNER JOINで書くべし」と言う事。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

パフォーマンスに影響をもたらすことがあるということですね。 参考になりました。 ありがとうございました。 しかし ・WHEREで書いた方が動作が速いエンジン ・INNER JOINで書いた方が動作が速いエンジン がわからないとまったく役に立たない情報になってしまいます。 もしご存知であれば、知っている範囲で結構ですので ・WHEREで書いた方が動作が速いエンジン ・INNER JOINで書いた方が動作が速いエンジン をそれぞれ教えてください。 よろしくお願いします。

関連するQ&A

  • INNER JOINとwhere句

    等結合のSQLを書く必要が出てきた場合、 INNER JOINとwhere句 どちらを使用されてるか教えて頂けないでしょうか? 私は、結合表の数が多くなってくると INNNERのSQLはぱっと見て見にくいと想いWHEREを使っているのですが。 (何より、WHEREのほうが構文が簡単で・・・。) よろしくお願いします。

  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • INNER JOIN > EXISTS > IN

    SQL Server 2008での話です。 製品テーブルと、その製品の売れ行きのランキングデータを格納するテーブルがあって、 売れ行きの良いものTOP10だけ取り出したいと思っています。 製品IDがキーになっています。 ランクテーブルから10位以内の製品IDをSELECTし、それをIN句に 入れるということをやっていたのですが、遅かったので、EXISTSに 書き変えました。 更に、INNER JOINにしてしまえば、WHERE句より実行されるので、 より速くなると聞き、試しているところです。 実際、速くはなったのですが、以下パターンだとそれほど差が出ません。 (データの件数のせいだとは思いますが…) どちらがベターなのでしょうか。 Bのほうが先に絞り込みをしてから結合されるから、速い…ような気が しているのですが、動き的には一緒だったりしますかね…。 もしより良い書き方がありましたらご教授ください。 ■Aパターン SELECT * FROM 製品テーブル INNER JOIN ランクテーブル ON 製品テーブル.製品ID = ランクテーブル.製品ID AND ランクテーブル.順位 <= 10 ■Bパターン SELECT * FROM 製品テーブル INNER JOIN ( SELECT ランクテーブル.製品ID FROM ランクテーブル WHERE ランクテーブル.順位 <= 10 ) TMP ON TMP.製品ID = 製品テーブル.製品ID

  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • inner joinでサブクエリ

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID ・数量 データ 001,1 001,3 002,3 002,2 002,4 003,2 商品テーブル ・ID データ 001 002 003 004 やりたいこと: 在庫テーブルには重複しているIDがあります。 商品テーブルには重複しているIDはありません。 在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。 ・select distinct ID FROM 在庫テーブル ・select ID FROM 商品テーブル この2つのjoin方法がわかりません。 結果として、 001 002 003 を取得したいいです。宜しくお願いします。 ちなみに select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル) というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

  • サブクエリ内で INNER JOIN は

    グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、 以下のサイトで知ることができましたが。 http://www.yokablo.com/20120905717.html tb_score +-------+-------+-------+ | c_name | game | c_score | +-------+-------+-------+ | 山田 | 高飛び | 90 | +-------+-------+-------+ | 山田 | 徒競走 | 85 | +-------+-------+-------+ | 山田 | 玉入れ | 90 | +-------+-------+-------+ | 鈴木 | 徒競走 | 85 | +-------+-------+-------+ | 鈴木 | 騎馬戦 | 50 | +-------+-------+-------+ | 室伏 | 綱引き | 100 | +-------+-------+-------+ | 室伏 | 玉入れ | 10 | +-------+-------+-------+ SQL文: SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE 私の場合、t_score の親テーブル名`t_company`と、 子テーブル`t_items`がありまして、 以下のようなことをやりたかったのですが、エラーとなります。 上記SQL をサブクエリにします。 select * from ( SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING ( c_name ) INNER JOIN t_company ON t_company.c_name = tb_score.c_name WHERE c_score = MAXSCORE ) as T1 , t_items where T1.id_score = t_items.id_score 結果エラーメッセージは、 #1060 - Duplicate column name 'c_name' でした。 エラー箇所が、 GROUP BY c_name か、 USING ( c_name ) か、 INNER JOIN t_company ON t_company.c_name = tb_score.c_name なのか、分かりません。 SQL の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • INNER JOINしてGROUP BYしたいんですが

    はじめまして。Oracle初心者です。非常にハマって困っています。 テーブルAとBがあります。Aには商品の一覧が、Bには商品の複数の属性が格納されており、AとBをJOINすると、結果に商品が重複して含まれてしまいます。 SELECT A.商品名,B.属性 FROM A INNER JOIN B ON A.商品ID=B.商品ID; 結果 ------- 商品名1,属性あ 商品名1,属性い 商品名1,属性う 商品名2,属性あ .... テーブルBを使って、「属性あ」を持たない重複しない商品名の一覧を取得したいのですが、 SELECT A.商品名,A.商品ID FROM A INNER JOIN B ON A.商品ID=B.商品ID AND B.属性!='属性う' GROUP BY A.商品名,A.商品ID これでできそうな気がするのですが、エラーになってしまいます。 本当はさらにWHEREをつけて SELECT A.商品名,A.商品ID FROM A INNER JOIN B ON A.商品ID=B.商品ID AND B.属性!='属性う' GROUP BY A.商品名,A.商品ID WHERE A.商品名 like 'あ%'; とかもしたいのですが。。 Oracleは10gです。 解決策を教えていただきたく、よろしくお願いします。

  • どちらのLEFT JOINが早いでしょうか?

    下記2つのテーブルがあったとします。 ・大テーブルA 7000万件 ・小テーブルB 2000件(※現在はWHERE句で指定すると1件) をJOINする場合、下記のどちらの方法が望ましいでしょうか? 案1)子テーブルを親とする方法 テーブルA(ON句により1件~2000件) LEFT JOIN 7000万件のテーブルB 案2)親テーブルを子とする方法 7000万件のテーブルB LEFT JOIN テーブルA(ON句により1件~2000件) 又、LEFT JOINの、ON句で条件を絞るのと、 WHERE句で条件を絞るのではどちらが好ましいでしょうか?

    • ベストアンサー
    • MySQL
  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • KeySQLで内部結合(INNER JOIN)ってどうやるの?

    KeySQL R6.0を用いてます。 (製品の購入手配していますが、取り合えず急ぎでトライアル版を使っています) ある開発されたシステムの品質が悪いため、MS-ACCESS(ODBC接続)でデータ抽出して、MS-EXCLEの一覧にして、客先に提出しています。 しかし、MS-ACCESS(ODBC接続)では、重くて抽出に時間がかかって、たまにエラー発生(時間がかかり過ぎのため?)したりします。 また、SQL文はあまり得意ではないので、混み入ったSQL文を書くのに時間がかかってしまう・・ そこで、KeySQLの存在を知り、用いているのですが、複数のテーブルの内部結合(INNER JOIN)の方法がわかりません。 外部結合(JOIN)は、表結合というところで簡単にできるようになっているようなのですが、内部結合させるにはどのように指定すれば良いのでしょうか? ご面倒ですが、どなたかご教授下さいませ。 よろしくお願いします。m(__)m