2010-12-14 17 views
5

可能性の重複:
(self,left outer,right outer,full outer) join - real world examplesLEFT、RIGHT、INNER、OUTER JOINの違いは何ですか?

こんにちは、親愛なるSOコミュニティ!

私はしばらくの間、SQLデータベースを使用してきましたが、1つの側面はまだ私にとって非常に混乱しています - テーブルの結合。私はマルチテーブルクエリを書くときに何が起こるのかをはっきりと理解していますが、JOINが起きたときには何も分かりません。

テーブル結合とは何ですか?また、LEFT、RIGHT、INNER、OUTER JOINの違いは何ですか?自己結合とは何ですか?

あなたはこの単純なテーブル構造にそれらの使用法の例を提供することができれば、私は感謝される:

著者

id |name 
--------------- 
1 |John 
2 |Bob 
3 |Richard 

ブック

id |author_id |title  |rating 
----------------------------------------- 
1 |1   |book A  |5 
2 |1   |book B  |4.8 
3 |3   |book C  |3 

感謝君は!

+0

私はその正確な質問をして、最初のページにいくつかのヒットが出てくる。ここで尋ねるよりも速いかもしれない。正直言って、私は自分でジョインするために行くときに、いつも私の記憶をリフレッシュする必要があります! – DarinH

+1

"私は非常にはっきりと理解していますが、マルチテーブルクエリを書くと何が起こるのですが、JOINが出現すると何かを理解できないように感じます。ありがとう?マルチテーブルクエリを記述するときに結合が実行中であり、暗黙の結合構文を使用していない(テーブル間にカンマを持つ)のはどうですか?もしそうなら、そのourtdatedと非常に貧弱な構文を使用してコードの別の部分を書くことはありません。その貧弱な構文を使用すると、あなたが結合を理解していないのも不思議ではありません。 – HLGEM

+0

HLGEM、なぜ古くて貧しいのですか? –

答えて

3

を参照してください。唯一の条件が真の参加結果が表示されます。 Aの行に対して真の条件がない場合は、結果から削除されます。

左:マッチングを持たない

外Bに参加するから行を除外します:マッチングを持たないB

右に参加するから行を除外しないだろう、左を右の結合は、内部結合である外部結合と見なされます。

3

インナー参加:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    INNER JOIN books b ON 
     a.id = b.author_id 

は、このになります:Bobが示されなかったこと

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
3 |Richard |3 |3   |book C  |3 

お知らせ - inner joinは常に(結合条件を考慮し、両方のソースには存在しない項目を削除します;我々の場合、a.id = b.author_id

左が参加:

SELECT 
    a.*, 
    b.* 
FROM 
    authors a 
    LEFT JOIN books b ON 
     a.id = b.author_id 

は、このになります:

id |name  |id |author_id |title  |rating 
--------------------------------------------------------- 
1 |John  |1 |1   |book A  |5 
1 |John  |1 |1   |book B  |4.8 
2 |Bob  |null |null  |null  |null 
3 |Richard |3 |3   |book C  |3 

今、すべての著者が表示されている - LEFT JOIN(またはLEFT OUTER JOIN、それは同じです)すべてを保持します(レコードを "左"著者)、nullで見つからない「正しい」レコードを置き換えます。

「右結合」については、「左結合」と同じですが、逆の関係になります。次のクエリは、(加入権の使用を補償するために、テーブルは逆の順序であることに注意してください)前回と同じレコードを発生します:

SELECT 
    a.*, 
    b.* 
FROM 
    books b 
    RIGHT JOIN authors a ON 
     a.id = b.author_id 

は今明確であると思います。

PS:FULL OUTER JOINもあります。結合された左右の結合を考えてください。作成者のない本がある場合は、完全外部結合を使用するときにも表示されます。

+0

それを愛する。それは絵をとても鮮明に描くだけです。 –

関連する問題