普段なんとなく経験で SQL を書いてしまっているけれども、実はちゃんと勉強したことはないから、この機会に「初めての SQL」でパラパラ見直す。
1章 背景情報 🔗
- 歴史
- リレーショナルデータベースにおいて変わるかもしれないデータの保管はデータベース内で 1 つにすべき
- 正規化 : 独立した情報がそれぞれただ1つの場所にあるようにするプロセス(外部キーを除く)
- SQUARE -> SEQUEL -> SQL(だから英語発音は SEQUEL なのかなぁ)
2 章 データベースの作成と設定 🔗
1
2
3
4
|
docker pull mysql:8.0.26
docker run -it --name test-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:8.0.26
docker exec -it test-mysql bash -p
mysql -u root -p
|
1
2
|
mysql> SOURCE ./sakila-schema.sql;
mysql> SOURCE ./sakila-data.sql;
|
- unsigned : 正の数
- enum 指定した場合は型は要らないんだなぁ :
eye_color ENUM('BR', 'BL', 'GL')
- プライマリキーを設定して外部成約キーも設定するパターン
1
2
3
4
5
6
7
8
|
CREATE TABLE favorite_food
(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
|
1
|
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
|
5 章 複数のテーブルからデータを取得する 🔗
- 結合の際に、あまり USING って使ってないなぁ。こういう本を読むと思い出す。結合テーブル同士でカラム名が一緒なら使おう
1
2
3
|
SELECT c.first_name, c.last_name, a.address
FROM customer c INNER JOIN address a
USING(address_id)
|
- 3 テーブル inner join。この場合 using は使えないのかな?
1
2
3
4
5
6
|
SELECT c.first_name, c.last_name, ct.city
FROM customer c
INNER JOIN address a
ON c.address_id = a.address_id
INNER JOIN city ct
ON a.city_id = ct.city_id
|
- 自己結合など、一部なんでそういう書き方にしないとダメなんだ?というのがイマイチパッと来ていない
6 章 集合 🔗
union , intersect , except について