はじめに
今回はSQLiteのテーブルの結合について基本から解説します。テーブルの結合は左結合・右結合・内部結合・外部結合がありますが、SQLiteでサポートされているのは左結合と内部結合のみです。今回はこれらの使い方をみていきましょう。
今回もPythonを離れてSQLite3での操作となります。
結合の種類
結合は特定のKeyを参照してつなげる操作のことです。結合には大きくわけて以下の2つの種類があります。
- 内部結合:Key列に共通の値がないレコードは破棄する
- 外部結合:Key列に共通の値がないレコードも残す
さらに外部結合にはさらに3つに分けることができます。
- 左外部結合:左側のデータのキーをすべて残す
- 右外部結合:右側のデータのキーをすべて残す
- 完全外部結合:すべてのキーを残す
このうち、SQLiteでサポートしているのは、内部結合と左外部結合のみとなります。順にみていくことにしましょう。
事前準備
前回作成した「chinook.db」を使うことにしましょう。
▶ データベース・テーブルを作成するには以下の記事をご覧ください。
このデータベースでは以下のような構成になっています。
tracksとalbumsを結合してみることにしましょう。keyとなるのは、AlbumIdですね。
それぞれのテーブルのレコード数を確認しておきましょう。
tracksテーブルは3503レコード、albumsは347レコードあるようです。
内部結合(INNER JOIN)
書式
まずは内部結合(INNER JOIN)からです。書式は次のようになります。
これが基本となりますが、いくつか注意事項があります。SELECTのあとのカラム名はテーブルA,Bに共通のカラム名でなければ、カラム名を指定するだけOKです。一方、同じカラム名がある場合はテーブル名のあとに「.(ドット)」を続けて、そのあとにカラム名を書いて「テーブル名A.カラム名」「テーブル名B.カラム名」のようにします。
FROMのあとにくるテーブル名は左側のテーブル、INNER JOINのあとにくるテーブルが右側のテーブルとなります。(INNER JOINの場合は共通のkeyがあるレコードのみ抽出するのでどちらでも一緒です)
ONのあとにkeyとするカラム名を書きます。早速やってみましょう。
内部結合
SELECTのあとで抽出するカラムを指定します。ここでは「albums」テーブルのTitleカラムと「tracks」テーブルのNameカラムとします。カラム名が重複していないので「テーブル名.カラム名」ではなく、カラム名だけの指定ができます。
FROMのあとに左側に配置するテーブル名、INNER JOINのあとに右側に配置するテーブル名を書きます。
ONの後にkeyとなるカラム名を「=」でつなげます。ここでは、左のテーブルと右のテーブルでカラム名が同じなので、「テーブル名.カラム名」の形式で書きます。
うまくデータが抽出できていますね。SELECTの後のカラム名を「albums.Title」「tracks.Name」のように「テーブル名.カラム名」で明示的に書くこともできます。次のように同じ結果が得られます。
このようにテーブル名を明示的に書くとわかりやすいですが、何度も書くことになるので少々面倒くさいですね。次のように省略して書くこともできます。
これは次のような書式になっています。
赤線で示した箇所のように「FROM テーブル名」の後の文字が左側に配置したテーブル名を、「INNER JOIN テーブル名」の後の文字が右側に配置したテーブル名を表します。ここでは左側のテーブルを「l(eft)」、右側のテーブルを「r(ight)」としています。
左結合(LEFT JOIN)
書式
次に左結合をみてきましょう。書式は次のようになります。
内部結合のときの「INNER JOIN」が「LEFT JOIN」に変わっただけです。今回はいきなり省略形で書いています。(もう慣れましたよね?)
左結合
実際にやってみましょう。書式もほぼ一緒なので、実装の確認だけしておきましょう。同じテーブルを使うことにします。
うまくいきました。慣れてしまえば簡単ですね。
まとめ
今回は結合を扱いました。SQLite3でサポートしているのは、内部結合と左結合の2つでした。書式の違いは内部結合(INNER JOIN)とするか左結合(LEFT JOIN)とするかだけでした。
基本的な書式のほかにテーブル名を置き換えることで、省略して表記する方法もご紹介しました。繰り返しテーブル名を書く必要があるときには、省略表記の方が楽なので使いこなせるようになっておきましょう。
コメント