SQL入門

SQL入門

SQL(Structured Query Language)はリレーショナルデータベースを操作する言語です。SQLite、PostgreSQL、MySQL、SQL Server のどれを使っても、基本的なコマンドはほぼ同じです。この記事では、サーバーを必要としない SQLite を使い、テーブルの作成、データの追加、検索、テーブルの結合、グループ化、データの変更を行います。

この記事のすべてのコマンドは SQLite 3.50 で実行し、表示した結果は実際のものです。

必要なもの

テーブルの関係

概略図:students、classes、scores の三つのテーブルがキーで結ばれている
概略図:students、classes、scores の三つのテーブルがキーで結ばれている

テーブルの作成とデータの追加

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);

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

よくあるミス

次のステップ

商品と注文のような自分のテーブルを設計し、商品ごとの売上合計を求める `JOIN` を書いてみてください。そのあと、データが増えると重要になるインデックスとトランザクションを学びましょう。

まとめ

SQL では `CREATE` で構造を定義し、`INSERT`、`UPDATE`、`DELETE` でデータを管理し、`SELECT` と `WHERE`、`JOIN`、`GROUP BY`、`HAVING` で検索します。小さなサンプルデータで試すと、各文の効果がはっきり分かります。