Open22

データベーススペシャリスト学習メモ

drumnistnakanodrumnistnakano

正規化

drumnistnakanodrumnistnakano

目的

  • レコード更新時におこる、更新時の異常を未然に防ぐ
  • 更新時異常を排除するために、正規化をおこなう
  • 更新=「レコード挿入、レコード削除、レコード更新、」
drumnistnakanodrumnistnakano

メリット

  • 「一カ所一事実」=「1 fact 1 place」
    • 更新箇所が一つだけになる(複数を参照して更新する必要がない)
    • 一つになるのでデータ不整合が起きづらい
drumnistnakanodrumnistnakano
  • 正規化してもとの情報を失ってはいけない
    • 自然結合できること = 複数のテーブルを結合
    • 情報無損失分解 = 自然結合したときに情報元の情報が失われないこと
drumnistnakanodrumnistnakano

SQL

drumnistnakanodrumnistnakano

SQL3種類

  • データ定義言語:SQL-DDL(SQL Data Difinition Language)
    • データベースを定義する言語
      • テーブル、ビュー、インデックスなど定義
  • データ制御言語:SQL-DCL(SQL Data Control Language)
    • データベース制御の言語
    • トランザクションの開始や終了、アクセス権の制御
  • データ操作言語:SQL-DML(SQL Data Manipulation Language)
    • データベース操作の言語
    • データの参照、追加、更新、削除
drumnistnakanodrumnistnakano

テーブル作成

  • 制約
    • 主キー制約
      • PRIMARY KEY
    • 参照制約(外部キー制約)
      • REFERENCES テーブル名 (列名)
    • 非ナル制約
      • NOT NULL
    • 一意制約
      • UNIQUE
    • 範囲制約
      • CHECK(範囲の条件)
drumnistnakanodrumnistnakano

ビュー

  • ビューは仮想的なテーブル
    • ビュー自体はデータは持たない
    • ビューが参照されるたびに、SELECT文の問い合わせを実行して実テーブルから取得
  • 文法
    • CREATE VIEW ビュー名 AS (SELECT文)

例:社員テーブルからソフトウェア部の社員を取得するビュー

CREATE VIEW ソフトウェア部 (社員番号, 社員名) AS
    (SELECT 社員番号, 社員名 FROM 社員 WHERE 所属 = 'ソフトウェア部')

ビュー使い方

SELECT * FROM ソフトウェア部
drumnistnakanodrumnistnakano

インデックス

  • テーブルのデータを効率よく検索するための索引
    • 辞書の見出しみたいなやつ
  • いわゆる「インデックスを張る」とSELECTやUPDATEなどのDMLの操作が効率的になる
  • 文法
    • CREATE INDEX インデックス名 ON テーブル名(列名)
drumnistnakanodrumnistnakano

カーソル

  • テーブルから一度に一行ずつレコードの操作を行える
    • SQLだと集合処理なので、一度に複数行のレコードが検索可能
    • 一方で、これがカーソルだと一行ずつできる
    • カーソル自体は一時的に利用するものなので、宣言的な構文
  • 文法
    • DECLARE カーソル名 CURSOR FOR SELECT文
drumnistnakanodrumnistnakano

権限付与

  • テーブルに対するSQLの利用者へ権限を与える
  • 文法
    • GRANT 権限 ON テーブル名 TO 利用者
drumnistnakanodrumnistnakano

SELECT

  • 複数行で全く同じ内容となった場合、レコードを一つにまとめる
    • SELCT DISTINCT 表示するカラムリスト FROM テーブル名
drumnistnakanodrumnistnakano

テーブル結合

  • 内部結合
    • INNER JOIN
  • 左外部結合
    • LEFT OUTER JOIN
    • 外部結合のデフォルトは、左
  • 右外部結合
    • RIGHT OUTER JOIN
  • 完全外部結合
    • FULL OUTER JOIN
  • 直積
    • CROSS JOIN
drumnistnakanodrumnistnakano

WHERE

  • EXSIST検査
    • 副問い合わせ(入れ子のSQL)で使う
    • データが一行でも存在する(EXSISTS)、存在しない(NOT EXSISTS)
    • 例:EXSISTS (SELECT * FROM 社員)
drumnistnakanodrumnistnakano

GROUP BY

  • 集約関数を使って問い合わせするときに指定
  • キーとなる列、もしくは、列の組を指定。キーの値ごとにグループ化できる
drumnistnakanodrumnistnakano

DELETE

  • テーブルからレコード削除
  • 検索条件を指定しないとテーブルからレコード全削除
  • 文法
    • DELETE FROM テーブル名 WHERE 検索条件
drumnistnakanodrumnistnakano

隔離性水準

  • トランザクションに指定できる直列化制約(トランザクションを同時実行したことで発生する異常のうち、どのレベルまでを許容するか)の度合い
  • 隔離性の低い順に「READ UNCOMMITTED」「READ COMMITTED」「REPEATABLE READ」「SERIALIZABLE」の4種類
  • SERIALIZABLEが最も安全。だが、効率性とトレードオフ
  • READ COMMITTEDが、一般的にデフォルト

トランザクションの同時実行が原因で生じる異常

  • ダーティリード(汚読)
    • 他のトランザクションが更新したコミット前の値(ダーティデータ)を読み、その後更新処理を行ったトランザクションがロールバックされると、存在しない値を読み込んだことになってしま
  • ノンリピータブルリード(再現不可能な読み)
    • 同じトランザクションで複数回の読込みを行ったとき、読込む度に値が変わってしまう
    • 2回の読込みの間に、別のトランザクションがそのデータを更新したことが原因
  • ファントムリード(幽霊)
    • 同じトランザクションで複数回の読込みを行ったとき、前回は存在しなかった行が現れる
    • 2回の読込みの間に、別のトランザクションがテーブルに行を挿入したことが原因