SQL入門
SQL(Structured Query Language)はリレーショナルデータベースを操作する言語です。SQLite、PostgreSQL、MySQL、SQL Server のどれを使っても、基本的なコマンドはほぼ同じです。この記事では、サーバーを必要としない SQLite を使い、テーブルの作成、データの追加、検索、テーブルの結合、グループ化、データの変更を行います。
この記事のすべてのコマンドは SQLite 3.50 で実行し、表示した結果は実際のものです。
必要なもの
- SQLite(`sqlite3 --version` で確認)または無料の DB Browser for SQLite
テーブルの関係
テーブルの作成とデータの追加
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
class_id INTEGER
);
CREATE TABLE classes (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE scores (
student_id INTEGER REFERENCES students(id),
subject TEXT,
score INTEGER
);
INSERT INTO classes VALUES (1, 'ม.4/1'), (2, 'ม.4/2');
INSERT INTO students VALUES (1, 'สมชาย', 1), (2, 'สมหญิง', 1), (3, 'สมศักดิ์', 2);
INSERT INTO scores VALUES (1, 'คณิต', 85), (1, 'อังกฤษ', 70), (2, 'คณิต', 72), (3, 'คณิต', 45), (3, 'อังกฤษ', 60);
- `PRIMARY KEY` は各行に一意のキーを与えます。
- `NOT NULL` は値が必須であることを示します。
- `REFERENCES` はテーブル同士を結びます。`scores.student_id` は `students` に存在しなければなりません。
SELECT と WHERE で検索する
SELECT name FROM students WHERE class_id = 1;
JOIN でテーブルを結合する
SELECT s.name, c.title FROM students s JOIN classes c ON c.id = s.class_id ORDER BY s.name;
`JOIN` は、キーが一致する二つのテーブルの行を組み合わせます。`s` と `c` はテーブルの略称です。
GROUP BY でグループ化する
SELECT subject, AVG(score) AS avg_score, COUNT(*) AS n FROM scores GROUP BY subject ORDER BY subject;
`AVG`、`COUNT`、`SUM` などの集計関数は、各グループに対して動作します。グループ化した後で絞り込むには `HAVING` を使います。
SELECT student_id, SUM(score) AS total FROM scores GROUP BY student_id HAVING SUM(score) >= 100;
データの変更と削除
UPDATE scores SET score = score + 5 WHERE student_id = 3 AND subject = 'คณิต';
DELETE FROM scores WHERE score < 50;
SELECT student_id, subject, score FROM scores ORDER BY student_id, subject;
`UPDATE` は 45 を 50 にするため、続く `DELETE` は何も削除しません。文は記述した順に実行されることに注意してください。
実際の結果
name
------
สมชาย
สมหญิง
name title
-------- -----
สมชาย ม.4/1
สมศักดิ์ ม.4/2
สมหญิง ม.4/1
subject avg_score n
------- ---------------- -
คณิต 67.3333333333333 3
อังกฤษ 65.0 2
student_id total
---------- -----
1 155
3 105
student_id subject score
---------- ------- -----
1 คณิต 85
1 อังกฤษ 70
2 คณิต 72
3 คณิต 50
3 อังกฤษ 60
よくあるミス
- **`UPDATE` や `DELETE` で `WHERE` を忘れる:** すべての行が変更・削除されます。同じ条件の `SELECT` を先に実行して確認します。
- **集計結果の条件を `WHERE` に書く:** 合計などの条件には `HAVING` を使います。
- **文字列の値にダブルクォートを使う:** 標準の SQL では `'...'` のシングルクォートを使います。
- **`ORDER BY` を指定しなくても順序が保証されると思う:** 指定しない場合、行の順序は保証されません。
次のステップ
商品と注文のような自分のテーブルを設計し、商品ごとの売上合計を求める `JOIN` を書いてみてください。そのあと、データが増えると重要になるインデックスとトランザクションを学びましょう。
まとめ
SQL では `CREATE` で構造を定義し、`INSERT`、`UPDATE`、`DELETE` でデータを管理し、`SELECT` と `WHERE`、`JOIN`、`GROUP BY`、`HAVING` で検索します。小さなサンプルデータで試すと、各文の効果がはっきり分かります。