【SQL入門】JOIN句で複数テーブルを結合|SQL Bolt⑥ 和訳・演習解答

INNER JOINで複数の表を結合する

本記事では、海外の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;
INNER JOINで複数の表を結合する

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次