• 締切済み

inner join,left join, right join  について

innerjoinとleftjoinとrightjoinについてお聞きします。 この3つの検索方法の違いがよく理解できません。 どなたか宜しくお願いします。 また、どのような時にどの検索方法が適しているか、 具体例などを添えていただければ分り易いかと思います。 宜しくお願いします。

みんなの回答

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.3

一応、実SQLを載せておきます。 ※机上で書いてて合っているか不安になったので。 create table 表1 ( col1 char(1) ); create table 表2 ( col1 char(1) ); insert into 表1 values('A'); insert into 表1 values('B'); insert into 表1 values('C'); insert into 表2 values('C'); insert into 表2 values('D'); insert into 表2 values('E'); select a.col1,b.col1 from 表1 a inner join 表2 b on a.col1 = b.col1 order by 1,2; 表1 表2 ----- ----- C C select a.col1,b.col1 from 表1 a left outer join 表2 b on a.col1 = b.col1 order by 1,2; 表1 表2 ----- ----- A NULL B NULL C C select a.col1,b.col1 from 表1 a right outer join 表2 b on a.col1 = b.col1 order by 1,2; 表1 表2 ----- ----- C C NULL D NULL E select a.col1,b.col1 from 表1 a full outer join 表2 b on a.col1 = b.col1 order by 1,2; 表1 表2 ----- ----- A NULL B NULL C C NULL D NULL E

inuoyogi7
質問者

お礼

申し訳ありません。 お礼の投稿、遅くなりました。 それぞれの違い、よく理解することができました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

BOOKS ONLINEの以下を参照してください。 http://msdn.microsoft.com/ja-jp/library/ms191517(SQL.90).aspx http://msdn.microsoft.com/ja-jp/library/ms191472(SQL.90).aspx 特徴的には以下の表1と表2を結合した場合に、どのような結果が戻されるかです。 表1 A B C 表2 C D E inner join 表1 表2 -- -- C C left outer join 表1 表2 -- -- A null B null C C right outer join 表1 表2 -- -- C C Null D Null E full outer join 表1 表2 -- -- A NULL B NULL C C NULL D NULL E

inuoyogi7
質問者

お礼

返信ありがとうございます。 添付して頂いたサイトも参考にしてみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

いずれのJOINもテーブルを結合して検索するときに使います。 結合するときには、結合条件を指定されます(これが結合時のキーになります) INNER JOINは結合された2つのテーブルの両方に結合キーの値を持つデータがなければ、 仮に一方にはデータがあっても抽出されません。 LEFT OUTER JOINは主テーブルにデータがあれば、従テーブルにそのキーのデータがなくても抽出されます。 このとき従テーブルにはデータがないわけなので、従テーブルの項目は全部NULL(値不明・値未決定の意味)になります。 例としては、社員マスタと部署マスタなどで考えてみるといいでしょう。 社員マスタには全ての社員のデータが登録されていますが、一部の社員はまだ所属部署が決まっていないとします。 (社員マスタが主、部署マスタが従のテーブルと考えます) SELECT a.社員コード, a.社員名, b.部署名 FROM 社員マスタ a INNER JOIN 部署マスタ b ON b.部署コード=a.部署コード =>部署が決まっている社員だけが抽出されます SELECT a.社員コード, a.社員名, b.部署名 FROM 社員マスタ a LEFT OUTER JOIN 部署マスタ b ON b.部署コード=a.部署コード =>全ての社員が抽出されますが、部署が決まっていない社員の部署名はNULLと表示されます。 RIGHT OUTER JOINは、LEFT OUTER JOINの主と従をひっくり返して考えればよいのです。 SELECT a.社員コード, a.社員名, b.部署名 FROM 社員マスタ a RIGHT OUTER JOIN 部署マスタ b ON b.部署コード=a.部署コード =>全ての部署が抽出されますが、まだ所属社員の決まっていない部署の社員コードと社員名はNULLと表示されます。 言いかえればRIGHT OUTER JOINは全てLEFT OUTER JOINに書き換えることができます。 SELECT a.社員コード, a.社員名, b.部署名 FROM 部署マスタ b LEFT OUTER JOIN 社員マスタ a ON a.部署コード=b.部署コード 実はデータベースも処理するときにRIGHT OUTER JOINは内部的にLEFT OUTER JOINに書き換えて処理しています。 つまり、RIGHT OUTER JOINは無理に使う必要はないということです。 構文としても、RIGHT OUTER JOINを使われると、「どのテーブルをメインのテーブルと考えて抽出を行おうとしているのか」が分かりにくくなりますので、お勧めしません。 (AccessなどでGUIでリレーションシップを張ると、RIGHT OUTER JOINが使われたSQL文を生成してくれたりするのですが、あとでメンテナンスするときには、とてもわかりにくいですよ。私個人でも、RIGHT OUTER JOINを書いたのは資格試験の問題を解くときだけで、実務で使ったことはほぼゼロです)

inuoyogi7
質問者

お礼

返信ありがとうございます。 RIGHT JOINは無理に使う必要はないんですね。 実際、どんな時にRIGHT JOINを使うのか分からなかったので とりあえず、使わないようにします。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • inner join left joinについて

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

  • Left Joinについて

    Left Joinについて select * From shohin left join meisho on sh03 = me02 and me01 = 1 where **** select * From shohin left join meisho on sh03 = me02 where me01 = 1 left joinの中に me01 = 1があるパターンとwhere句に me01 = 1 があるパターンで検索結果が変わってくる具体的にどう変わるのでしょうか 良く理解ができていないので教えてください

  • Inner join と Left joinの明確な違いは?

    Inner join と Left joinの違いがよくわかりません。 教えてください。

  • LEFT JOINとRIGHT JOINについて

    SQL初心者です。 基本的な質問ですみません、教えてください。 LEFT JOINとRIGHT JOINについて、どちらのテーブルを左側、どちらのテーブルを右側にするのかが分かっていません。どういう基準で左側、どういう基準で右側と考えれてばいいのでしょうか? 宜しくお願いします。

  • Inner Joinについて

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID(プライマリーキー) ・数量 データ 001,1 002,2 追加テーブル ・ID(プライマリーキーではない) ・数量 データ 001,3 001,4 002,1 002,2 上記のようなデータがあります。 Updateクエリを実行したときに、追加テーブルにある数量を、在庫テーブルにある数量に足しこみたいです。 欲しい結果は、在庫テーブルのデータが 001,8 002,5 となっていてもらいたいです。 Update 在庫テーブル Inner Join 追加テーブル On 在庫テーブル.ID = 追加テーブル.ID Set 在庫テーブル.数量 = 在庫テーブル.数量 + 追加テーブル.数量 上記のようなSQLを教えてもらったので実行したら問題なくできました。 ただし、どのようなプロセスで結果が得られたのかわかりません。 どうぞ、ご教授お願いいたします。

  • INNER JOINについて

    こんにちは、現在下のWEBでSQLの勉強をしているのですが・・・。 http://www.pursue.ne.jp/jouhousyo/SQLDoc/select21.html INNER JOINについて質問です。 FROM 表名1 INNER JOIN表名2 ON 表名1.フィールド名 = 表名2.フィールド名 このONというコマンド、これは連結するフィールド名を表しているのですよね?これは、無くてはならないコマンドでしょうか。例えば、このウェブの問題だと、売上表.顧客CD=顧客表.顧客CD をする事で、顧客CDがソートされ、同じものが連結されてます。 もし、顧客CDの値が、二つの表で異なった場合、異なった値は切り捨てられ、その行は融合されないと言う事ですよね? なら、例えば普通に二つの表の値を比べたい場合、例えば、 A表: 売り上げ総合、日付、顧客表 B表: 顧客名、売り上げA、売り上げB という表があったとして、表Bの売り上げレートを表Aの総売上で割り、書く平均値を出したい場合、 SELECT  表B.売り上げA / 表A.売り上げ総合, 表B.売り上げB / 表A.売り上げ総合 FROM 表A INNER JOIN 表B として、ONを使わなくても大丈夫でしょうか?

    • ベストアンサー
    • MySQL
  • ちょっと見かけない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について

    SQLのデータ抽出方法についてお教え下さい。 TABLE_2をdistinctで重複を無くして、TABLE_1とinner joinさせたいです。 select distinct TABLE_2.id と select TABLE_1.ID from TABLE_1 inner join distinct TABLE_2.ID といったようなことをやりたいです。 TABLE_1 ID 001 001 002 002 002 TABLE_2 ID 001 001 002 002 002 環境はMYSQL5.5になります。よろしくお願いいたします。

  • Left Join/Right Join の意味

    Left Join/Right Join を、accessクエリのデザイン画面では使っています。 SQLではLeft Join/Right Join となりますが、この「右」「左」という言葉を使う意味を教えていただけないでしょうか。 #なぜ「右」「左」というのかよくわからないため。 #まことに初歩的な質問だと思いますが。

  • LEFT JOINの使い方

    linkテーブルとcommentテーブルがあります。 下記のようなSQLをPHPから発行すると、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from comment AS c LEFT JOIN link AS l ON c.pid=l.id order by c.id desc LIMIT 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずNULLになってしまいます。 ためしに LEFT JOINの左右を下記のように入れ替えみたところ、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from link AS l JOIN comment AS c LEFT ON c.pid=l.id order by c.id desc LIMIT 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずNULLになってしまいました。 どこがおかしいのでしょうか? MYSQLは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • インターネットがつながらないトラブルに関する相談や解決方法についてまとめました。
  • ひかりTVのインターネット接続に関する問題について、試したことやエラー番号などを解説します。
  • ひかりTVでインターネットがつながらない場合のトラブルシューティングや対処方法についてご紹介します。
回答を見る