SQL の基本
informationdatabaseundergraduatelecture
data/lecture/information/database/database-basics.lecture.n.md
1導入
この講義では、関係データベースに対する問い合わせと更新を宣言的に記述する SQL の基本を説明する。前講義で導入した表、行、列、主キー、外部キーを、SQL の構文と対応させる。
SQL は、データへ到達する手順ではなく、必要な結果の条件を記述する。索引の利用や結合順序などの実行計画は、通常、データベース管理システムが決定する。この宣言性により、論理的な問い合わせと物理的な実行方法を分離できる。
2SELECT、FROM、WHERE
基本的な問い合わせは、SELECT、FROM、WHERE の三要素から構成される。
FROM は、問い合わせの対象となる表を指定する。
WHERE は、各行を条件式によって選択する。この操作を選択またはフィルタリングという。
SELECT は、結果に含める列または式を指定し、概ね射影に対応する。ただし、SQLは既定で重複行を保持し、SELECT DISTINCTを指定した場合に重複を除去する。これは関係代数の集合としての射影との相違である。
論理的には FROM で対象を定め、WHERE で行を選択し、SELECT で列を射影すると解釈できる。これは概念上の役割であり、データベース管理システムがこの順序で物理的に処理するとは限らない。
SELECT student_id, name
FROM students
WHERE department = 'Computer Science';
この問い合わせは、students 表から所属が Computer Science である行を選択し、その student_id と name を結果列として指定する。重複行はDISTINCTを指定しない限り保持される。
3結果の順序
SQL の問い合わせ結果には、ORDER BY を指定しない限り順序の保証がない。同一の問い合わせでも、実行計画やデータの配置によって表示順が変化し得る。
SELECT student_id, name
FROM students
ORDER BY student_id ASC;
再現可能な順序が必要な場合は、同順位を解消できる列まで ORDER BY に指定する。
4NULL と三値論理
NULL は、値が存在しない、または不明であることを表す標識であり、空文字列や数値の 0 ではない。NULL を含む通常の比較は、TRUE または FALSE ではなく UNKNOWN となる。SQL の条件式は、この三値論理に従う。
WHERE が結果に残すのは、条件式が TRUE となる行だけである。FALSE と UNKNOWN の行は除外される。したがって、NULL の検査には = NULL ではなく IS NULL または IS NOT NULL を使用する。
SELECT student_id, name
FROM students
WHERE email IS NULL;
5JOIN とキー
別々の表に格納された関連データは、JOIN によって結合できる。例として、students.student_id を主キー、enrollments.student_id をそれを参照する外部キーとする。
SELECT s.student_id, s.name, e.course_id
FROM students AS s
JOIN enrollments AS e
ON e.student_id = s.student_id
WHERE e.status = 'enrolled';
ON は二つの表の行を対応させる結合条件を指定する。主キーの一意性と外部キーの参照整合性により、この対応関係をデータベース側で検証できる。ただし、JOIN 自体は外部キーが宣言されていなくても実行可能である。
6更新、制約、トランザクション
SQL は、INSERT で行を追加し、UPDATE で既存行を変更し、DELETE で行を削除する。
INSERT INTO enrollments (student_id, course_id, status)
VALUES (1001, 'CS101', 'enrolled');
UPDATE enrollments
SET status = 'completed'
WHERE student_id = 1001 AND course_id = 'CS101';
DELETE FROM enrollments
WHERE student_id = 1001 AND course_id = 'CS101';
PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK などの制約は、許容されるデータの条件をスキーマに記録し、不正な更新を拒否する。ただし、制約の具体的な機能や構文にはデータベース製品による差異がある。
複数の文を一体の処理として扱う場合は、トランザクションを使用する。COMMIT はトランザクションの変更を確定し、ROLLBACK は未確定の変更を取消す。これにより、処理の途中だけが反映された状態を回避できる。ただし、トランザクションの分離レベルや自動確定の既定値は実装によって異なる。
7パラメータ化と安全性
利用者の入力を SQL 文字列へ直接連結すると、入力が SQL の構文として解釈される SQL インジェクションを招き得る。値は、使用するドライバが提供するパラメータ化された問い合わせへ別途渡す。
SELECT student_id, name
FROM students
WHERE email = ?;
? はパラメータの概念例であり、実際のプレースホルダ構文はドライバやデータベース製品によって異なる。パラメータ化は値と SQL 構文を分離するが、表名や列名などの識別子を任意に安全化するものではない。識別子を動的に選択する場合は、許可リストによる検証などが必要である。また、認可、最小権限、機密情報の保護も別途必要となる。
8要点
- SQL は、必要な結果を宣言し、その物理的な実行方法をデータベース管理システムへ委ねる。
WHERE は行を選択し、SELECT は結果の列や式を指定する。SQLは既定で重複行を保持する。NULL を含む条件には三値論理が適用される。
JOIN は複数の表を関連付け、キーと制約はデータの整合性を支える。
- 更新はトランザクションによって一体として管理でき、外部入力はパラメータ化して SQL 構文から分離する。
ORDER BY のない結果に順序の保証はない。
9次に進む講義
data/lecture/information/software-engineering/software-engineering-portal.lecture.n.md