ベストアンサー Inner join と Left joinの明確な違いは? 2004/01/09 15:32 Inner join と Left joinの違いがよくわかりません。 教えてください。 みんなの回答 (4) 専門家の回答 質問者が選んだベストアンサー ベストアンサー chie65536 ベストアンサー率41% (2512/6032) 2004/01/09 16:05 回答No.4 出てくる結果が違います。 テーブル1のフィールド1に、 1 2 3 4 5 6 が、 テーブル2のフィールド1に、 1 2 3 7 8 9 が入力されている場合、 SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1] FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1]; では、結果は、 テーブル1.フィールド1 テーブル2.フィールド1 1 1 2 2 3 3 4 NULL 5 NULL 6 NULL の6レコードが出力されますが、 SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1] FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1]; では、結果は、 テーブル1.フィールド1 テーブル2.フィールド1 1 1 2 2 3 3 の3レコードしか出力されません。 質問者 お礼 2004/01/09 16:24 ありがとうございます。 説明、シンプルでとてもわかりやすかったです。 使わせてくださいね☆ 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (3) jxt ベストアンサー率48% (42/86) 2004/01/09 16:04 回答No.3 対応させるべきはinner joinとouter joinなんですけど、 left join は left outer join と同等です。 innter joinは結合する相手のテーブルに対応するデータが ある場合のみ結果を返しますが、outer joinは相手の テーブルに対応するデータが無い場合、そのカラムを NULLとして返します。 あるouter joinのクエリの結果が (等幅で見れればいいんだけど) field1 |field2 | --------+--------+ Apple |Red | Melon |NULL | Grape |Purple | --------+--------+ だとしたら、inner joinは field1 |field2 | --------+--------+ Apple |Red | Grape |Purple | --------+--------+ のように返します。outer joinは他にright outer joinと full outer joinがあります。 質問者 お礼 2004/01/09 16:26 outer join・・・? ちょっと調べてみます。ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 mfuku ベストアンサー率50% (173/345) 2004/01/09 16:02 回答No.2 #1の者です。 先ほどの投稿、以下2点修正します。 >「INNER JOIN」は結合する両方のテーブルにデータがある場合にのみ毛と号の結果データが取得できる、という意味。 →「INNER JOIN」は結合する両方のテーブルにデータがある場合にのみ結合結果データが取得できる、という意味。 >売上伝票番号:00000000001が取得できないのは商品コード:000000003が商品マスタにないからです。 →売上伝票番号:00000000002が取得できないのは商品コード:000000003が商品マスタにないからです。 質問者 お礼 2004/01/09 16:24 ありがとうございました!! スッキリ納得できました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 mfuku ベストアンサー率50% (173/345) 2004/01/09 15:58 回答No.1 簡単に言いますと、 「INNER JOIN」は結合する両方のテーブルにデータがある場合にのみ毛と号の結果データが取得できる、という意味。 一方、「LEFT JOIN」は片方にデータがなくても結合結果データが取得できる、という意味です。 例えば、 売上テーブルと商品マスタがあったとします。 データは以下のように入ってます。 売上テーブル 売上伝票番号 商品コード 00000000001 000000001 00000000002 000000003 商品マスタ 商品コード 商品名 000000001 テレビ 000000002 パソコン このとき、 SELECT 売上伝票番号, 商品名 FROM 売上テーブル INNER JOIN 商品マスタ ON 売上テーブル.商品コード = 商品マスタ.商品コード のSQLでは 売上伝票番号 商品名 00000000001 テレビ が返ってきます。 売上伝票番号:00000000001が取得できないのは商品コード:000000003が商品マスタにないからです。 次に、 SELECT 売上伝票番号, 商品名 FROM 売上テーブル LEFT JOIN 商品マスタ ON 売上テーブル.商品コード = 商品マスタ.商品コード のSQLでは 売上伝票番号 商品名 00000000001 テレビ 00000000002 [NULL] が返ってきます。 商品コード:000000003は商品マスタにありませんが、商品名はNULLで売上テーブルのデータは取得されます。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターデータベースその他(データベース) 関連するQ&A inner join left joinについて inner join left joinの動きについては 理解しているつもりなのですが どういったテーブルの時innerにして どんなテーブルの時left joinにするかが わかりません inner join left join の選択方法 ※どっちを使えばよいかの見極め方について 教えて下さい INNER JOINの有用性 INNER JOINの有用性 内部結合時に「INNER JOIN」と記述する有用性を教えてください。 内部結合を行なう際は、一般的には FROM句にテーブル名を列挙し WHERE句にテーブル間結合条件を列挙する という形式をとります。少なくとも私は。 これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。 私がぱっと思いつくレベルであれば、 「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の 2種類の条件が混在している。混乱を避ける為これを分離する」 と、屁理屈をこねることも可能ですが、 FROM句にテーブルと「INNER JOIN」記述を混在させるほうが よっぽど分かりにくいように感じます。 あとさらに強いて言えば、「LEFT JOIN」にしたり「INNER JOIN」にしたりを 頻繁に切り替える場合とか。そんなこともまずないと思いますが…。 なので、「INNER JOIN」を使用する有用性をまったく感じません。 あえて使用する意味はあるのでしょうか? 質問は ・内部結合時に「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になります。よろしくお願いいたします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム ちょっと見かけない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とは違うもので。 WHERE句で結合。INNER JOINとの違い MySQLで複数テーブルからデータ取得する際、 FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、 「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか? ・「INNER JOIN」と同じ意味でしょうか? ・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか? ・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか? ・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか… 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について こんにちは、現在下の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を使わなくても大丈夫でしょうか? 異なるデータベース間でinner joinしたい 現在VB.NET 2008を用いて、システムを作成しています。 Access2008の.accdb内のデータと、MySQL内のデータをinner joinして取得したいと考えていますが、 可能でしょうか? 可能であればどのようにすればよいでしょうか? どちらの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句で条件を絞るのではどちらが好ましいでしょうか? left outer joinで抽出したい SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。 Left outer join とかのLeft Left outer join とright outer join ですが、解説などをみると、左右に表が描かれてあって、線を引いたりして結合していくのですが、 何をもって左とか右とかいうのでしょうか? テーブル1が左で、テーブル2が右みたいな感じで解説されるのですが、先に出てきた1も、あとに出てきた2も、単に出てきた順番であり、記号と思われます。1と2を入れ替えたら同じことです。Left outer join Table1 もRight outer join Table2 も同じことのように思われます。私はなにか勘違いしているのでしょうか? Left Join/Right Join の意味 Left Join/Right Join を、accessクエリのデザイン画面では使っています。 SQLではLeft Join/Right Join となりますが、この「右」「左」という言葉を使う意味を教えていただけないでしょうか。 #なぜ「右」「左」というのかよくわからないため。 #まことに初歩的な質問だと思いますが。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム LEFT JOINとRIGHT JOINについて SQL初心者です。 基本的な質問ですみません、教えてください。 LEFT JOINとRIGHT JOINについて、どちらのテーブルを左側、どちらのテーブルを右側にするのかが分かっていません。どういう基準で左側、どういう基準で右側と考えれてばいいのでしょうか? 宜しくお願いします。 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をすると数がおかしくなります 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と表示するようにしたいです。 よろしくお願いいたします。 left join が3つ以上のとき 例えば select * from ((t1 left join t2 on t1.a=t2.a)left join t3 on t1.a=t3.a) where b.t1='y'; という風にカッコがついて記入しにくくなります。 4つの場合はさらに深刻です。 簡単な記法はないのでしょうか? 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を教えてもらったので実行したら問題なくできました。 ただし、どのようなプロセスで結果が得られたのかわかりません。 どうぞ、ご教授お願いいたします。 少し複雑な 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とwhere句 等結合のSQLを書く必要が出てきた場合、 INNER JOINとwhere句 どちらを使用されてるか教えて頂けないでしょうか? 私は、結合表の数が多くなってくると INNNERのSQLはぱっと見て見にくいと想いWHEREを使っているのですが。 (何より、WHEREのほうが構文が簡単で・・・。) よろしくお願いします。 サブクエリ内で 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 の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター データベース SQL ServerOraclePostgreSQLMySQLNoSQLその他(データベース) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ありがとうございます。 説明、シンプルでとてもわかりやすかったです。 使わせてくださいね☆