テーブルの結合とはテーブルの正規化とは
テーブルの正規化とは
- テーブルを分けて情報の重複をなくしていく作業
テーブルの正規化するメリット
- 1 . データ管理が容易になる
2 . データ容量の削減
→特別な意図がなければ、テーブルは正規化する。
- 特別な意図の例) システムのパフォーマンス向上のため。
テーブルの結合とは
- テーブル同氏をある条件で結合することにより、正規化なしの状態を作り出すこと。
基本は正規化、しかしながら、
パフォーマンスの問題が解消できない(できなくなりそうな)場合はあえて非正規化することもある。
実務で見かける可能性もある。
主キーと外部キー
主キー(Primary Key, PK)
- 一つの行を特定できる列のこと。
外部キー(Foreign Key, FK)
- 他のテーブルとの関連づけに使う列のこと
- 外部キーは関連づけされた先のテーブルでは主キーになる。
リレーションシップの種類
テーブル同士の結び付き・関係性の種類
1対多
- 多対多
- 一対一
1対多の事例
(1)ユーザー - (多)注文
(1)ブログの投稿者 - (多)ブログの投稿
(1)注文 - (多)注文明細
(1)部署 - (多)従業員
多対多の事例
(多) 商品 - (多) 商品カテゴリ
(多) ブログの投稿 - (多)ブログのカテゴリ
(多) ユーザー - (多) 操作権限
一対一の事例
- 特殊なので、あまり使う機会はない
内部結合でテーブルを結合するinner join
- 構文
select テーブル名1.列名, テーブル名2.列名 ... from テーブル名1 inner join テーブル名2 on テーブル名1.列名 = テーブル名2.列名;
内部結合 + 絞り込み
- 構文 inner join + where
select テーブル名1.列名, テーブル名2.列名 ... from テーブル名1 inner join テーブル名2 on テーブル名1.列名 = テーブル名2.列名 where 絞り込み条件;
select文の記載順序と実行順序(結合を追加)
記述順序 (必ずこの順序で書く必要がある)
- 1 . select ・・・ 取得行(カラム)の指定
- 2 . from ・・・ 対象テーブルの指定
- 3 . 結合処理
- 4 . where ・・・ 絞り込み条件の指定
- 5 . group by ・・・ グループ化の条件を指定
- 6 . having ・・・ グループ化した後の絞り込み条件を指定
- 7 . order by ・・・ 並び替え条件を指定
- 8 . limit ・・・ 取得する行数の制限
実行順序
- 1 . from ・・・ 対象テーブルの指定
- 2 . 結合処理
- 3 . where ・・・ 絞り込み条件の指定
- 4 . group by ・・・ グループ化の条件を指定
- 5 . having ・・・ グループ化した後の絞り込み条件を指定
- 6 . select ・・・ 取得行(カラム)の指定
- 7 . order by ・・・ 並び替え条件を指定
- 8 . limit ・・・ 取得する行数の制限
外部結合
- 片方のテーブルの情報がすべて出力される、テーブルの結合
外部結合は欠落のあるデータを取り扱う結合。
構文 :外部結合 left outer join
select テーブル名1.列名, テーブル名2.列名 ... from テーブル名1 left outer join テーブル名2 on テーブル名1.列名 = テーブル名2.列名;
left outer join / right outer join
left outer join...左側(from句で最初に書いたテーブル)をマスタとする。
right outer join...右側(from句で後に書いたテーブル)をマスタとする。
内部結合 inner join
- お互いに一致している行が統合テーブルの対象となる
テーブルの足し算 集合演算子 union nuion all
- 構文
select 列1, ... from テーブル1 union select 列2, ... FROM テーブル2
- ベースとなるselectの結果に、unionの後に記載したselectの結果を足し算する
SQL 関数と演算子
四捨五入 round
- 構文
round(対象の数値, 丸めの桁数)
- 例)
丸めの桁数に0を指定すると、小数点第1位で四捨五入 round(10,555, 0)
丸めの桁数に1を指定すると、小数点第2位で四捨五入 round(10,555, 1)
- →10.6
丸めの桁数に2を指定すると、小数点第3位で四捨五入 round(10,555, 2)
- →10.56
文字列演算
- 文字列演算 a || b ・・・文字列aと文字列bを連結
- ただし、MySQL,SQL Server 2012以後ではconcat関数を使用
- concat(文字列1, 文字列2, 文字列3 ・・・)
SQL データの並び替え
select文で取得するデータの並び替え order by
- 構文
order by 列名や式 並び順, ...
並び順の指定
- asc ・・・昇順(ascending) ※デフォルト。並び順を指定しない場合ascになる
- desc ・・・降順(descending)
order byには、カンマ区切りで複数の並び替え条件を指定できる。
- 登録順はid昇順で並び替える。
データの集約
合計値を求めるsum集約関数
- 構文
sum(expr) ※exprの合計値を返す。
平均値を求めるavg集約関数
- 構文
avg(expr) ※exprの平均値を返す。
最小値を求めるmin集約関数
min(expr) ※exprの最小値を返す。
最大値を求めるmax集約関数
max(expr) ※exprの最大値を返す。
集約関数におけるnullの扱い
nullとは
- 値がないことを示す特別な表現
数値の0でも、長さ0でもなく、値がない。
集約関数では、基本的にはnullが無視される。
対象行の行数を数えるcount集約関数
- 構文
count(expr) 補足: * exprの数をカウント * count(*)とすると、テーブルの行数を取得できる。 * userテーブルの行数が、ユーザー数となる。
指定した期間のユニークユーザー数を求める方法
ここでの、ユニークユーザーとは、決まった集計期間内にアクセスしたユーザーの数を表す数値
あるユーザーAが決まった機関内に10アクセスしたとしても、1と数える。 where句と集約関数count(distinct expr)を組み合わせて使う。
count(distinct exor)の形で、count関数は、重複を排除した上で、個数を取得できる。
テーブルのデータをグループ化するgroup by句
- 構文
select 列名 from テーブル名 group by 列名;
- countなどを使ってデータを集計する時に、グループ単位で集計が行われる
- group byで指定する列名によって、グループ化される。
集約結果をさらに絞り込むhaving句
- where句と同様に、条件に合致する行だけに絞り込める。
having句は、テーブルのデータを集約して結果に対して、条件式を適用する場合に利用する。
構文
select 列1, ... from テーブル名 where 条件式 group by 列1, ... having 条件式;
記述順序 having
- select
- ↓
- from
- ↓
- where
- ↓
- group by
- ↓
- having
※ ポイントとしては、havingは、group byの後に書く
select文の記載順序と実行順序
記述順序 (必ずこの順序で書く必要がある)
- select ・・・ 取得行(カラム)の指定
- from ・・・ 対象テーブルの指定
- where ・・・ 絞り込み条件の指定
- group by ・・・ グループ化の条件を指定
- having ・・・ グループ化した後の絞り込み条件を指定
- order by ・・・ 並び替え条件を指定
- limit ・・・ 取得する行数の制限
実行順序
- from ・・・ 対象テーブルの指定
- where ・・・ 絞り込み条件の指定
- group by ・・・ グループ化の条件を指定
- having ・・・ グループ化した後の絞り込み条件を指定
- select ・・・ 取得行(カラム)の指定
- order by ・・・ 並び替え条件を指定
- limit ・・・ 取得する行数の制限
記述順序/実行順序の違い
- select / from
- from / where
- where / group by
- group by / having
- having / select
- order by / order by
- limit / limit
※ ポイント : selectの記述順序と実行順序が異なる
データを表計算ソフトに取り込む
select文により取得したデータの利用方法
- CSVファイルに書き出し、表計算ソフトに取り込む、
- エクセル、Google スプレッドシートなど
データをCSVに書き出す
- mysql workbenchなどのコネクタ/ドライバからCSVファイルを書き出しエクセル、 Google スプレッドシートに取り込む。
CSVとは
* Comma-Separated Valuesの略
* 区切りもじであるコンマ「,」で区切ったテキストデータ
CSVの例
id ,name price 1, 商品01, 500
※CSVの代わりにTSVという形式を使うことがある。
TSVとは
- Tab-Separated Values(TSV)の略
- 区切りもじであるコンマ「タブ」で区切ったテキストデータ
SQL文の基礎
データベースからデータを取得するselect文
* 構文 select 列1,列2 ... from テーブル名 * 全ての列を取得したい場合は、 select * from テーブル名;
初心者が間違いやすいこと
- DBを選択していない
- スペルミス
- 全角文字で記載
コメントの種類
- ① 「--」
② 「/ /」
「*」を使って全ての行を取得するより、必要な列を絞って取得する方が高速に実行できる
- 実務では、基本的に必要なカラムに絞ってデータを取得する。
- 試験的にSQLを書く時や、学習の時など、パフォーマンスの心配がないときは、「*」を使うこともある。
列に別名を付ける
select 列1 as 別名にする文字を記載 from テーブル名
※asは省略可能
列の値に対して演算を行う
- テーブルから抽出した結果をそのまま使うだけではなく、計算した結果を出力することができる。
select name as 名前, price as 価格, price * 1.1 as 税込価格 from products;
条件を指定して値を取得できるwhere句を使用
- 構文
select 列1, 列2 ... from テーブル名 where 条件;
where句で条件を設定する際に利用できる代表的な演算子の種類
- 「=」等しい
- 「>」より大きい
- 「>=」以上
- 「<」より小さい
- 「<=」以下
- 「<>」, 「!=」等しくない
- 「in」ある値が値セット内に含まれているかどうか
- 「not in」値が値セット内に含まれていないかどうか
- 「is null」値がnull
- 「is not null」値がnullでない
- 「like」パターンマッチング(あいまい検索)
- 「between ... and ...」値が値の範囲内に含まれているか
パターンマッチングによる絞込ができるlike句
- 構文
select 列1, ...,from テーブル名 where 列名 like ワイルドカード文字;
ワイルドカード文字について
ワイルドカード文字で文字列のパターンを指定します。
- '%' (パーセント) ・・・0文字以上の任意の文字列
- '_' (アンダースコア) ・・・任意の1文字
例)
- '中%' →'中'で始まる文字列
- '%中%' → '中'を含む文字列
- '%子' → '子'で終わる文字列
- '__子' →何かしらの文字から始まり、'子'で終わる文字列
取得件数を制限できるlimit句
- 構文
select 列1, ・・・ from テーブル名 limit [オフセット,] 最大取得件数;
※オフセットは省略可能