Open22
データベーススペシャリスト学習メモ
やること
- 令和6年秋期のIPAデータベーススペシャリスト試験を受験するために、学習メモをまとめる
- 本はこれ
- 方針
- 参考書をざっとよむ。わからない部分や大事そうなぶぶんをめもる
- 過去問解きまくる
正規化
目的
- レコード更新時におこる、更新時の異常を未然に防ぐ
- 更新時異常を排除するために、正規化をおこなう
- 更新=「レコード挿入、レコード削除、レコード更新、」
メリット
-
「一カ所一事実」=「1 fact 1 place」
- 更新箇所が一つだけになる(複数を参照して更新する必要がない)
- 一つになるのでデータ不整合が起きづらい
- 正規化してもとの情報を失ってはいけない
- 自然結合できること = 複数のテーブルを結合
- 情報無損失分解 = 自然結合したときに情報元の情報が失われないこと
データベース設計
SQL
SQL3種類
- データ定義言語:SQL-DDL(SQL Data Difinition Language)
- データベースを定義する言語
- テーブル、ビュー、インデックスなど定義
- データベースを定義する言語
- データ制御言語:SQL-DCL(SQL Data Control Language)
- データベース制御の言語
- トランザクションの開始や終了、アクセス権の制御
- データ操作言語:SQL-DML(SQL Data Manipulation Language)
- データベース操作の言語
- データの参照、追加、更新、削除
テーブル作成
- 制約
- 主キー制約
- PRIMARY KEY
- 参照制約(外部キー制約)
- REFERENCES テーブル名 (列名)
- 非ナル制約
- NOT NULL
- 一意制約
- UNIQUE
- 範囲制約
- CHECK(範囲の条件)
- 主キー制約
ビュー
- ビューは仮想的なテーブル
- ビュー自体はデータは持たない
- ビューが参照されるたびに、SELECT文の問い合わせを実行して実テーブルから取得
- 文法
CREATE VIEW ビュー名 AS (SELECT文)
例:社員テーブルからソフトウェア部の社員を取得するビュー
CREATE VIEW ソフトウェア部 (社員番号, 社員名) AS
(SELECT 社員番号, 社員名 FROM 社員 WHERE 所属 = 'ソフトウェア部')
ビュー使い方
SELECT * FROM ソフトウェア部
インデックス
- テーブルのデータを効率よく検索するための索引
- 辞書の見出しみたいなやつ
- いわゆる「インデックスを張る」とSELECTやUPDATEなどのDMLの操作が効率的になる
- 文法
CREATE INDEX インデックス名 ON テーブル名(列名)
カーソル
- テーブルから一度に一行ずつレコードの操作を行える
- SQLだと集合処理なので、一度に複数行のレコードが検索可能
- 一方で、これがカーソルだと一行ずつできる
- カーソル自体は一時的に利用するものなので、宣言的な構文
- 文法
DECLARE カーソル名 CURSOR FOR SELECT文
権限付与
- テーブルに対するSQLの利用者へ権限を与える
- 文法
GRANT 権限 ON テーブル名 TO 利用者
SELECT
- 複数行で全く同じ内容となった場合、レコードを一つにまとめる
SELCT DISTINCT 表示するカラムリスト FROM テーブル名
テーブル結合
- 内部結合
INNER JOIN
- 左外部結合
LEFT OUTER JOIN
- 外部結合のデフォルトは、左
- 右外部結合
RIGHT OUTER JOIN
- 完全外部結合
FULL OUTER JOIN
- 直積
CROSS JOIN
WHERE
- EXSIST検査
- 副問い合わせ(入れ子のSQL)で使う
- データが一行でも存在する(EXSISTS)、存在しない(NOT EXSISTS)
- 例:
EXSISTS (SELECT * FROM 社員)
GROUP BY
- 集約関数を使って問い合わせするときに指定
- キーとなる列、もしくは、列の組を指定。キーの値ごとにグループ化できる
HAVING
- GROUP BYの結果に検索条件をつける
UPDATE
- レコード追加
- 文法
INSERT テーブル名 (列名) VALUES (値)
UPDATE
- レコード更新
- 文法
UPDATE テーブル名 SET 列名 = 値 WHERE 検索条件
DELETE
- テーブルからレコード削除
- 検索条件を指定しないとテーブルからレコード全削除
- 文法
DELETE FROM テーブル名 WHERE 検索条件
隔離性水準
- トランザクションに指定できる直列化制約(トランザクションを同時実行したことで発生する異常のうち、どのレベルまでを許容するか)の度合い
- 隔離性の低い順に「READ UNCOMMITTED」「READ COMMITTED」「REPEATABLE READ」「SERIALIZABLE」の4種類
- SERIALIZABLEが最も安全。だが、効率性とトレードオフ
- READ COMMITTEDが、一般的にデフォルト
トランザクションの同時実行が原因で生じる異常
- ダーティリード(汚読)
- 他のトランザクションが更新したコミット前の値(ダーティデータ)を読み、その後更新処理を行ったトランザクションがロールバックされると、存在しない値を読み込んだことになってしま
- ノンリピータブルリード(再現不可能な読み)
- 同じトランザクションで複数回の読込みを行ったとき、読込む度に値が変わってしまう
- 2回の読込みの間に、別のトランザクションがそのデータを更新したことが原因
- ファントムリード(幽霊)
- 同じトランザクションで複数回の読込みを行ったとき、前回は存在しなかった行が現れる
- 2回の読込みの間に、別のトランザクションがテーブルに行を挿入したことが原因