[メモ]初めてのSQL

· ·

普段なんとなく経験で SQL を書いてしまっているけれども、実はちゃんと勉強したことはないから、この機会に「初めての SQL」でパラパラ見直す。

1章 背景情報 🔗

  • 歴史
  • リレーショナルデータベースにおいて変わるかもしれないデータの保管はデータベース内で 1 つにすべき
  • 正規化 : 独立した情報がそれぞれただ1つの場所にあるようにするプロセス(外部キーを除く)
  • SQUARE -> SEQUEL -> SQL(だから英語発音は SEQUEL なのかなぁ)

2 章 データベースの作成と設定 🔗

  • 環境はローカルに Docker で構築
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 について

sql
comments powered by Disqus