2つの小さなサンプルテーブルでSQLのあらゆるJOINをブラウザー上で実行し、どの行が残るかを確認できます。INNER、LEFT、RIGHT、FULL、CROSS、自己結合のPostgreSQL構文付きです。
JOINは、条件(通常はキーの一致)を使って2つのテーブルの行を組み合わせます。INNER JOINは両側で一致した行だけを残します。LEFT JOINは左テーブルの全行を残し、対応のない右側の列をNULLで埋めます。RIGHT JOINはその逆、FULL JOINは両方を残し、CROSS JOINはすべての行をすべての行と組み合わせます。
各JOINで残る行
JOINの説明にはベン図がよく使われますが、実際に問題になる部分、つまり行の重複とNULLが見えなくなります。下にあるのは、customersとordersという2つの小さなテーブルです。一度も注文していない顧客と、顧客が削除された注文が含まれています。JOINを選ぶとブラウザー内で結果が計算されるので、どの行がなぜ表示されるのかを正確に確認できます。
INNER JOINは一致しない行を落とします。LEFT JOINは1つ目のテーブルの全行を残し、何も一致しない場合は2つ目のテーブルの列にNULLを入れます。デモでは、CleoはLEFT JOINで空の注文とともに表示され、INNER JOINには表示されません。
はい。PostgreSQLではINNERという語は省略でき、単にJOINと書くと内部結合になります。OUTERという語も省略できるので、LEFT JOINとLEFT OUTER JOINは同じ意味です。
左の各行は、一致する右の行の数だけ表示されます。注文が3件ある顧客は3回表示されます。これは正しい動作です。顧客ごとに1行が必要なら、GROUP BYで集約するか、事前に集約したサブクエリとJOINしてください。
1つのテーブルを2つの別名で自分自身と結合するものです。従業員とその上司、顧客とその紹介者のように、同じテーブル内の行が別の行を指している場合に使います。
PostgreSQLは対応しており、ここで示しているのはその構文です。MySQLにはFULL JOINキーワードがありません。一般的な回避策は、LEFT JOINとRIGHT JOINをUNIONで組み合わせる方法です。
これをpsqlや任意のPostgres SQLエディターに貼り付けてサンプルテーブルを再現し、デモのクエリを実行してください。
注文104は、外部結合で見せるものがあるよう、あえて存在しない顧客9を指しています。
LEFT JOINはCleoを注文列がNULLの状態で残し、IS NULLの絞り込みでその行だけを残します。
デモで使用するサンプルテーブル
JOINの種類
結果:{n}行
ハイライトされたセルは、外部結合によってNULLで埋められています。
SELF
無料で始める · クレジットカード不要