ぽかぽかコード日和

とっても暑い夏の日にプログラミングはじめました☀️

【SQL】リレーションとテーブルの結合

リレーショナルデータベース(RDB)とは

データベース構造の一種で、複数の表形式でデータを管理しているもの。

  • テーブルを分割していることでデータの管理が効率的になり、安全、確実、高速に処理しやすい。
  • ACID特性を持ち、トランザクション処理の信頼性と安全性が高い。
  • 複数のテーブルに分かれるため結合処理が必要になり、わかりづらくなる。
  • データ量が多くなると更新するときに時間がかかりやすい。

リレーションとは

テーブルそのもの
テーブルの列(カラム)の定義とすべての行(レコード)の集まりのこと。

リレーションシップとは、
テーブル同士を共通した行(カラム)で関連づけること。
データの整合性をデータベースに保証させることができる。

Primary Key(主キー)

テーブルの各行(レコード)を重複せずに識別できるようになる列(カラム)のこと。

  • Primary Keyは、候補キーの中からテーブルごとに1つだけ選ばれる。

  • 同一の値は存在しないこと(一意性制約)、 値がNULLでないこと(非NULL制約)という制約を必ず満たすもの。

  • 社員番号のような自然に一意性を持つ列を「自然キー」という。

  • 管理目的で追加された列を「人工キー」という。
  • 複数の列を組み合わせることで一意性を確保し、1つの主キーとしているものを「複合主キー」という。

Foreign Key(外部キー)

他のテーブルの主キーと関連づけさせるための列(カラム)のこと。

  • Foreign Keyが指し示す先にあるべき行が存在することによってリレーションシップが成立する。
  • 参照先に必ず存在する状態を参照整合性といい、参照制約を満たすもの。
  • 制約を満たしている場合は、同じカラムにPrimary KeyとForeign Key両方を付与することもできる。

JOIN句

複数のテーブルを結合させる

SELECT 列名1, 列名2, ・・・
FROM テーブルA
JOIN テーブルB
ON テーブル名.カラム名 = テーブル名.カラム名

SELECT *
FROM customers
JOIN orders
ON customers.id = orders.customer_id
JOIN items
ON orders.item_id = items.id
  • 3つ以上のテーブルの結合は、JOIN・ON句を追加し1つずつ結合処理していく。

  • Foreign Keyの値がNULLのときは、結合先が見つからず行ごと消滅してしまう。

外部結合
  • 内部結合・・・結合する先が見つからないときは、結果に表示されず行ごと消滅するJOIN句での結合。
  • 外部結合・・・結合する先が見つからないとき、結合先のカラムにNULLを入れて、すべての行を強制的に表示する方法。
外部結合の種類

SELECT 列名1, 列名2, ・・・
FROM テーブルA
LEFT JOIN テーブルB
ON テーブル名.カラム名 = テーブル名.カラム名

左外部結合(LEFT JOIN)
  左のテーブルのすべての行を表示する。
右外部結合(RIGHT JOIN)
  右のテーブルのすべての行を表示する。
完全外部結合(FULL JOIN)
  左右のテーブルのすべての行を表示する。
  MySQLはサポート外なのでUNIONで左右をつないで代用する。
  • 自己結合・・・同じテーブル同士を別名(AS句)をつけて結合。
  • 副問い合わせの結果との結合・・・テーブルの代わりに副問い合わせの式を入れる。必ず別名(AS句)をつける。
SELECT *
FROM customers
JOIN ( 
   SELECT * FROM orders
   WHERE price >=5000
   ) AS orders_5000
ON customers.id = orders_5000.customer_id;

参考にしたサイト