Day 6, 7: MySQL 操作
/
- from Qiita:
今日の授業は、Rails を使わず、MySQL のみでデータ入力、操作する内容でした。
テーブル同士の関係Association
belong_to : 1対1の関係
(例) exam_result(試験点数) belong_to student とある教科の試験の点数は、特定の 1 人の生徒に帰属
has many : 1対多の関係
(例) student has many exam_result 生徒は複数の試験を受けるので。
many to many :多対多の関係
(例) 学生と部活の関係。学生は複数の部活に所属し、1 つの部活には複数の学生が所属。 当然、まったく所属していない学生も居る可能性がある
生徒 | 部活1 | 部活2 | 部活3 | 部活4 |
---|---|---|---|---|
Aさん | 自転車部 | 軽音部 | 水泳部 | バスケ部 |
Bさん | ||||
Cさん | 茶道部 | 華道部 | 水泳部 | |
Dさん | 茶道部 | 軽音部 |
多対多テーブルの問題
DB 上では 1 つのカラムに複数のデータは入れることができない。 上の表では、同義のカラム(部活1、部活(2)。)。を増やしているが、 データベースでは、これを 2 次元で表現できない
解決法:中間テーブル(/関連テーブル)、
まず、生徒と部活に ID を持たせる
生徒 | 生徒ID |
---|---|
Aさん | 1 |
Bさん | 2 |
Cさん | 3 |
Dさん | 4 |
部活 | 部活ID |
---|---|
自転車部 | 1 |
茶道部 | 2 |
水泳部 | 3 |
中間テーブル
生徒ID | 部活ID |
---|---|
1 | 1 |
1 | 3 |
1 | 4 |
実際に DB で触るときは、生徒テーブルと中間テーブルを JOIN し、さらに中間テーブルと部活テーブルを JOIN する
使うデータ
- データベース: univ
- 生徒テーブル: students
- name, grade, email, age, gender, others, created_at, updated_at
- 試験結果テーブル: exam_results
- name, student_id, score, max_score, created_at, updated_at
本題:MySQL操作 CREATE DATABASE
データベース作成
バッククォートとシングルクォート
- バッククォート:テーブル名に使う
- シングルクォート:データの文字列に使う
ただし、バッククォートは必須でない バッククォートよって、テーブル名やカラム名で使用できないように指定されている予約語(Reserved Words)を使えるようにできる。が、使わない方が良い。
PRIMARY KEY、AUTO_INCREMENT
- PRIMARY KEY
- 主キーの意。なお、外部キーは foreign key
- AUTO_INCREMENT
- 値が指定しないと、自動的にシーケンス番号を割り当てられる。整数型で、1 ずつ増加し連番
MySQLのデータ型
- INT : 整数型(他にも、TINYINT < SMALLINT < MEDIUMINT < INT < BIGINT)
- CHAR : 文字型(似たようなのには、VARCHAR がある)
- TIMESTAMP : 日付時刻型(‘YYYY-MM-DD HH:MM:SS’)
- 入力するデータ量に従って、最適なデータ型を選んだ方が、色々と良いようだ
DESC :テーブル情報の確認(Describeの略
同様に、exam_results テーブルも作成
ALTER TABLE :カラム変更
INSERT INTO :データ追加
UPDATE SET WHERE:テーブル情報の更新
今の時点では、max_score が 100 点だが、200 点満点に変更してみる
JOIN :複数テーブル結合
基本構文
INNER JOIN と OUTER JOIN
-
INNER JOIN : 内部結合の意
- 主キー=外部キーになるところだけ表示
- 結合できなかったレコードは表示しない
-
outer join :外部結合
- 結合できなかったレコードは、NULL で表示
- LEFT JOIN :主キー側のテーブルに合わせて表示
- RIGHT JOIN :外部キー側のテーブルに合わせて表示
INNER JOINで結合してみる
students 生徒テーブルと exam_results 試験結果の、主キーと外部キーを使って結合
データ削除
テーブル情報の削除
テーブルの削除
データベースの削除
7日目
データベースとテーブル作成、データ追加
データベース作成a
テーブル作成
本題:MySQL操作
scoreの最高、最小、平均、(score / max_score)の最大値
GROUP BY
科目ごとの最大値、最小値、平均値を求め、名前を最大、最小、平均に変更
INNER JOIN
students と exam_results を結合し、生徒ごとの、最高得点、最少得点、平均得点を出力