0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQL 複数のテーブルを結合する

Posted at

目的

  • 複数のテーブルを結合する際の公文をまとめる。

  • 何かしらのデータが格納されているテーブルA テーブルB テーブルCが存在すると過程する。
  • テーブルAにテーブルBとテーブルCを結合し、データを取得する方法の例を下記に記載する。
select 出力するカラム
from テーブルA
join テーブルB
on テーブルAとテーブルBの結合条件
join テーブルC
on テーブルAとテーブルCの結合条件;

具体例1

  • ユーザのid、名前、年齢層のid、結婚の有無のidのデータが格納されるusersテーブルと年齢層のidと年齢層を紐づけるage_rangesテーブルと、結婚の有無のidと結婚の有無の文字列情報を紐づけるmarriagesテーブルが存在していると過程する。

  • 下記にテーブルの詳細情報を記載する。

    • usersテーブル

      カラム名 格納される値の情報
      id 数値が自動インクリメントされて格納される
      name ユーザ名を表す文字列
      age_renge_id ユーザの年齢層を識別するID
      marriage_id ユーザの結婚の有無を識別するID
    • age_rengesテーブル

      カラム名 格納される値の情報
      id 数値が自動インクリメントされて格納される
      age_range 年齢層を指定する文字列(20代など)
    • marriagesテーブル

      カラム名 格納される値の情報
      id 数値が自動インクリメントされて格納される
      marriage 既婚か未婚かの文字列
  • 下記の様にダミーデータが格納されている物とする。

    • usersテーブル

      id name age_renge_id marriage_id
      1 miriwo 2 1
    • age_rengesテーブル

      id age_renge
      1 未成年
      2 20代
      3 30代
    • marriagesテーブル

      id marriage
      1 未婚
      2 既婚
  • select文でusersテーブルの情報のみをまずは取得してみる。

    • 下記を実行してusersテーブルのidが1のレコードの全てのカラムのデータを出力する。

      select *
      from users
      where id = 1;
      
    • 先のSQLにてuserの情報を得ることができたが、年齢層と結婚の有無がidで格納されているためこの結果だけでは正確な情報を得ることはできない。年齢層、結婚の有無も文字列として表示する場合は三つのテーブルを結合する。

    • 年齢層、結婚の有無を日本語の文字列で表示する際は下記を実行する。(出力するカラムはusersテーブルのidカラム、 usersテーブルのnameカラム、age_rangesテーブルのage_rengeカラム、marriagesテーブルのmarriageカラム)

      select users.id, users.name, age_ranges.age_range, marriages.marriage 
      from users
      join age_ranges
      on users.age_renge_id = age_ranges.id
      join marriages
      on users.marriage_id = marriages.id 
      where id = 1;
      
    • データ参照のイメージを下記に記載する

      無題のスプレッドシート_-_Google_スプレッドシート.png

具体例2

  • ユーザのid、名前が格納されているusersテーブルとユーザとキーワードidを紐づけるkeywordsテーブルと、キーワードidとキーワード文字列紐づけるkeyword_contentsテーブルが存在していると過程する。

  • 下記にテーブルの詳細情報を記載する。

    • usersテーブル

      カラム名 格納される値の情報
      id 数値が自動インクリメントされて格納される
      name ユーザ名を表す文字列
    • keywordsテーブル

      カラム名 格納される値の情報
      id 数値が自動インクリメントされて格納される
      user_id ユーザのidが格納されている
      keyword_id キーワードのidが格納されている
    • keyword_contentsテーブル

      カラム名 格納される値の情報
      id 数値が自動インクリメントされて格納される
      keyword キーワードの文字列
  • 下記の様にダミーデータが格納されている物とする。

    • usersテーブル

      id name
      1 miriwo
    • keywordsテーブル

      id user_id keyword_id
      1 1 1
      2 1 2
      3 1 5
    • keyword_contentsテーブル

      id keyword
      1 熱帯魚
      2 PHP
      3 釣り
      4 アウトドア
      5 DIY
  • ユーザ情報とキーワードの情報を出力する際は下記を実行する。(出力するカラムはusersテーブルのidカラム、 usersテーブルのnameカラム、keyword_contentsテーブルのkeywordカラム、usersテーブルのidカラムとnameカラムは重複して表示されるが正常名動作である。)

      ```sql
      select users.id, users.name, keyword_contents.keyword
      from users
      join keyrowds
      on users.id = keyrowds.user_id
      join keyrowd_contents
      on keyrowds.keyword_id = keyrowd_contents.id 
      where id = 1;
      ```
    
    • データ参照時のイメージを下記に記載する。

      無題のスプレッドシート_-_Google_スプレッドシート.png
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?