プロダクトデザイナーも知っておくと便利かもしれない【SQL JOIN編】
前回、前々回とRDBMS,SQLの基本的な説明をまとめてきました。
今回はSQLで複数のテーブルを使ってデータを取得することができるJOINコマンドについてまとめたいと思います。
JOINコマンドとは
SQLのJOINコマンドは2つ以上のテーブルから関連する列を基にしてデータを結合します。JOINコマンドは複数あるため必要そうなものを以下のデータ構造を例に見ていきます。
上記のArtworkテーブルは主に絵画などのアート作品情報データを格納しています。それぞれid,name,artistのカラムがあり、museum_idが外部キーとして紐づいています。この外部キーから各作品がどこの美術館に展示されているかがわかります。ちなみにSmileという名前の作品のmuseum_idはNull(空という意味)になっており、現在どこの美術館にも展示されていません。
一方MuseumテーブルはArtworkテーブル内にあるmuseum_idが紐づけられているテーブルになります。各美術館の情報を格納しており、id,name,address,websiteのカラムデータが存在しているのがわかります。
INNER JOIN
INNER JOINは2つのテーブルの両方に存在するレコードのみを返します。上記のベン図の中で、両方のサークルAとBが重なっている部分がINNER JOINの結果に相当します。つまり、両方のテーブル(サークルAとBに比喩されている)に共通するレコードのみが結果として取り出されることを示しています。サークルAのみ、またはサークルBのみに存在するレコードは含まれません。INNER JOINを使用した場合、結合条件に一致するレコードのみが結果セットに含まれます。
SELECT * FROM Artwork
INNER JOIN Museum ON Artwork.museum_id = Museum.id;
このクエリはArtworkテーブルとMuseumテーブルの間でINNER JOINを実行し、Artworkテーブルのmuseum_idがMuseumテーブルのidと一致するレコードのみを結果として返します。そのためArtworkテーブルの外部キーであるmuseum_idがNullの場合(例のArtworkテーブル画像だとSmileという作品)はこのデータに含まれません。
ちなみにJOINコマンドもINNER JOINと同じ操作を指します。SQLではJOINと書いただけの場合、デフォルトでINNER JOINが行われると解釈されます。
SELECT * FROM Artwork
JOIN Museum ON Artwork.museum_id = Museum.id;
そのため上記のクエリでも同じ結果が返ってくるため通常はこちらを使う方が多いかもです。
OUTER JOIN
OUTER JOINは、一方のテーブルには対応する値があるが他方にはないレコードも含むように、二つのテーブルを結合します。INNER JOINは両方のテーブルに存在するレコードのみを結果として返すのに対し、OUTER JOINは一方のテーブルにのみ存在するレコードも含めます。
OUTER JOINは複数あり、ここではLEFT JOINとRIGHT JOINを見ていきます。
LEFT JOIN
LEFT JOINは左側のテーブルの全レコードと、それにマッチする右側のテーブルのレコードを返します。右側のテーブルにマッチするレコードがない場合は、その部分はNullで埋められます。
上記ベン図のA部分にあたり、左側のテーブルAにあるすべてのレコードに加えて、右側のテーブルBと一致するレコードも取得します。
SELECT
Artwork.name AS ArtworkName,
Artwork.artist AS Artist,
Museum.name AS MuseumName
FROM
Artwork
LEFT JOIN
Museum ON Artwork.museum_id = Museum.id;
上記のクエリではSELECTからFROMまでの部分が取得するデータ情報になります。今回はArtworkテーブルにあるname,artistカラムデータ、Museumテーブル内のnameカラムのデータを取得するようにします。ちなみにASは別名として定義しているだけなので無くても大丈夫です。
FROMの次に書かれているArtworkがベン図でいうAに当たります。MuseumテーブルのidとArtworkテーブルのmuseum_idに一致しない場合はNullを返します。
従って例のデータ構造から上記のクエリで取得できるデータは以下になります。FROM句に指定された左側のテーブルArtworkを起点として考えるためArtworkテーブルでmuseum_idが紐づけられていない作品(Smile)も返されます。
ArtworkName: Smile, Artist: J.J. Arty, MuseumName: NULL
ArtworkName: Madness, Artist: Picasso, MuseumName: Art museum
ArtworkName: Beautiful Lake, Artist: Luke Real, MuseumName: National museum
RIGHT JOIN
RIGHT JOINはLEFT JOINの逆で、右側のテーブルのすべてのレコードを取得し、それにマッチする左側のテーブルのレコードを結合します。片方のテーブルにレコードが存在しない場合はその部分がNull値で埋められる点も同じです。上記ベン図のBに当たります。
SELECT
Artwork.name AS ArtworkName,
Artwork.artist AS Artist,
Museum.name AS MuseumName
FROM
Artwork
RIGHT JOIN
Museum ON Artwork.museum_id = Museum.id;
上記のクエリはLEFT JOINの時と同じデータを返すようにし、RIGHT JOINを使用しています。
RIGHT JOINの場合はJOIN句に指定された右側のテーブルMuseumを起点にします。例のデータ構造から上記のクエリ結果は以下になりますが、Modern museumはArtworkテーブル内にあるどの作品とも紐づけられていないためArtworkName、ArtistはNullで返ってきているのがわかります。
ArtworkName: Madness, Artist: Picasso, MuseumName: Art museum
ArtworkName: Beautiful Lake, Artist: Luke Real, MuseumName: National museum
ArtworkName: NULL, Artist: NULL, MuseumName: Modern museum
最後に
3つの記事に分けてまとめてきましたが、書きながら自分の理解不足を実感しました。笑 SQLに関しては実際にクエリを叩くことが一番の成長に繋がると思っていますのでどんどん叩いてみることをお勧めします。自分のアウトプット目的ではありますがこの記事が参考になれば幸いです。
6/11 追記: 応用編についてまとめました。
この記事が気に入ったらサポートをしてみませんか?