実務に差がつくSQL上級演習:正規化・インデックス・ビュー・トランザクション

ナナさん、中級まで来たけど、もっと「プロっぽいSQL」ってあるんですか?

あるわよ、ミサキちゃん。上級編では、正規化・インデックス・ビュー・トランザクションなど「実務の質を上げる技術」を学ぶの。
データベース設計の要:正規化
正規化とは「データを無駄なく、矛盾なく整理する設計ルール」のこと。
たとえば、1つのテーブルに商品名・カテゴリ名が毎回書かれていたら、更新が大変!
例:正規化前(NG)
商品ID | 商品名 | カテゴリ名 |
---|---|---|
1 | リンゴ | 果物 |
2 | バナナ | 果物 |
3 | にんじん | 野菜 |
正規化後(OK)
商品テーブル(products)
id | name | category_id |
---|---|---|
1 | リンゴ | 1 |
2 | バナナ | 1 |
3 | にんじん | 2 |
カテゴリテーブル(categories)
id | name |
---|---|
1 | 果物 |
2 | 野菜 |

おお!カテゴリ名が1つの場所にまとまってる!

そうすることで、あとから修正もしやすく、ミスも減るのよ。
処理速度アップ!インデックスの活用
インデックスとは「検索しやすくするための目次みたいなもの」。
データが増えてきたら、検索が遅くなるので、よく使う列にインデックスを張ると効果的。
CREATE INDEX idx_email ON customers(email);
CREATE INDEX
でインデックス作成- 検索やJOINが速くなる

インデックスって検索のスピードアップ装置みたいな感じですね!

ただし、入れすぎると逆に遅くなることもあるから、使い所が大事よ。
ビューでSQLを使いまわそう
ビュー(VIEW)は、SELECT文の結果を「仮想のテーブル」として保存しておける機能。
CREATE VIEW vip_customers AS
SELECT name, email FROM customers WHERE address LIKE '%東京%';
- 使い方は
SELECT * FROM vip_customers;
のように通常のテーブルと同じ - 更新できないこともある(複雑な結合があるとき)

なるほど…よく使う検索結果を名前で保存しておけるんですね!

そう、分析やレポート用にもよく使うわよ。
トランザクションで「まとめて処理」
トランザクションとは、「一連の処理をまとめて行う仕組み」。
途中で失敗したら、全部元に戻すことができる。
BEGIN;
UPDATE customers SET address = '東京' WHERE id = 1;
UPDATE orders SET price = price * 1.1 WHERE customer_id = 1;
COMMIT;
BEGIN
:処理の始まりCOMMIT
:確定(保存)ROLLBACK
:やり直し(キャンセル)

一括でやって、ダメだったら取り消せるんですね!

銀行の振込処理や会員登録なんかにも使われる、大事な仕組みなの。
応用問題に挑戦!
以下の構造とクエリで、実践力を試してみましょう。
- カテゴリごとの商品数を集計するSQLを書いてみよう
- インデックスを使って「emailで検索」する処理を高速化しよう
- 東京在住の顧客を対象にしたビューを作ってみよう
- 注文金額を更新する処理をトランザクションで包もう
まとめ
上級テーマ | ポイント |
---|---|
正規化 | データ構造を整理してミスを防ぐ |
インデックス | 検索やJOINを高速化 |
ビュー | よく使うSELECT結果を保存 |
トランザクション | 複数の処理をまとめて安全に |

正規化とかビューとか、まさにプロっぽい内容ですね〜!

これができれば、SQL上級者の仲間入りよ。実務でバリバリ活躍できるわね!