データベース:午後Ⅰ対策のポイント
■正規形の根拠
(第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つ以上のテーブルを指定(結合)
- 集合関数
- 相関副問合せ