こちらの記事では、私が学んだSQLについて記載しております。
自身の忘れないためのメモとしております。
間違っている部分もあるかもしれませんので、ご了承ください。
テーブルの結合とは
テーブル同心をある条件で結合することにより、[正規化なし]の状態を作り出すこと。
テーブルの[正規化]は重要!!
・データ管理が容易になる
・データ容量の削減
→特別な意図がなければ、データは正規化する。
例
ユーザー情報の中で都道府県のデータを取得する際に
”文字列”でデータを保存してしまうと、データに負荷がかかる。
テーブルは別にして、都道府県のみのデータにすることで、”文字列”をまとめられる。
[正規化なし]
テーブルusers
id name 都道府県
1 田中 大阪
2 鈴木 大阪
3 佐藤 大阪
[正規化あり]
テーブルusers テーブル都道府県
id name 都道府県 id 都道府県
1 田中 2 1 東京
2 鈴木 2 2 大阪
3 佐藤 2 3 京都
テーブルを分け正規化することで、データ管理がしやすくなり、容量を削減可能。
もし今後、都道府県の「大阪」が「太田」と変更された場合でも、テーブル都道府県の変更を行えばすぐに対応可能になる。
内部結合 inner joinで結合可能
***記述方法***
select
テーブル名a.id,
テーブル名b.表記したいカラム名 ←テーブル名b.nameなど
from
テーブル名a
inner join
テーブル名b
on テーブル名a.id = テーブル名b.a_id; ←2つのテーブルのidを結合する
***テーブル名は省略も可能***
テーブル users, orders
select
u.id,
u.name,
o.name
from
users u ←users as uとして変更可能。asは省略も可能なので左のような記載になる。
inner join
orders o
on u.order_id = o.id;
外部結合 left outer join/right outer join
inner joinではnullは表記せず、left outer joinではnullも表記する
select
u.last_name,
u.id,
o.user_id,
o.id
from
users u
-- inner join
left outer join
orders o
on u.id = o.user_id
order by u.id;
3つ以上のテーブルの結合 inner join連続で記述
テーブル users, orders, orders_details
select
u.id,
u.name,
o.name,
od.price
from
users u
inner join
orders o
on u.order_id = o.id
inner join
orders_details od
on od.order_id = o.id;
一対多もしくは多対多の関係は、確認して行うこと!!!
テーブルの足し算 union/union all
テーブル1とテーブル2で列数(カラム名)を合わせる必要があります!!
テーブル users ,adomin
select
email,
name,
gender
from
users
union ←unionのみだと重複は省略。union allだと重複も表記される。
select
email,
name,
gender
from
admin
;
***条件分岐*** order byのみ全体の1つしか記述できない!!!!!!!
select
email,
last_name,
first_name,
gender
from
users
where
gender = 1
union
select
email,
last_name,
first_name,
gender
from
admin_users
where
gender = 2
order by gender ←order byは全体記述の最後!
;
補足
主キー/外部キー
・主キー・・1つの行を特定できる列(カラム)のこと
・外部キー・・・他のテーブルの関連付けに使う列(カラム)のこと
記述順序
記述順序 実行順序
select・・・・・取得カラムの指定 from・・・・・・・対象テーブルの指定
from・・・・・・・対象テーブルの指定 結合処理
結合処理 where・・・・・・絞り込み条件式の指定
where・・・・・・絞り込み条件の指定 group by・・グループ化の条件を指定
group by・・グループ化の条件指定 having・・・・・グループ化した後の絞り込み条件を指定
having・・・・・グループ化した後の絞り込み条件指定 select・・・・・取得カラムの指定
order by・・・並び替え条件指定 order by・・並び替え条件を指定
limt・・・・・・・・取得する行数の制限 limit・・・・・・取得する行数の制限