SQLのJOINを実例で解説

SQLのJOIN解説

SQLのJOIN解説:内部・左・右・完全・クロス・自己結合 | We.Inc

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の違いは何ですか?

INNER JOINは一致しない行を落とします。LEFT JOINは1つ目のテーブルの全行を残し、何も一致しない場合は2つ目のテーブルの列にNULLを入れます。デモでは、CleoはLEFT JOINで空の注文とともに表示され、INNER JOINには表示されません。

JOINとINNER JOINは同じですか?

はい。PostgreSQLではINNERという語は省略でき、単にJOINと書くと内部結合になります。OUTERという語も省略できるので、LEFT JOINとLEFT OUTER JOINは同じ意味です。

JOINの結果がテーブルの行数より多くなったのはなぜですか?

左の各行は、一致する右の行の数だけ表示されます。注文が3件ある顧客は3回表示されます。これは正しい動作です。顧客ごとに1行が必要なら、GROUP BYで集約するか、事前に集約したサブクエリとJOINしてください。

自己結合とは何ですか?

1つのテーブルを2つの別名で自分自身と結合するものです。従業員とその上司、顧客とその紹介者のように、同じテーブル内の行が別の行を指している場合に使います。

MySQLはFULL OUTER JOINに対応していますか?

PostgreSQLは対応しており、ここで示しているのはその構文です。MySQLにはFULL JOINキーワードがありません。一般的な回避策は、LEFT JOINとRIGHT JOINをUNIONで組み合わせる方法です。

ON、USING、NATURAL

外部結合の絞り込みは実行順序が異なる

PostgreSQLで試す

これをpsqlや任意のPostgres SQLエディターに貼り付けてサンプルテーブルを再現し、デモのクエリを実行してください。

サンプルテーブル

注文104は、外部結合で見せるものがあるよう、あえて存在しない顧客9を指しています。

一度も注文していない顧客

LEFT JOINはCleoを注文列がNULLの状態で残し、IS NULLの絞り込みでその行だけを残します。

JOINプレイグラウンド

デモで使用するサンプルテーブル

JOINの種類

結果:{n}行

ハイライトされたセルは、外部結合によってNULLで埋められています。

SELF

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る