本記事では、海外のSQL学習サイト【SQL Bolt】を利用して、データベース初心者向けにSQLの基本を解説します。
第6回は「SQL Lesson 6: Multi-table queries with JOINs」、複数の表をJOIN句で結合する方法についてです。
- データベースの正規化とは何か
- 「INNER JOIN ~ ON …」で2つの表を内部結合する方法
ざっくり和訳
Lesson5までは1つのテーブルを対象にSQL文を実行してきましたが、今回は2つ以上のテーブルを扱っていきます。
データベースの正規化
データの重複をなくし、データの整合性を保つことができる状態にすることを、データベースの正規化といいます。(SQL Boltの元サイトには明確に書かれていなかったため、最初に補足です)
現実世界では、エンティティデータを細かく分割し、正規化という処理で複数の直交するテーブルに分けて保存することがよくあります。
- 1つのテーブル内の重複するデータを最小化する
- データベース内のデータを互いに独立して成長させる
トレードオフとして(つまりデメリットとして)以下の2点があります。
- 複数のテーブルの異なる部分からデータを取り出そうとするとクエリが複雑になる
- 多くの大きなテーブルを扱う場合、パフォーマンスが低下する可能性がある
パフォーマンス低下の一例に、処理にかかる時間が長くなることが考えられますね
JOIN句で複数テーブルを扱う方法
正規化されたデータベース内の複数テーブルにまたがる操作を行うためには、使用するテーブルを結合する必要があります。
ひとつのエンティティに関する情報を共有するテーブルには、 そのエンティティをデータベース全体で一意に識別するための主キーが必要です。
一般的な主キーとして自動インクリメントの整数が挙げられますが、一意な値であれば文字列やハッシュ値も主キーとして使えます。
JOIN句を使うと、主キーによって2つのテーブルの行データを結合することができます。結合にはいくつか種類がありますが、今回紹介するのはINNER JOIN(内部結合)です。
記述する順番
SELECT DISTINCT 列名1, 列名2, …
FROM テーブル1
INNER JOIN テーブル2 ON テーブル1.列名a = テーブル2.列名b
WHERE 条件
ORDER BY (並び替えたい)列名 ASC/DESC
LIMIT 取り出したい行数 OFFSET 取り出し開始位置;
補足・関連記事
今回登場した内部結合、SQL Boltの原文ではSQL文の具体例がなく、わかりづらかったかもしれません…。
「INNER JOIN」を使ったSQL文はこちらの記事でも解説しています。
「基本情報技術者試験の過去問を、実際にSQLを実行してデータベースを操作しながら解説してみた!」という内容です。
データベース操作をより具体的にイメージできると思うので、よかったら合わせてご覧ください◎
演習問題の和訳・解答
- 1. Find the domestic and international sales for each movie
-
【和訳】各映画の国内と海外の売上を調べてください。
SELECT * FROM movies INNER JOIN Boxoffice ON Movies.Id = Boxoffice.Movie_Id;
【別解】映画名と売上だけを取り出す場合はこちら。
SELECT Title, Domestic_sales, International_sales FROM movies INNER JOIN Boxoffice ON Movies.Id = Boxoffice.Movie_Id WHERE Domestic_sales < International_sales;
- 2. Show the sales numbers for each movie that did better internationally rather than domestically
-
【和訳】国内より海外の成績が良かった映画の売上を示してください。
SELECT * FROM movies INNER JOIN Boxoffice ON Movies.Id = Boxoffice.Movie_Id WHERE Domestic_sales < International_sales;
- 3. List all the movies by their ratings in descending order
-
【和訳】すべての映画を評価順に並べてください。
SELECT * FROM movies INNER JOIN Boxoffice ON Movies.Id = Boxoffice.Movie_Id ORDER BY Rating DESC;
コメント