公開日:2019/10/4
更新日:2019/10/4
キーワード:SQL JOIN句
文字数:2200(読み終わるまでおよそ4分)
この記事でわかること
- JOIN句の結合の種類
はじめに
SQLはOracleやMySQLのようなリレーショナルデータベースに蓄積したデータを操作したり、定義するためのプログラム言語です。
SQLを駆使することで必要なレコードを検索したり抽出する処理をプログラム文で定義し実行できます。
リレーショナルデータベースは多数のテーブルから構成されます。2つ以上のテーブルで共通する値を取る列がある場合、それをキーとして「結合」の処理を行うことができます。
結合を行うためには「JOIN句」を使用します。
例えば売上伝票のテーブルと商品マスターのテーブルがあったとします。その2つのテーブルには「商品コード」という共通の値を持っている場合、商品コードをキーとして、2つのテーブルの情報を1つの表で表すことができます。
このように1つのテーブルとして定義することにより、用途に応じた独自のテーブルを作成することができます。
もちろん、結合の結果から特定の条件を満たすレコードを抽出することも可能です。
その結合の処理には実は複数の種類があり、その種類によって、返ってくる結果が異なります。
ここでは例を交えながら、結合の種類についてわかりやすくご紹介いたします。
1. 内部結合(INNER JOIN)
内部結合は、結合するキーとなる列名を指定することで、共通の値をもつ行同士を連結する方法です。
以下の2つのテーブルでは、赤枠で示した3つのレコードでキーの値が一致しています。内部結合で結合すると、その3つのレコードのみが表示されます。
すなわち、一方のテーブルにしか存在しないキー値を持つレコードは、結果に反映されないことになります。
その際に実行するSQL文は以下のものです。
SELECT * FROM 売上明細 INNER JOIN 商品マスター ON 売上明細.商品コード = 商品マスター.商品コード
2. 外部結合(OUTER JOIN)
外部結合は、結合対象のテーブルのレコードを基準にして結合する方法です。さらに複数の種類に分けられます。
1)LEFT OUTER JOIN
LEFTとは左側、つまりFROMで指定した側のテーブルを指します。つまりLEFT OUTER JOINとは、FROMで指定したテーブルのレコードはすべて残した結合結果を得るために使用します。
その際に実行するSQL文は以下のものです。
SELECT * FROM 売上明細 LEFT OUTER JOIN 商品マスター ON 売上明細.商品コード = 商品マスター.商品コード
2)RIGHT OUTER JOIN
「RIGHT OUTER JOIN」はLEFTの逆、つまりJOINしている側のテーブルを基準とし、結合処理を行います。
前述のLEFT OUTER JOINの例で使用した2つのテーブルを使用して、SQL文で同様の結果を得たい場合は、以下のようにRIGHT OUTER JOINを使用します。
SELECT * FROM 商品マスター RIGHT OUTER JOIN 売上明細 ON 商品マスター.商品コード = 売上明細.商品コード
3. クロス結合(CROSS JOIN)
クロス結合は、各テーブルに存在する行同士のすべての組み合わせを得ることができる結合です。これまでご紹介した内部結合や外部結合ほど使用頻度はないかもしれませんが、目的によっては活用画面がありそうです。
例えば商品マスターと配達時間帯の2つのテーブルがあり、それぞれ2つのレコードを保持しています。その場合、すべての行を組み合わせたテーブルを作成することができます。
その際に実行するSQL文は以下のものです。
SELECT * FROM 商品マスター CROSS JOIN 配達時間帯
ただ、実際扱うテーブルのレコードは多数あり、そのようなテーブルを使用してクロス結合を行うと膨大なレコード数が得られます。
その際は WHERE 句を使用して、抽出するレコードを限定しましょう。
WHERE句はクロス結合に限らず、抽出条件を絞り込むために使用します。例えば上記のSQL文末に「WHERE 商品マスター.商品コード=’A001’と指定すると、下図のような結果になります。
4. 注意事項ーJOINとGROUP BYの組み合わせ処理について
GROUP BYはグループ化を行うために使用される命令で、「種類ごとに集計する」際に利用されます。GROUP BYのあとに、グルーピングに使用するカラム名を指定すると、グループごとに合計や最小、最大を計算することが可能です。
以下の例のように、JOINとGROUP BYは併用することが可能です。
SELECT TABLE_A.KEYCODE, SUM(TABLE_B.ITEMNUM) FROM TABLE_A INNER JOIN TABLE_B ON TABLE_A.KEYCODE = TABLE_B.KEYCODE GROUP BY TABLE_A.KEYCODE,TABLE_B.ITEMNUM
JOIN後のテーブルにGROUP BYを使用して起こるミスがよくあります。それは、JOIN後のテーブルの形を完璧に想像できていない場合に起こります。
結果間違った集計結果を導いてしまうことがありますので、要注意しましょう。
しっかりとJOINした後の形を確認してからGROUP BYを使いましょう。また、可能であればJOINの前に必要なGROUP BYの処理はしてしまう方が良いです。