勉強に使用したテキスト
下記の書籍一冊だけでOKです。この書籍は毎年改定されており、書籍を購入すると過去問とその解説もpdfでダウンロードできます。
勉強の方法
勉強は下記の流れで行いました。
- 前述の書籍をざっと読む
- 書籍にある午後1、午後2の問題を解いて、解説をじっくり読む
- 書籍にある、おすすめの午後2過去問を印刷して解く(一回あたり、問題を解くのに2時間と、解説を読むのに1時間ちょっとかかる。毎週3セット解く)
- ダウンロードできる午前2の問題を全部印刷して解く
間違えたところ
勉強していて間違えたところ、記憶が曖昧なところについて順次メモを取っていきます。
自分の場合、下記のあたりでした。
SQL
射影 (projection)
特定の列のみ取得すること。 select句の後に書かれる列の一覧
e.g. select user_id, user_name from users
の、user_id, user_name
関係代数の式で表すと、users [user_id, user_name]
になる。(午前の問題で、この表記で書かれることがある)
選択 (selection)
-
選択は、制限(restriction)とよばれることもある。
-
特定の行のみを取得すること。where句でで指定する。
- e.g.
select * from users where user_id = 1
の、user_id = 1
- e.g.
- 関係代数の式で表すと、
users [users = 1]
になる。=
などの演算式の一覧は、θと呼ばれることがある。- θを構成する要素は、"<、≤、=、>、≥、<>"など。
selectで使える式、演算子
- 文字列結合
department_name || ' ' || user_name
で、文字列結合できる
- nullのときのデフォルト値(nvl, if_null的なもの)
coalesce(sum(amount), 0)
3値理論
- 3値理論とは、真偽値を"true, false, unknown"の2つで表すもの
- unknownを含む式はunkownになる
- e.g.
a=1, b=null
で、a=b
は、falseではなく、unknownになる
- e.g.
between
- between A and Bの範囲指定は、境界値を含む。"<=", ">="で比較しているのと同じ。
集合演算
-
SQLで、和集合、積集合、差集合を求めるには、
UNION
,INTERSECT
,EXCEPT
を使う。- INTERSECTは特に忘れがち
-
SQLで差集合の演算はEXCEPTとEXCEPT ALLがある。前者は重複を排除する。
- UNION/UNION ALLと同じ関係
- INTERSECT, INTERSECT ALLもある
関数・変数
- 現在時刻を意味する
current_date
は標準SQLで規定されている
SQL以外
-
関係スキーマの空欄埋めで、主キーかつ外部キーの場合は、下線に実線を引く。
- 破線ではない
- このことは、問題文の最初に注意として明記されている
- 過去問を見る感じでは毎回同じ指示なので、本番のときも同じ指示になっているかだけ、さっと見ておく。
-
関係スキーマの空欄埋めで、1つの空欄の中には複数の属性(カラム)を記入することができる場合がある(時による)。
- 初めて過去問を解いたときに勘違いしていた。
-
サブタイプのテーブルを外部キーに持ってくるとき、属性名は一般的に”テーブル名 + キー名"
- e.g. 関係:生産工場の、属性:拠点ルートだったら、これを外部キーに持つ場合”生産工場拠点ルート”の属性名になる。
-
サブタイプの属性の空欄を埋めるとき、スーパータイプの主キーはそのまま持ってくる(下線も同じように引く)
-
列定義に点線を引いたら、そのタイミングでリレーションシップの線も確認する
-
データの格納長で、NULLの取り扱いは、本当に注意する!!
- NOT NULL=Nのほうが1byte多い!!!
- 頭ではわかっていても、なぜか!!、うっかり間違える!!!
-
DBの可逆暗号化は、
DBアクセス権
、複合関数
と鍵
が盗まれると、セキュリティ侵害が発生する。 -
記述式回答の範囲を答える場合で、
以前
と以後
はイコールを含み、より前
とより後
はイコールを含まないことに注意。 -
E-R図
- 強エンティティと弱エンティティ
- 親子関係のテーブルなどで、以下の関係になることがある。
- 親は子テーブルがなくても存在できる。
- 子は親テーブルの存在が必須。
- この場合、親テーブルに相当するものを
強エンティティ
、子に相当するものを弱エンティティ
と呼ぶ。
- 親子関係のテーブルなどで、以下の関係になることがある。
- 強エンティティと弱エンティティ
-
アンリピータブルリードは読んだデータを再検索したときのデータ不一致、ファントムリードはなかったデータを再度selectしたときに2回目のselectで見つけたこと。
-
ロールフォワード
- ロールフォワードは、チェックポイント後にコミットされたトランザクションを適用させること。
- チェックポイント前のものは、ロールフォワードしなくても復帰できることに注意。
- この文脈における
コミット
とは、ディスクに書き込まれてロールフォワードできる対象に含まれるという意味。
-
候補キーと極小
- 候補キー: 行を一意に特定できる属性の組で極小のもの
- 極小:一意に特定する上で無駄な属性を含まない属性の組
-
三層スキーマは、外部、概念、内部の順番
- 外部:ユーザから見たデータ (e.g.: view)
- 概念:現実世界のデータ全体 (e.g.: table)
- 内部:コンピュータに実装するスキーマ (e.g.: VSAM, ISAM, InnoDB)
-
外部スキーマは、サブスキーマとも呼ばれる
-
CREATE DOMAINで属性のドメインを定義できる
- ちなみに、MySQLはCREATE DOMAINの構文をサポートしていない
-
共有ロック、専有ロック
- 共有ロック同士のみ共存可能。
- 共有ロックが掛かっている行に専有ロックをかけることはできない。
-
二層ロック
- ロックを2段階に分ける。必要資源にロックだけかけていくフェーズと、処理後にロックを解除だけしていくフェーズ。
- アンロック後に再度ロックをかけることは許されない。
- この方式でも、共有ロック、専用ロックの概念はある。
- この方式でも、デッドロックの発生はありうる。
- 処理のシリアライズが解消したい問題の論点。
-
分散データベース
- 分散データベースでデッドロックが発生しないのは、時刻印方式と楽観的方式
-
デッドロックの検出方法として、
待ちグラフ
がある。 -
Apache Spark
- Apache Sparkは、RDD(Resilient Distributed Datasets)というデータ集合に対して演算を行う
-
SQLの穴埋めで、”この空欄に何も入らなそう...”と思ったらdistinctを疑う
-
午後の問題文で下記の表記は、どちらも”発注明細に対して列を追加せよ”という指示
- 生産の対象とした発注明細に対して、生産番号を記録する。
- 配送の対象とした発注明細に対して、配送番号を記録する。
要確認
-
正規化による情報の喪失
- 第三正規形からボイスコッド正規形にするときに、関数従属性を実装するテーブルが失われることがある。
-
第三正規形では、候補キーの真部分集合から、別の候補キーへの真部分集合への関数従属がありえる
-
viewを作ったあとで、viewが参照しているテーブルをdropできるか否か
2021年秋試験を受けた結果
2021/10/10追記
2021年の秋にデータベーススペシャリストの試験を受けました。
午前だけ回答が公開されたので、自己採点の結果を書いておきます。
午前1
点数: 25 / 30 = 83点
間違えた問題番号: 7, 16, 19, 25, 26
午前2
点数: 23 / 25 = 95点
間違えた問題番号: 6, 18