コンテンツにスキップ

SQL基礎

データベースを学ぶときは、まず RDBSQL の関係を掴むと入りやすい。

RDB の基本イメージ

RDB は、行と列を持つテーブルでデータを管理する。

users table
+----+--------+-------------------+
| id | name   | email             |
+----+--------+-------------------+
| 1  | alice  | a@example.com     |
| 2  | bob    | b@example.com     |
+----+--------+-------------------+

関連するテーブルをキーでつなぐと、業務データを分割して管理しやすい。

users              orders
+----+--------+    +----+---------+--------+
| id | name   |    | id | user_id | total  |
+----+--------+    +----+---------+--------+
| 1  | alice  |<---| 10 | 1       | 1200   |
| 2  | bob    |    | 11 | 2       | 3000   |
+----+--------+    +----+---------+--------+

SQL でよく使う操作

  • SELECT データを取得する
  • INSERT データを追加する
  • UPDATE データを更新する
  • DELETE データを削除する
SELECT id, name
FROM users
WHERE id = 1;

アプリから見た基本要素

  • テーブル
  • レコード
  • カラム
  • 主キー
  • 外部キー
  • インデックス
  • 制約
  • トランザクション
  • 正規化 / 非正規化

ACID の基本

RDB は更新の整合性を保ちやすく、ACID がよく出てくる。

  • Atomicity 途中で失敗したら一連の更新をまとめて取り消す
  • Consistency 更新前後でルール違反の状態を作らない
  • Isolation 同時実行しても途中状態が見えにくい
  • Durability 完了した更新は障害後も残る

MySQL と PostgreSQL のざっくり違い

  • MySQL 比較的広く使われる。Web アプリ系で触れる機会が多い
  • PostgreSQL SQL 機能が豊富で、拡張性が高い印象

もう少し具体的な違い

観点 MySQL PostgreSQL
印象 Web アプリで広く使われる 機能が豊富で拡張性が高い
SQL 機能 必要十分 より標準寄りで高機能
JSON 系 扱える 扱いやすく強力な印象
拡張 比較的シンプル 拡張モジュールが豊富
向いていそうな場面 一般的な業務アプリ 複雑な検索、集計、拡張が必要な場面

厳密な優劣というより、既存システム、チームの知見、利用する機能で決まることが多い。

インデックスの基本

インデックスは、検索を速くするための仕組み。

  • 本でいう目次のようなもの
  • WHEREJOIN でよく使う列に貼る
  • 貼りすぎると更新が重くなる
SELECT * FROM users WHERE email = 'a@example.com';

このような検索を頻繁に行うなら、email にインデックスを貼る候補になる。

トランザクションの基本

複数の更新をまとめて成功または失敗にしたいときに使う。

例:

  1. 口座Aから残高を減らす
  2. 口座Bへ残高を増やす

この2つが片方だけ成功すると不整合になるため、1つのトランザクションとして扱う。

学習順のメモ

  1. RDB と SQL の基本
  2. テーブル / 主キー / 外部キー
  3. SELECT INSERT UPDATE DELETE
  4. インデックス
  5. トランザクション
  6. MySQL と PostgreSQL の違い

メモ

  • まずは SQL が何をしているか を読める状態になるのが大事
  • その後に性能や運用を見ると理解しやすい