SQLにおいて、リレーショナルに基づいてリストを作る機能と言えばJOINですが、中でも頻度の高いコマンドがLEFT OUTER JOINです。今回は、このLEFT OUTER JOINの基本と応用例をご紹介します。
目次
最もリレーショナルデータベースらしいSQLのコマンド
今使われている多くの情報システムでデータベースが使われています。そして、それらの多くがリレーショナルデータベースに分類される管理ソフトであり、その操作にはSQLが使われます。そして、今回解説するLEFT OUTER JOINは、SQLの機能の中でも、データ間のリレーショナルを活用するコマンドの一つです。そこでコマンドの解説の前に、リレーショナルデータベースのリレーショナルとは何かについて解説します。
そもそもリレーショナルデータベースとは
SQLを習ったことのある方なら習ったことがあると思いますが、リレーショナルデータベースとは、表形式のテーブルに情報を格納し、情報の関係(リレーショナル)を使って情報を管理するデータベースです。
そのため、どのような情報を格納するか、また、どういった形式で情報を取り出すかを考える際、Excelなどの表計算ソフトで扱う表をイメージすると解りやすいでしょう。
また、情報の関係は、複数のテーブルに同じ情報を格納しておくと、その情報を使って複数のテーブルに分散して格納された情報を結合して取り出すの際に利用できます。そして、その機能を使ったデータベースが今使われているリレーショナルデータベースという訳です。
関係性を使って結合するということ
リレーショナルデータベースの関係性をもう少し具体的に説明してみましょう。
リレーショナルデータベースでは、データは表形式で格納されていますが、下記のような2つの表があったとします。そして、table1のsec_id列に格納される数字は、table2のsec_idの列に格納される数字に対応しているとします。
table1の要素
id name sec_id
1 鈴木 3
2 佐藤 3
3 田中 1
table2の要素
sec_id section
1 総務
2 経理
3 営業
この場合、table1とtable2の2つの表のsec_idが同じ数字のデータを関連付けすれば、下記のような表が作れます。これが、関係性を使って表を結合するということです。
sec_idの関係を使ってtable1とtable2結合した表
id name sec_id section
1 鈴木 3 営業
2 佐藤 3 営業
3 田中 1 総務
今回紹介するLEFT OUTER JOIN は、上記のような2つの表を結合するSQLのコマンドの一つです。
ベースとなる左側に接続するのがLEFT OUTER JOIN
今回解説するLEFT OUTER JOINは、OUTER JOIN、つまり外部結合の一種で、左側のテーブルのデータを使うという機能です。基本的な使い方を次に紹介します。
SELECT * FROM 表1 LEFT OUTER JOIN 表2 ON 表1.要素名 = 表2.要素名;
SQLのSELECT文のFROM句の中で使用し、LEFT OUTER JOINの左側のテーブル(上のSQLでは表1)のデータを全て使う。そして、LEFT OUTER JOINの右側のテーブル(上の例では表2)のデータのうち、ON以降に記載された条件(上の例では表1.要素名 = 表2.要素名)に一致するデータのみ取ってくる。
そして、LEFT OUTER JOINで作成されるリストは、左側の列に必ずデータが入るので、ファイルに出力してExcelなどの表計算で加工したり、プログラムに取り込まれて処理される際に都合が良いことから、SQLでよく使われるコマンドです。
LEFT OUTER JOINの基本的な使い方
先ほど、LEFT OUTER JOINの基本的な使い方をご紹介しましたが、SELECT文で作られるリストは、2つのテーブルを結合した単純なものばかりではありません。次に、実際のSQLでもよく見かけるLEFT OUTER JOINの使い方をご紹介します。
複数のテーブルを結合する場合
実際のシステムでは、データベースを構成するテーブルが数十ある、というケースも珍しくありません。そのため、データベースから出力されるリストは、幾つものテーブルからリレーショナルを活用して必要なデータを結合して作られるのが普通です。
LEFT OUTER JOINで接続できるテーブルは2つだけですが、扱えるのは既存のテーブルだけではありません。SQLでは、SELECT文のFROM句に入れ子でなら複数のLEFT OUTER JOINを記述できます。
次の例は、3つの表を結合する例です。
SELECT T1.要素1, T1.要素2, T1.要素3, T2.要素A, T2.要素B, T3.要素a, T3.要素b FROM (( T1 LEFT OUTER JOIN T2 ON T1.id = T2.id ) LEFT OUTER JOIN T3 ON T1.id = T3.id );
この例では、まず、T1とT2の2つのテーブルを結合して新しいテーブルを作り、さらにT3を結合しています。なお、括弧は省略しても良いので、次のようにも書けます。
SELECT T1.要素1, T1.要素2, T1.要素3, T2.要素A, T2.要素B, T3.要素a, T3.要素b FROM T1 LEFT OUTER JOIN T2 ON T1.id = T2.id LEFT OUTER JOIN T3 ON T1.id = T3.id;
複数の結合条件を使用する場合
LEFT OUTER JOINで結合する際、続くON句に複数の条件を記述することも可能です。そして、複数の条件を設定する場合は、ANDやORを利用します。
SELECT T1.要素1, T1.要素2, T1.要素3, T2.要素A, T2.要素B FROM T1 LEFT OUTER JOIN T2 ON ( T1.id = T2.id AND T1.flg = T2.flg );
この例では、T1テーブルのT2テーブルのidとflgの両方が一致している場合のみ、T2のデータをT1に接続します。
新たに作ったテーブルをwhere句で絞り込む
単独のテーブルから条件で絞ってリストを作る場合、SQLではwhere句が使われますますが、LEFT OUTER JOINで作ったリストに対してwhere句を適用し、条件で絞ったリストを作ることも可能です。
SELECT T1.要素1, T1.要素2, T1.要素3, T2.要素A, T2.要素B FROM T1 LEFT OUTER JOIN T2 ON T1.id = T2.id WHERE T1.flg = 1;
この例では、LEFT OUTER JOINでT1とT2を結合した新しいテーブルに対して、where T1.flg = 1を適用し、条件で絞ったリストを出力します。なお、処理の順番は、まず、FROM句で新しいテーブルを作り、次にWHERE句で条件で絞る処理となります。データの数が多い場合は、処理に時間がかかる原因にもなるので使う場合は注意が必要です。
リスト作成の高速化のポイント
SQLのJOINで2つのテーブルを結合する際、そのテーブルが大きい場合は特に処理に時間がかかります。しかし、JOINで結合するテーブルが、予め必要なデータだけ抽出しておけば、処理時間を短縮できます。次に、そのようなJOINによるリスト作成の高速化について解説します。
副次問い合わせを活用する
データ量の多いテーブルに、同じくテータ量の多いテーブルを結合すると、それだけで処理に時間がかかります。そのため、予め副次問い合わせで必要なデータだけを抽出し、それを結合すれば処理時間の短縮が可能です。
なお、副次問い合わせとは、SELECTを使ったSQL文の中、入れ子でSELECTを使ったSQL文を入れる使い方で、SQLではよく使われる機能です。例えばSQLは、プログラムのように、リストに対して前処理を適用し、その後にそのリストを加工する、といったことはできません。しかし、副次問い合わせを使えば、そういったプログラムのような処理が可能です。
今回紹介しているLEFT OUTER JOINでも、副次問い合わせの結果作られたリストを結合できるので、ぜひ、利用してください。
SELECT T1.要素1, T1.要素2, T1.要素3, T2.要素A, T2.要素B FROM ( T1 LEFT OUTER JOIN ( SELECT id 要素A, 要素B FROM table2 AS T2 WHERE 条件 ) ON T1.id = T2.id;
INNER JOINを組み合わせる
LEFT OUTER JOINで結合できるリストは、副次問い合わせで作成したリストだけではありません。他のJOIN句で結合したリストも対象にできます。そして、ぜひ、使ってほしいのが、INNER JOINで結合したリストです。
INNER JOINは、OUTER JOINと同じように、2つのテーブルを結合する機能ですが、リストに加えるのは条件に一致したデータのみです。そのため、結合と抽出を同時に実現できます。ぜひ、今回紹介するLEFT OUTER JOINとINNER JOINを組み合わせた使い方もマスターしましょう。
SELECT T1.要素1, T1.要素2, T1.要素3, T2.要素A, T2.要素B, T3.要素a, T3.要素b FROM ( T1 LEFT OUTER JOIN ( T2 LEFT OUTER JOIN T3 ( T4 LEFT OUTER JOIN T5 ON ( T4.id = T4.id ) and (T1.id = T4.id ) ) ON ( T2.id = T3.id ) and ( T1.id = T2.id );
複雑なリストを作るならLEFT OUTER JOINをマスターしよう
Webシステムのプログラムからデータベースを利用するにしても、SQLでプログラムで処理しやすいリストを作れれば、処理を簡略化できます。そして、SQLでリストを作る機能がJOIN句であり、よく使われるのがLEFT OUTER JOINです。
さらにLEFT OUTER JOINでリストを作成する際、副次組み合わせや他のJOIN句を組み合わせることで、かなり複雑なリストの作成も可能です。ぜひ、これまで解説した記事を参考に、データベースの基本であるデータのリレーショナルを使って複雑なリストを作成できるLEFT OUTER JOINの使い方をマスターしましょう。