本記事では、海外のSQL学習サイト【SQL Bolt】を利用して、データベース初心者向けにSQLの基本を解説します。
第7回は「SQL Lesson 7: OUTER JOINs」、複数の表を外部結合する方法についてです。
- 外部結合はLEFT JOIN、RIGHT JOIN、FULL JOINの3種類
- SQL文では「FROM テーブル名」の次に記述する
- INNER/LEFT/RIGHT/FULLによって、データの保持方法が異なる
ざっくり日本語訳
今回は、前回学んだ内部結合(INNER JOIN)とは反対の意味の、外部結合(OUTER JOIN)を学びます。
外部結合の種類とSQL文の書き方
Lesson6で使用した「INNER JOIN」では、両方のテーブルに属するデータだけが結果に出力されました。
しかし、実際には2つのテーブルに非対称なデータがあることがあります。
例えば「片方の表には存在するが、もう片方の表には存在しないデータがある」という場合です
テーブルを結合するとき必要なデータが結果から取り残されないようにするため、以下の3種類の外部結合があります。
- LEFT JOIN
- RIGHT JOIN
- FULL JOIN
記述する順番
SELECT DISTINCT 列名1, 列名2, …
FROM テーブル1
INNER/LEFT/RIGHT/FULL JOIN テーブル2
ON テーブル1.列名a = テーブル2.列名b
WHERE 条件
ORDER BY (並び替えたい)列名 ASC/DESC
LIMIT 取り出したい行数 OFFSET 取り出し開始位置;
INNER JOINと同様に、これら3つの結合でも、データを結合する列を指定する必要があります。
LEFT / RIGHT / FULLの違い
テーブルAとテーブルBを結合する場合の処理の違いはこちらです。
LEFT JOIN | Bに一致する行があるかどうかに関係なく、単純にAの行を保持する |
RIGHT JOIN | Aで一致する行があるかどうかに関係なく、単純にBの行を保持する |
FULL JOIN | 一致する行がもう一方のテーブルにあるかどうかに関係なく、両方のテーブルの行が保持される |
これらの外部結合を使用する場合、実際には結果や制約のNULLを処理するための細かい条件を記述する必要があります。
詳しくは次のレッスンで!
演習問題の和訳・解答
- 1. Find the list of all buildings that have employees
-
【和訳】従業員がいるすべての建物を取り出してください。
SELECT * FROM Employees LEFT JOIN Buildings ON Employees.Building = Buildings.Building_name GROUP BY Employees.Building;
- 2. Find the list of all buildings and their capacity
-
【和訳】すべての建物とその収容人数のリストを取り出してください。
SELECT * FROM Buildings;
こむぎ問2は簡単すぎるので、出題ミスかな…?という感じもしますね
- 3. List all buildings and the distinct employee roles in each building (including empty buildings)
-
【和訳】すべての建物と、各建物における従業員の明確な役割をリストアップしてください(空の建物も含む)。
SELECT Distinct Building_name,Role FROM Buildings LEFT JOIN Employees ON Buildings.Building_name = Employees.Building;
コメント