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

このQ&Aに関連する最新のQ&A

アンサープラス

SQL文で結合をする場合に「JOIN」を使用すると、違うデータを複数のテーブルから取り出すことができますね。



・SQL実践講座(4):異なるテーブル同士を結合する「JOIN」句 - @IT
http://www.atmarkit.co.jp/ait/articles/0101/27/n …

A 回答 (4件)

出てくる結果が違います。



テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

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レコードしか出力されません。
    • good
    • 19
この回答へのお礼

ありがとうございます。
説明、シンプルでとてもわかりやすかったです。
使わせてくださいね☆

お礼日時:2004/01/09 16:24

対応させるべきは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があります。
    • good
    • 3
この回答へのお礼

outer join・・・?
ちょっと調べてみます。ありがとうございました。

お礼日時:2004/01/09 16:26

#1の者です。


先ほどの投稿、以下2点修正します。

>「INNER JOIN」は結合する両方のテーブルにデータがある場合にのみ毛と号の結果データが取得できる、という意味。

→「INNER JOIN」は結合する両方のテーブルにデータがある場合にのみ結合結果データが取得できる、という意味。

>売上伝票番号:00000000001が取得できないのは商品コード:000000003が商品マスタにないからです。

→売上伝票番号:00000000002が取得できないのは商品コード:000000003が商品マスタにないからです。
    • good
    • 0
この回答へのお礼

ありがとうございました!!
スッキリ納得できました。

お礼日時:2004/01/09 16:24

簡単に言いますと、


「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で売上テーブルのデータは取得されます。
    • good
    • 3

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLeft Join/Right Join の意味

Left Join/Right Join を、accessクエリのデザイン画面では使っています。

SQLではLeft Join/Right Join となりますが、この「右」「左」という言葉を使う意味を教えていただけないでしょうか。

#なぜ「右」「左」というのかよくわからないため。
#まことに初歩的な質問だと思いますが。

Aベストアンサー

本来この構文を考え出した人の意図と合っているのかは知りませんが、私なりの解釈は、どちらのテーブルを元にして結合しているかだと思っています。
すなわち、A Join BのA(左)を元にするかB(右)を元にするかです。

例えば、

テーブル1 Left Join テーブル2 On 結合条件
なら、テーブル1(左)を元にしてテーブル2を結合条件に従って結合

テーブル1 Right Join テーブル2 On 結合条件
なら、テーブル2(右)を元にしてテーブル1を結合条件に従って結合

だから、

テーブル1 Left Join テーブル2 On 結合条件
テーブル2 Right Join テーブル1 On 結合条件
は、結合条件が同じなら元にしているテーブルは同じなので同じ結果を返す。

s-holmesさんがこの考え方で納得していただけるかは分かりませんが、以前私も悩んだことがあったので参考意見ぐらいにしていただけるとうれしいです。

QINNER JOINとwhere句

等結合のSQLを書く必要が出てきた場合、

INNER JOINとwhere句 どちらを使用されてるか教えて頂けないでしょうか?

私は、結合表の数が多くなってくると
INNNERのSQLはぱっと見て見にくいと想いWHEREを使っているのですが。
(何より、WHEREのほうが構文が簡単で・・・。)

よろしくお願いします。

Aベストアンサー

「Inner Join」と「Where」で、得られる結果が同じ場合であれば、
私は「Inner Join」を選択します。

Accessに触れ始めた頃から長らく、SQL文には触れずにデザイン
ビューのみで対応してきたという経緯もありますが
(→デザインビューなら結合線を追加するだけなので簡便)、
現在での最大の理由は、結果表示に要する時間が、Inner Join
の方が圧倒的に早かったため、です。
(レコードの多寡、インデックスの有無など、すべてのパターンを
 検証したわけではありませんが(汗))

QINNER JOINの有用性

INNER JOINの有用性

内部結合時に「INNER JOIN」と記述する有用性を教えてください。

内部結合を行なう際は、一般的には
FROM句にテーブル名を列挙し
WHERE句にテーブル間結合条件を列挙する
という形式をとります。少なくとも私は。

これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。

私がぱっと思いつくレベルであれば、
「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の
2種類の条件が混在している。混乱を避ける為これを分離する」
と、屁理屈をこねることも可能ですが、
FROM句にテーブルと「INNER JOIN」記述を混在させるほうが
よっぽど分かりにくいように感じます。

あとさらに強いて言えば、「LEFT JOIN」にしたり「INNER JOIN」にしたりを
頻繁に切り替える場合とか。そんなこともまずないと思いますが…。


なので、「INNER JOIN」を使用する有用性をまったく感じません。
あえて使用する意味はあるのでしょうか?

質問は
・内部結合時に「INNER JOIN」を使用する有用性があるのか?
・有用性があるのであればどのような場合か?
です。よろしくお願いします。

INNER JOINの有用性

内部結合時に「INNER JOIN」と記述する有用性を教えてください。

内部結合を行なう際は、一般的には
FROM句にテーブル名を列挙し
WHERE句にテーブル間結合条件を列挙する
という形式をとります。少なくとも私は。

これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。

私がぱっと思いつくレベルであれば、
「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の
2種類の条件が混在している。混乱を避ける為これを分離する」
と、屁理屈をこ...続きを読む

Aベストアンサー

本質的な差異はありません。

パフォーマンスに差が出るという事も
常識的にはありえないと思います。
今のオプティマイザはそんなに質は悪くありません。

20年以上前のDBもしくは無名で信用性の無いDBをあえて
使うという状況でもない限り気にしなくていいと思います。

Qinner 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件でした・・・

Aベストアンサー

 質問の例題が、あまりにも省略されている為に、正確な要件が解らなくなってしまっています。
 おそらく、商品テーブルにも在庫テーブルにも、そのほかのフィールドがあるはずですよね。そうで無いと、在庫テーブルはレコードの特定が出来ませんし、商品テーブルに至っては存在価値を疑ってしまいますので・・・

 で、質問の結合方法も、そのほかのフィールドがらみで方法が変わってきそうです。
 本当に、質問内容だけでしたら、一番単純な解は、
select distinct ID from 在庫テーブル
 です。結合の必要なんてありません。

 こんなのも、いちおうあり・・・ですが・・・
 select distinct z.ID from 商品テーブル s join 在庫テーブル z on s.ID=z.ID
 これで、少なくとも、商品テーブルに存在する商品IDのうち、在庫テーブルに存在する商品の重複の無いIDが取得できます。が・・・普通、商品テーブルに存在しない商品IDてのが想像しがたいので、意味があるかどうか・・・

 普通は、この類のテーマだと、
select s.ID, sum(z.数量) from 商品テーブル s join 在庫テーブル z on s.ID=z.ID
group by s.ID
 等とやって、「商品の在庫量が知りたいです」となるんですけど・・・

 さて、いったい何がやりたいのでしょうか?
 「いろいろとやりたいこと」の内容を書かれた方が、的確な答えが返ってくると思います。

 質問の例題が、あまりにも省略されている為に、正確な要件が解らなくなってしまっています。
 おそらく、商品テーブルにも在庫テーブルにも、そのほかのフィールドがあるはずですよね。そうで無いと、在庫テーブルはレコードの特定が出来ませんし、商品テーブルに至っては存在価値を疑ってしまいますので・・・

 で、質問の結合方法も、そのほかのフィールドがらみで方法が変わってきそうです。
 本当に、質問内容だけでしたら、一番単純な解は、
select distinct ID from 在庫テーブル
 です。結合の必要...続きを読む

QLEFT JOIN あいまいな外部結合

Access2000でクエリを作成します。
SQLで
SELECT お支払.ID_支払, お支払.N_伝票No, お支払.N_支払金額, お支払.N_支払区分コード
FROM 伝票 LEFT JOIN (支払区分マスター INNER JOIN お支払 ON 支払区分マスター.N_支払区分コード = お支払.N_支払区分コード) ON 伝票.N_伝票No = お支払.N_伝票No;

とすると あいまいな外部結合が含まれている・・というエラーがでてしまいます。どうしたらいいでしょうか。

伝票は全て表示して、その中のお支払には、区分コードを割り当てたいだけなのですが。
宜しくお願い致します。

Aベストアンサー

LeftJoinの結合先にInnerJoinがあると、そのエラーが生じますので、
そのInnerJoinをLeftJoinに変えます。
(クエリをデザインビューで表示させた場合でいうと、「○→□-△」でエラー。
 「○-□→△」や「○→□→△」(=下の修正版)なら、エラーになりません)

SELECT お支払.ID, お支払.N_伝票No, お支払.N_支払金額, お支払.N_支払区分コード
FROM 伝票 LEFT JOIN (お支払 LEFT JOIN 支払区分マスター ON お支払.N_支払区分コード = 支払区分マスター.N_支払区分コード) ON 伝票.N_伝票No = お支払.N_伝票No;


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報