茨の道も一歩から

インフラ構築からプログラミング(Python・JavaScript)までITに関するブログです。

データベース:午後Ⅰ対策のポイント

■正規形の根拠

(第1正規形)

  • 候補キーの一部に非キー属性が関数従属する部分関数従属性があるため。
  • 候補キーに非キー属性が完全関数従属していないため。

(第2正規形)

  • すべての属性値が単一値で候補キーからの部分関数従属性はないが、推移的関数従属性があるため。
  • すべての属性値が単一値で非キー属性は候補キーに完全関数従属性しているが、推移的関数従属性があるため。

(第3正規形)

  • すべての属性値が単一値で候補キーからの部分関数従属性はなく、推移的関数従属性もないため。
  • すべての属性値が単一値で非キー属性は候補キーに完全関数従属性し、推移的関数従属性もないため。

■正規形の不都合

第1正規形:部分関数従属(顧客番号→顧客名)がある場合

[予約]

予約日(PK) 顧客番号(PK) 顧客名
080113 C001 大阪一太郎
080113 C002 東京花子
080114 C001 大阪一太郎

第2正規形:推移的関数従属(予約番号→顧客番号→顧客名)がある場合

[予約]

予約番号(PK) 顧客番号 顧客名
1 C001 大阪一太郎
2 C002 東京花子
3 C001 大阪一太郎

第3正規形:不都合は起こらない

[予約]

予約番号(PK) 顧客番号(FK)
1 C001
2 C002
3 C001

[顧客]

顧客番号(PK) 顧客名
C001 大阪一太郎
C002 東京花子

(登録時)

事前に顧客情報を登録出来ない。

  • 九州三四郎を予約前に登録しようとしても主キー制約(NULL不可)のため登録出来ない。

繰り返し登録する必要がある。

  • 顧客名を何度も登録する必要がある。

(更新時)

該当するタプルをすべて更新する必要がある。

  • 大阪一太郎が改名した場合、複数タプルの顧客名を更新する必要がある。

(削除時)

1行しかないデータを削除すると、部分(推移的)関数従属している非キー属性値も消えてしまう。

  • 東京花子が予約を取り消した場合、東京花子の顧客情報が消えてしまう。  

SQLの注意点

  • SELECT句に指定出来るのは、GROUP BY句に指定した列名か集合関数のみである。
  • グループ化前に条件を指定する場合は、WHERE句を使用する。
  • WHERE句には、集合関数を指定出来ない。
  • グループ化後に条件を指定する場合は、HAVING句を使用する。
  • HAVING句には、集合関数を指定出来る。
  • ORDER BY句には、集合関数は指定出来ないので、列番号を指定する。
  • ORDER BY句で並び替え順を省略した場合は、昇順(ASC)が設定される。
  • INSERT~VALUES文は、1行ずつデータを追加する。
  • INSERT~SELECT文は、複数行を1度に追加することが出来る。
  • DELETE文のWHERE句に条件を指定しないと、すべてのデータが削除される。  

■ビューの更新可能条件

以下が使用されているビューは更新・追加・削除の操作が出来ない。

  • DISTINCT
  • GROUP BY
  • FROM句に2つ以上のテーブルを指定(結合)
  • 集合関数
  • 相関副問合せ

目次へ戻る