はじめてLESSON 01
この教材で学ぶこと table、key、CRUD、JOIN、transactionを最初のschemaで学びます。データベースとSQL入門
対象読者: dataを永続化したいが、tableやSQLを初めて学ぶ人。
この教材でできるようになること
- database、DBMS、table、row、columnを説明できる
- entityとrelationshipから小さなschemaを作れる
- SELECT、INSERT、UPDATE、DELETEの基本を読める
- primary key、foreign key、transactionの役割を説明できる
1. databaseとDBMS
databaseは整理されたdataの集合、DBMSは保存、検索、更新、権限、同時実行、復旧などを管理するsoftwareです。
relational databaseではdataをtableとして表し、table間の関係をkeyで表します。
2. 最初のschema
CREATE TABLE courses (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title text NOT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE lessons (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
course_id bigint NOT NULL REFERENCES courses(id),
title text NOT NULL,
position integer NOT NULL CHECK (position > 0),
UNIQUE (course_id, position)
);
- primary key: rowを一意に識別する
- foreign key: 別tableに存在するrowとの関係を守る
- NOT NULL: 値を必須にする
- CHECK: domain ruleをDBでも守る
- UNIQUE: 重複を防ぐ
3. CRUD
INSERT INTO courses (title) VALUES ('プログラミング');
SELECT id, title
FROM courses
ORDER BY created_at DESC;
UPDATE courses
SET title = 'プログラミング基礎'
WHERE id = 1;
DELETE FROM courses
WHERE id = 1;
UPDATEやDELETEでは、先に同じWHEREを使ったSELECTで対象を確認します。条件なしの更新・削除を避けます。
4. JOINで関係を読む
SELECT
courses.title AS course_title,
lessons.position,
lessons.title AS lesson_title
FROM courses
JOIN lessons ON lessons.course_id = courses.id
ORDER BY courses.id, lessons.position;
どのkeyとどのkeyを結ぶかを明示します。同名columnにはtable名またはaliasを付けます。
5. parameter binding
外部入力を文字列連結でSQLへ入れません。
cursor.execute(
"SELECT id, title FROM courses WHERE title = ?",
(user_input,),
)
placeholder記法はdriverにより異なります。利用中のlibraryのparameter APIを使います。
6. transaction
複数操作を一つの単位として成功または失敗させます。
BEGIN;
INSERT INTO courses (title) VALUES ('Database');
INSERT INTO lessons (course_id, title, position)
VALUES (currval('courses_id_seq'), 'SQL入門', 1);
COMMIT;
途中で失敗した場合はROLLBACKします。具体的なID取得方法はDBMSにより異なるため、上記構文を別DBへそのまま移植できるとは限りません。
7. backupはrestoreできて初めて有効
backup jobの成功だけでなく、別環境へrestoreし、件数や整合性を確認します。schema migration、application version、restore手順を一緒に管理します。
演習: 学習進捗schema
user、course、lesson、completionを表すschemaを設計してください。
- 各tableのprimary key
- relationshipとforeign key
- 必須column
- 重複完了を防ぐconstraint
- user別の完了lesson一覧を返すJOIN
- course削除時の扱い
理解チェック
- databaseとDBMSを区別できる
- entityとrelationshipからtableを作れる
- 更新前に対象rowを確認できる
- parameter bindingとtransactionの目的を説明できる
公式資料
次に読む
SQL実践でJOIN、集約、subqueryへ進みます。