留学生りゅうがくせいのためのデータベース・SQL入門にゅうもん 付録ふろく

練習問題れんしゅうもんだいの答こたえと理由りゆう

Practice Questions: Answers and Notes

本ほんの各章かくしょうの最後さいごにある「答こたえと理由りゆう」と同おなじ内容ないようです。

第だい1章しょう:データを使つかう仕事しごととデータベース

自己じこチェック

1節せつ

  1. AはIT、Bは情報じょうほう、Cは未記入みきにゅうです。
  2. 後あとの時刻じこくの値あたいが正ただしいとは限かぎらず、変更理由へんこうりゆうなどを確たしかめる必要ひつようがあるからです。
  3. 基準きじゅんの情報じょうほうと変更手順へんこうてじゅんを明確めいかくにできるからです。

2節せつ

  1. 計算けいさん、並ならべ替かえ、グラフ作成さくせいなどです。
  2. 共有機能きょうゆうきのうを持もつ製品せいひんがあります。
  3. 利用者りようしゃ、更新こうしん、制約せいやく、検索けんさく、アクセス管理かんり、運用うんようなどです。

3節せつ

  1. 表ひょうの定義ていぎ、検索けんさく、追加ついか・更新こうしん・削除さくじょ、設定せっていに応おうじたアクセス制御せいぎょなどです。
  2. 一ひとつの履修登録りしゅうとうろくです。
  3. 履修表りしゅうひょうの二行にぎょうで、学生がくせいID S02に結むすびついています。

4節せつ

  1. 同時更新どうじこうしんの有無うむ、重複防止ちょうふくぼうし、必要ひつような出力しゅつりょくなどです。
  2. 必かならずとは言いえません。同おなじ人数にんずうでも更新方法こうしんほうほうや制約せいやくが異ことなるからです。
  3. 必要ひつような一覧いちらんが出でるか、誤あやまったIDを防ふせげるか、担当者たんとうしゃが操作そうさできるかを試ためします。

確認問題かくにんもんだい

Q1 正答せいとうはBです。利用者りようしゃ、更新方法こうしんほうほう、重複ちょうふくを防ふせぐ条件じょうけんを確たしかめ、必要ひつように合あう方式ほうしきを比くらべます。Aは複数ふくすうの正本せいほんを残のこすため、食くい違ちがいが続つづきます。Cは共有機能きょうゆうきのうがあっても、重複ちょうふくを防ふせぐ条件じょうけんを確認かくにんせず方式ほうしきを決きめています。DはID順じゅんの一覧いちらんだけで方式ほうしきを決きめ、更新こうしんや制約せいやくを比くらべていません。

Q2 正答せいとうはDです。DBMSはデータベースの構造こうぞうやデータを定義ていぎ・操作そうさ・制御せいぎょするソフトウェアです。Aは役割やくわりを並ならべ替かえだけに限定げんていしています。Bは全利用者ぜんりようしゃにすべてのデータを公開こうかいするとしていますが、そのような公開こうかいはDBMSの定義ていぎではありません。CはDBMSの役割やくわりを共有きょうゆうとアクセス権けんだけに限かぎり、構造こうぞうやデータの定義ていぎ・操作そうさを含ふくめていません。

練習れんしゅう

練習れんしゅう1の正答せいとうはBです。小ちいさな表ひょうの計算けいさんやグラフ作成さくせいには表計算ひょうけいさんが使つかいやすい場合ばあいがあります。Aは関係かんけいデータベースが表ひょうでデータを扱あつかうことを否定ひていしているため誤あやまりです。Cは一人ひとりなら制約せいやくが不要ふようと決きめつけています。Dは共有機能きょうゆうきのうがあってもID重複ちょうふくを防ふせぐ条件じょうけんが不要ふようとは限かぎりません。

練習れんしゅう2の例れい:表計算ひょうけいさんは小規模しょうきぼな集計しゅうけいやグラフ作成さくせい、DBMSは複数担当ふくすうたんとうの制約せいやく付つき台帳だいちょうなどが候補こうほです。理由りゆうを二ふたつずつ要件ようけんと結むすびつけます。

練習れんしゅう3の例れい:構造こうぞう・制約せいやくの定義ていぎ、検索けんさくや更新こうしんの管理かんりなどから二ふたつ説明せつめいできればよいでしょう。

練習れんしゅう4は、方式ほうしきを二ふたつの要件ようけんに結むすび付つけていればよいでしょう。

考かんがえよう

  1. 学生がくせいIDで対象たいしょうを確たしかめ、更新時刻こうしんじこくと担当者たんとうしゃを見みます。その後ご、担当者たんとうしゃに変更理由へんこうりゆうを確認かくにんし、基準きじゅんとなる情報じょうほうを決きめます。学生がくせいIDだけ、または時刻じこくだけで正ただしい値あたいが必かならず決きまるわけではありません。

  2. 同おなじ行ぎょうを同時どうじに直なおす可能性かのうせい、重複ちょうふくを防ふせぐ方法ほうほう、変更履歴へんこうりれきの必要ひつよう、更新こうしんできる人ひとを確認かくにんします。二ふたつ挙あげて、なぜ必要ひつようかを説明せつめいできればよいです。

グループで話はなそう

一ひとつだけの正解せいかいはありません。利用者りようしゃ・更新こうしん・制約せいやく・出力しゅつりょく・運用うんようの条件じょうけんを挙あげ、その条件じょうけんと選えらんだ候補こうほの関係かんけいを説明せつめいできるかを確たしかめます。

第だい2章しょう:表ひょう・行ぎょう・列れつ・キー

自己じこチェック

1節せつ

  1. 学生一人がくせいひとりを表あらわします。
  2. 学生一人がくせいひとりの授業登録じゅぎょうとうろく一ひとつを表あらわします。
  3. 同おなじ表ひょうの行ぎょうを同おなじ基準きじゅんで読よみ、各行かくぎょうに必要ひつような列れつやキーを選えらびやすくなります。

2節せつ

  1. name列れつです。
  2. 所属しょぞくです。
  3. student_idは文字もじとして、creditsは整数せいすうとして扱あつかいます。

3節せつ

  1. 表ひょうの各行かくぎょうを一意いちいに識別しきべつするために使つかいます。
  2. student_idはstudents、course_idはcoursesを参照さんしょうします。
  3. student_idとcourse_idの組くみの重複ちょうふくを防ふせぐ条件じょうけんです。

4節せつ

  1. 値あたいが存在そんざいしない、または分わからないことです。
  2. 数値すうちのゼロです。
  3. NULLは未採点みさいてんを示しめすため、0点てんと区別くべつする必要ひつようがあります。

確認問題かくにんもんだい

Q1 正答せいとうはDです。未採点みさいてんにはNULL、採点さいてんした結果けっかが0点てんなら数値すうちの0を使つかいます。Aは二ふたつを同おなじ値あたいにするため区別くべつできません。Bは文字列もじれつの空文字そらもじを数値列すうちれつに使つかい、点数てんすうの意味いみを表あらわしません。Cは未採点みさいてんと0点てんを反対はんたいにしています。

Q2 正答せいとうはBです。Aでは同おなじ学生がくせいの複数授業ふくすうじゅぎょうを別々べつべつに識別しきべつしにくくなります。Cは名前なまえや授業名じゅぎょうめいが重かさなる場合ばあいや変更時へんこうじに関係かんけいを追おいにくくします。Dには授業じゅぎょうを示しめすIDがなく、どの授業じゅぎょうへの登録とうろくかが分わかりません。

練習れんしゅう

  1. studentsは学生一人がくせいひとり、coursesは授業一じゅぎょうひとつ、enrollmentsは学生一人がくせいひとりの授業登録じゅぎょうとうろく一ひとつです。一行いちぎょうの意味いみを決きめると、表ひょうごとに何なにを記録きろくするかが定さだまり、同おなじ学生がくせいが複数ふくすうの授業じゅぎょうを取とることも履修表りしゅうひょうの複数行ふくすうぎょうで表あらわせます。
  2. 主しゅキーはstudents.student_id、外部がいぶキーはenrollments.student_idです。IDで同名どうめいの学生がくせいを区別くべつし、履修表りしゅうひょうから学生表がくせいひょうを参照さんしょうできます。履修表りしゅうひょうにはcoursesを参照さんしょうするcourse_idも置おきます。
  3. NULLを未採点みさいてん、0を0点てん、空文字そらもじを空そらのメモに対応たいおうさせます。NULLは値あたいがない、または分わからないことを示しめし、0は数値すうち、空文字そらもじは文字列もじれつです。

考かんがえよう・グループで話はなそう

考かんがえよう1の例れい:学生表がくせいひょうと履修表りしゅうひょうの両方りょうほうに所属しょぞくを保存ほぞんすると、変更後へんこうごに片方かたほうだけ直なおして値あたいが食くい違ちがう可能性かのうせいがあります。学生表がくせいひょうに所属しょぞくを置おき、履修表りしゅうひょうからIDで参照さんしょうします。

考かんがえよう2の例れい:enrollment_idは登録とうろくID、student_idとcourse_idは学生がくせい・授業じゅぎょうのIDです。

グループで話はなそうに一ひとつの正解せいかいはありません。一行いちぎょうの意味いみ、キー、NULLを許ゆるす列れつを例れいと結むすびつけて説明せつめいできるかを確たしかめます。

ワークシート

studentsは一行いちぎょうが一人ひとり、主しゅキーはstudent_id、外部がいぶキーはありません。programのNULLは要件ようけんで判断はんだんします。enrollmentsは一行いちぎょうが一登録いちとうろくです。主しゅキーはenrollment_id、外部がいぶキーはstudent_idとcourse_idです。scoreは採点前さいてんまえにNULLを許ゆるし、0点てんと区別くべつします。

第だい3章しょう:SELECTで取とり出だす

自己じこチェック

1節せつ

  1. student_id, nameです。
  2. 学生表がくせいひょうから取とり出だす指定していです。
  3. student_idです。同名どうめいの行ぎょうをID順じゅんにできます。

2節せつ

  1. WHEREです。
  2. SQLに?を書かき、値あたいを別べつの引数ひきすうで渡わたします。
  3. nameは名前なまえの列れつで、所属しょぞくはprogramだからです。

3節せつ

  1. course_idを加くわえます。
  2. 返かえす行数ぎょうすうです。
  3. ORDER BYです。LIMITは行数ぎょうすうを制限せいげんします。

4節せつ

  1. 列れつはstudent_id, name、表ひょうはstudentsです。
  2. program = ?にし、値あたいITを別べつに渡わたします。
  3. 列名れつめい、値あたい、順序じゅんじょ、行数ぎょうすうを比くらべます。

確認問題かくにんもんだい

Q1 正答せいとうはAです。SELECTで列れつを選えらび、ORDER BYで順じゅんを指定していします。Bは全列ぜんれつを含ふくみ、Cは所属しょぞくを出だします。Dは名前なまえが先さきの並ならべ方かたで、ID順じゅんという依頼いらいに合あいません。

Q2 正答せいとうはCです。WHEREでITを選えらび、ORDER BYで名前なまえ、次つぎにIDの順じゅんにします。Aはname列れつを調しらべます。BはITの条件じょうけんがなく、5人にんから先頭せんとう4人にんだけを返かえします。DはID順じゅんが先さきで、5人にんから4人にんだけを返かえします。

練習れんしゅう

  1. 列名れつめいはstudent_id,name。行ぎょうはS02・ラジャン、S04・教材用きょうざいようの学生がくせいの順じゅんです。
  2. SELECT course_id, title FROM courses ORDER BY course_id;です。C01・データベース基礎きそ、C02・表計算ひょうけいさん演習えんしゅう、C03・情報倫理じょうほうりんりの順じゅんです。
  3. ORDER BYです。WHEREは条件じょうけんに合あう行ぎょうを選えらびますが、並ならび方かたを指定していしません。

考かんがえよう・グループで話はなそう

考かんがえよう1は、IDも表示ひょうじすると同おなじ名前なまえの行ぎょうを区別くべつしやすくなります。必要ひつような列れつは使つかう目的もくてきに合あわせます。

考かんがえよう2は、先頭せんとう2行ぎょうでも順序じゅんじょを示しめすならORDER BYを使つかいます。上位じょうい2件けんならcreditsの降順こうじゅんと同順位どうじゅんいの副順序ふくじゅんじょを指定していしてからLIMIT 2にします。

グループで話はなそうは、列れつ・条件じょうけん・順じゅん・件数けんすうを分わけ、ORDER BYを先さきに決きめる理由りゆうと値あたいを別べつに渡わたす理由りゆうを説明せつめいできればよいでしょう。

ワークシート

空欄くうらん付つき練習れんしゅうは値あたい("国際ビジネス",)でS01の1行ぎょうです。自力課題じりきかだいはcredits=1を選えらび、C02・表計算ひょうけいさん演習えんしゅうとC03・情報倫理じょうほうりんりをID順じゅんに出だします。列れつ・条件じょうけん・値あたい・順じゅんを確たしかめます。

第だい4章しょう:集計しゅうけい

自己じこチェック

1節せつ

  1. 表ひょうの行数ぎょうすうです。
  2. score列れつに値あたいが入はいっている行ぎょうの数かずです。NULLの行ぎょうは数かぞえません。
  3. 合計ごうけいは251、平均へいきんは約やく83.67です。平均へいきんは251÷3で求もとめます。

2節せつ

  1. いいえ。NULLはこの例れいでは未採点みさいてんです。
  2. scoreに値あたいがある行ぎょうが3行ぎょうだからです。NULLは平均へいきんの対象たいしょうになりません。
  3. 採点数さいてんすうです。平均へいきんの対象件数たいしょうけんすうが分わかります。

3節せつ

  1. course_idの値あたいが同おなじ行ぎょうを一ひとつのグループにまとめます。
  2. 登録数とうろくすうは1、採点数さいてんすうは0です。
  3. C03に点数てんすうがなく、平均へいきんを計算けいさんできないためです。

4節せつ

  1. グループ化かの前まえです。
  2. HAVINGです。
  3. ORDER BYです。

確認問題かくにんもんだい

Q1 正答せいとうはAです。COUNT(*)は履修りしゅう4行ぎょう、COUNT(score)は採点さいてん3件けん、合計ごうけいは251です。BはNULLを採点数さいてんすうに加くわえ、Cは平均へいきんの分母ぶんぼを4としており、Dは履修行りしゅうぎょうを3行ぎょうと数かぞえています。

Q2 正答せいとうはCです。GROUP BYは行ぎょうを授業じゅぎょうごとにまとめ、HAVINGは集計後しゅうけいごに条件じょうけんを満みたすグループを選えらびます。登録数とうろくすう2件以上けんいじょうはC01だけです。Aは集計後しゅうけいごの件数条件けんすうじょうけんをWHEREに置おいています。BのHAVINGは並ならび順じゅんではなく抽出条件ちゅうしゅつじょうけんです。DのLIMITは返かえす行数ぎょうすうの上限じょうげんで、登録件数とうろくけんすうの条件じょうけんではありません。

練習れんしゅう

  1. COUNT(*)は4、COUNT(score)は3、SUM(score)は251です。AVG(score)は83.66666666666667(約やく83.67)です。COUNT(*)は全行ぜんぎょうを数かぞえます。ほかはscoreの値あたいを対象たいしょうにします。
  2. C01は登録とうろく2・採点さいてん2・平均へいきん86.5、C02は登録とうろく1・採点さいてん1・平均へいきん78.0、C03は登録とうろく1・採点さいてん0・平均へいきんNULLです。C03には点数てんすうがないため、0点てんや0という平均へいきんとはしません。
  3. 次つぎのSQLです。結果けっかはcourse_id,n列れつのC01,2です。
SELECT course_id, COUNT(*) AS n
FROM enrollments
GROUP BY course_id
HAVING COUNT(*) >= 2
ORDER BY course_id;

考かんがえよう・グループで話はなそう

  1. 「点数てんすうは4件けん」は誤あやまりです。4は履修表りしゅうひょうの行数ぎょうすうで、scoreに値あたいがある件数けんすうは3です。NULLの行ぎょうを0点てんとして平均へいきんの分母ぶんぼに加くわえることもできません。平均へいきんは251÷3で約やく83.67と報告ほうこくします。
  2. 採点数さいてんすうも示しめすと、平均へいきんの対象件数たいしょうけんすうを確認かくにんできます。

グループの項目こうもくを二ふたつ選えらび、必要ひつような理由りゆうを説明せつめいできればよいでしょう。例れい:「平均へいきんと採点数さいてんすうが必要ひつようです。平均へいきんだけでは対象件数たいしょうけんすうが分わからないからです。」

ワークシート

C03は登録とうろく1・採点さいてん0・合計ごうけいNULL・平均へいきんNULLです。C01は登録とうろく2・採点さいてん2・平均へいきん86.5です。登録数とうろくすうと採点数さいてんすうを区別くべつできれば完成かんせいです。

第だい5章しょう:JOINで表ひょうを結むすぶ

自己じこチェック

1節せつ

  1. 学生がくせいIDと授業じゅぎょうIDです。履修表りしゅうひょうがそれぞれのIDを持もち、学生表がくせいひょう・授業表じゅぎょうひょうの対応たいおうする行ぎょうへつなぎます。
  2. どの列れつの値あたいが一致いっちすると行ぎょうを結むすぶかを指定していします。
  3. 左ひだりのe.student_idは履修表りしゅうひょう、右みぎのs.student_idは学生表がくせいひょうの列れつです。短みじかい表名おもてなで区別くべつしています。

2節せつ

  1. 未履修みりしゅうの学生がくせいには結合条件けつごうじょうけんに合あう履修行りしゅうぎょうがないためです。INNER JOINは一致いっちした組合くみあわせを残のこします。
  2. ラジャンにはE02とE03の二ふたつの履修登録りしゅうとうろくがあります。授業じゅぎょうごとに別べつの行ぎょうとなります。
  3. E04の点数てんすうは未採点みさいてんです。NULLは0点てんを表あらわしていません。

3節せつ

  1. 右側みぎがわの対応行たいおうぎょうがない列れつをNULLで補おぎなった行ぎょうになります。
  2. ONです。学生がくせいを左側ひだりがわに保たもち、C01の登録とうろくだけを右側みぎがわから結むすびます。
  3. WHEREのC01条件じょうけんを満みたす右側みぎがわの値あたいがNULL補完行ほかんぎょうにはありません。そのため、該当がいとうする学生行がくせいぎょうは結果けっかに残のこりません。

4節せつ

  1. COUNT(e.enrollment_id)で右側みぎがわの履修りしゅうIDを数かぞえます。対応たいおうする登録とうろくがない学生がくせいは0件けんです。
  2. 1です。LEFT JOIN後あとに作つくられたNULL補完行ほかんぎょうをCOUNT(*)が数かぞえます。
  3. E02とE03の二ふたつの履修りしゅうIDを数かぞえたためです。

確認問題かくにんもんだい

Q1 正答せいとうはAです。studentsを左側ひだりがわにしてLEFT JOINを使つかうと、履修りしゅうがない学生がくせいもNULL補完行ほかんぎょうとして残のこります。BはINNER JOINを未履修行みりしゅうぎょうも補おぎなう結合けつごうとして説明せつめいしていますが、一致行いっちぎょうだけを残のこします。Cは履修表りしゅうひょうだけから未履修者みりしゅうしゃを作つくれません。Dの説明せつめいはWHERE条件じょうけんの働はたらきと逆ぎゃくです。右表うひょうの条件じょうけんをWHEREに置おくと、NULL補完行ほかんぎょうはその条件じょうけんに合あわず、未履修者みりしゅうしゃは残のこりません。

Q2 正答せいとうはDです。COUNT(enrollment_id)は、履修りしゅうIDのNULLではない値あたいを数かぞえます。履修りしゅうがなければNULL補完行ほかんぎょうのIDは数かぞえられず、0件けんです。AのCOUNT(enrollment_id)はNULLの履修りしゅうIDを数かぞえないため、未履修者みりしゅうしゃは0件けんです。COUNT(*)なら補完行ほかんぎょうを1行ぎょうと数かぞえます。Cは左側ひだりがわのstudent_idを数かぞえるため、未履修者みりしゅうしゃの左側ひだりがわIDも数かぞえて1件けんになります。Bは学生がくせいIDの合計ごうけいでは履修件数りしゅうけんすうを求もとめられません。

練習れんしゅう

  1. INNER JOINではS03とS04は出でません。対応たいおうする履修行りしゅうぎょうがないからです。LEFT JOINでは両方りょうほうが出でて、履修りしゅうIDがNULLになります。左側ひだりがわの学生行がくせいぎょうを残のこすためです。
  2. 次つぎのSQLを実行じっこうします。
SELECT s.student_id, s.name,
       COUNT(e.enrollment_id) AS enrollment_count
FROM students AS s
LEFT JOIN enrollments AS e
  ON e.student_id = s.student_id
GROUP BY s.student_id, s.name
ORDER BY s.student_id;

列れつはstudent_id, name, enrollment_countです。順じゅんにS01が2、S02が2、S03が0、S04が0です。右側みぎがわのIDにNULLがある行ぎょうは数かぞえないため、未履修者みりしゅうしゃが0件けんになります。

  1. ONに条件じょうけんを置おくと4人にんが残のこり、S01とS02にC01の登録とうろくが結むすび付つきます。S03とS04はNULL補完行ほかんぎょうです。WHEREに同おなじ条件じょうけんを置おくと、S01とS02だけが残のこります。WHEREは結合後けつごうごの行ぎょうを条件じょうけんで選えらぶため、C01に一致いっちしないNULL補完行ほかんぎょうも除のぞかれます。

考かんがえよう

  1. 未履修みりしゅうの学生がくせいも連絡対象れんらくたいしょうなら、結果けっかから除のぞくと連絡れんらく漏もれにつながる可能性かのうせいがあります。studentsを左側ひだりがわに置おくLEFT JOINにして全員ぜんいんを残のこし、履修情報りしゅうじょうほうがないことはNULLとして読よみ取とります。
  2. COUNT(*)はLEFT JOIN後あとの補完行ほかんぎょうも数かぞえるので、未履修者みりしゅうしゃは1と表示ひょうじされます。COUNT(e.enrollment_id)は値あたいのある登録とうろくIDだけを数かぞえるので0になります。登録数とうろくすうの意味いみには後者こうしゃが合あいます。

グループで話はなそう

一ひとつの正解せいかいはありません。左側ひだりがわに残のこす対象たいしょう、結むすびたい表おもて、共通きょうつうするID、未対応時みたいおうじの表示ひょうじを説明せつめいできているかを確認かくにんします。全員ぜんいんを残のこす依頼いらいにはLEFT JOIN、一致いっちした組合くみあわせだけでよい場合ばあいはINNER JOINを使つかう案あんが考かんがえられます。

ワークシート

説明せつめいとSQLの両方りょうほうで、未履修みりしゅうの学生がくせいを残のこすことと、登録とうろくIDを数かぞえることが確認かくにんできれば完成かんせいです。

第だい6章しょう:データを追加ついか・更新こうしん・削除さくじょする

自己じこチェック

1節せつ

  1. 表ひょうに行ぎょうを追加ついかします。
  2. 列れつリストとVALUESを同おなじ順じゅんにします。
  3. IDを条件じょうけんにSELECTし、行数ぎょうすうと値あたいを確認かくにんします。

2節せつ

  1. 対象たいしょうID・変更前へんこうまえの値あたい・件数けんすうが予定よていどおりか確たしかめます。
  2. WHEREにstudent_id=S02の条件じょうけんを書かきます。
  3. 変更件数へんこうけんすうと、対象たいしょうの値あたいが期待きたいどおりか確認かくにんします。

3節せつ

  1. 削除さくじょするID・値あたい・対象件数たいしょうけんすうをSELECTで読よみます。
  2. WHEREがなければ表おもての全行ぜんぎょうが対象たいしょうです。
  3. 参照元さんしょうもとの履修行りしゅうぎょうと、削除さくじょしてよい範囲はんいを調しらべます。

4節せつ

  1. トランザクション内ないの変更へんこうを確定かくていします。
  2. 件数けんすうや値あたいが想定そうていと違ちがい、変更へんこうを残のこさないときです。
  3. 確定かくていを止とめ、条件じょうけんを見直みなおし、必要ひつようならROLLBACKします。

確認問題かくにんもんだい

Q1 正答せいとうはAです。INSERTは列れつリストとVALUESで行ぎょうを加くわえます。BはWHEREの誤用ごよう、Cは既存行きそんぎょうの更新こうしん、Dは削除さくじょです。

Q2 正答せいとうはBです。WHEREでS02を限定げんていし、前後ぜんごをSELECTします。Aは全ぜん4行ぎょうを変更へんこうします。CはprogramがITの全員ぜんいんを対象たいしょうにするため、S02だけという指定していより範囲はんいが広ひろくなります。DはINSERTとUPDATEの混同こんどうです。

練習れんしゅう

  1. 対象たいしょうは1行ぎょうです。前後ぜんごに次つぎのSELECTを実行じっこうします。

    SELECT student_id, program FROM students WHERE student_id='S02';

    更新こうしんSQLは次つぎのとおりです。

    UPDATE students SET program='情報' WHERE student_id='S02';

    所属しょぞくがITから情報じょうほうへ変かわれば正答せいとうです。

  2. 次つぎのSQLを実行じっこうし、同おなじIDでSELECTします。

    INSERT INTO students(student_id, name, program)
    VALUES ('S05', '教材用の学生', 'IT');

    S05・教材用きょうざいようの学生がくせい・ITの1行ぎょうが結果けっかです。

  3. 確定かくていを保留ほりゅうし、WHEREと事前じぜんSELECTを見直みなおします。確定前かくていまえならROLLBACKし、件数けんすうを確認かくにんしてからやり直なおします。

考かんがえよう

  1. WHERE・対象たいしょうID・件数けんすうを調しらべ、確定前かくていまえならROLLBACKします。原因げんいんと取消方法とりけしほうほうを挙あげます。
  2. 参照さんしょうする表ひょうと行ぎょう、削除後さくじょごに必要ひつような情報じょうほうが残のこるか確たしかめます。

グループで話はなそう

SELECTで対象たいしょうや値あたいを事前じぜんに読よむと、条件じょうけん違ちがいやIDの取とり違ちがえを見みつけられます。理由りゆうも述のべていれば正答せいとうです。

ワークシート

ワークシート

空欄練習くうらんれんしゅうは、削除前さくじょまえにS05の3列れつを読よみ、1行ぎょうと確認かくにんします。削除後さくじょごは0行ぎょうで、履修表りしゅうひょうに参照さんしょうされないことも確たしかめます。自力課題じりきかだいはS03の所属しょぞくが観光かんこうと確認かくにんしてから、S03だけを観光情報かんこうじょうほうへ変更へんこうし、事後じごの値あたい・件数けんすう・他たの行ぎょうを照合しょうごうします。

第だい7章しょう:CREATE TABLEと制約せいやく

自己じこチェック

1節せつ

  1. データベースに表ひょうを作つくります。
  2. TEXTです。IDや名前なまえは文字列もじれつだからです。
  3. データ型がたと制約せいやくを書かきます。

2節せつ

  1. NULLです。空文字そらもじや空白くうはくだけの文字列もじれつとは異ことなります。
  2. 列れつまたは列れつの組くみで値あたいが重かさなる登録とうろくを防ふせぎます。
  3. いいえ。空文字そらもじはNULLではなく、NOT NULLだけでは拒否きょひされないためです。

3節せつ

  1. 表ひょうの各行かくぎょうを一意いちいに識別しきべつします。
  2. 学生表がくせいひょうのstudent_idと、授業表じゅぎょうひょうのcourse_idを参照さんしょうします。
  3. 同おなじ学生がくせいIDと授業じゅぎょうIDの組合くみあわせを二度登録にどとうろくすることを防ふせぎます。

4節せつ

  1. 受うけ入いれる値あたいと拒否きょひする値あたいです。
  2. 空文字そらもじをどう扱あつかうか決きめ、CHECKや入力時にゅうりょくじの検査けんさなどを考かんがえます。加くわえた条件じょうけんも試ためします。
  3. そのSQLite接続せつぞくで外部がいぶキー制約せいやくが有効ゆうこうであることを確認かくにんできます。

確認問題かくにんもんだい

Q1 正答せいとうはCです。Cはcourse_idをNULL不可ふかの主ぬしキー、titleをNULL不可ふか・重複不可ちょうふくふかにします。AはIDを一意いちいにしますが、主しゅキーとして指定していしていません。BはUNIQUE(course_id,title)でtitle単独たんどくの重複ちょうふくを防ふせげません。DはTEXT主ぬしキーのNULL不可ふかを明記めいきしていません。

AはIDを一意いちいにしますが、主しゅキーとして指定していしていません。BのUNIQUE(course_id,title)はtitle単独たんどくの重複ちょうふくを防ふせげません。DはTEXT主ぬしキーのNULL不可ふかを明記めいきしていません。

Q2 正答せいとうはCです。NOT NULLはNULLを、UNIQUEは重複ちょうふくを拒否きょひします。空文字そらもじはNULLではないため、許ゆるされる場合ばあいがあります。

AはUNIQUEの役割やくわりを逆ぎゃくにします。Bは空文字そらもじまで拒否きょひすると誤解ごかいしています。Dのような自動変換じどうへんかんはありません。

練習れんしゅう

  1. enrollment_idは主ぬしキー、student_idとcourse_idは外部がいぶキーです。UNIQUE(student_id, course_id)で組合くみあわせの重複ちょうふくを防ふせぎます。
  2. NOT NULLはNULLを、UNIQUEは重複ちょうふくを拒否きょひします。SQLiteではtitle=''は受理じゅりされます。
  3. 空文字そらもじを拒否きょひする要件ようけんか決きめ、CHECKなどを加くわえます。空文字そらもじの拒否きょひと通常名つうじょうめいの受うけ入いれを試ためします。

考かんがえよう・グループで話はなそう

授業名じゅぎょうめいを必須ひっす・重複不可ちょうふくふかにする理由りゆうと、NULL・空文字からもじ・空白くうはくの扱あつかいを説明せつめいできればよいでしょう。

ワークシート

titleはTEXT、NULL不可ふか、重複不可ちょうふくふか、UNIQUEです。NULLと重複名ちょうふくめいは拒否きょひされ、空文字そらもじはNOT NULLだけでは拒否きょひされません。

第だい8章しょう:ER図ずと正規化せいきか

自己じこチェック

1節せつ

  1. 一人ひとりの学生がくせいが一ひとつの授業じゅぎょうに登録とうろくしたことです。
  2. 学生がくせいと授業じゅぎょうの組合くみあわせごとに行ぎょうを作つくり、点数てんすうを記録きろくできます。
  3. 前者ぜんしゃは0件以上けんいじょう、後者こうしゃは一件いちけんです。

2節せつ

  1. 同おなじ学生がくせいIDには一ひとつの名前なまえが対応たいおうする関係かんけいです。
  2. 決きまりません。学生がくせいIDと授業じゅぎょうIDの組くみで決きまります。
  3. teacher_idから決きまります。

3節せつ

  1. 各列かくれつに一ひとつの値あたいを置おき、授業じゅぎょうごとに行ぎょうを作つくります。
  2. student_idだけで決きまる名前なまえを、履修行りしゅうぎょうへ繰くり返かえさないためです。
  3. teacher_idで名前なまえが決きまるためです。授業表じゅぎょうひょうの一部いちぶだけを直なおす危険きけんを減へらせます。

4節せつ

  1. 各表かくひょうのIDを使つかいます。
  2. student_id、course_id、scoreを残のこします。
  3. IDで結むすんだ三行さんぎょうを元もとと比くらべます。

確認問題かくにんもんだい

Q1 正答せいとうはDです。第だい1正規形せいきけいでは一列いちれつに一ひとつの値あたいを置おき、繰返くりかえし列れつを使つかいません。Aは繰返くりかえし列れつを増ふやします。Bは一ひとつのセルに複数ふくすうの授業名じゅぎょうめいを入いれるため、一いちセル一値いっちになりません。Cも授業じゅぎょうごとの繰返くりかえし列れつを残のこします。

Q2 正答せいとうはDです。nameはstudent_idだけで決きまるため、学生表がくせいひょうへ分わけます。scoreはキー全体ぜんたいで決きまります。Aは学生名がくせいめいを履修行りしゅうぎょうごとに繰くり返かえし保存ほぞんし、一部いちぶキーだけで決きまる列れつを残のこします。Bはstudent_idをキーにすると、同おなじ学生がくせいの複数授業ふくすうじゅぎょうの行ぎょうを区別くべつできません。Cはscoreがキー全体ぜんたいで決きまる条件じょうけんを取とり違ちがえています。

練習れんしゅう

  1. 授業じゅぎょうごとに行ぎょうを作つくります。一行いちぎょうは学生一人がくせいひとりの授業一件じゅぎょういちけんへの登録とうろくです。
  2. scoreはキー全体ぜんたい、nameはstudent_id、titleはcourse_idだけで決きまります。
  3. teacher_idから教員名きょういんめいが決きまるため、teachers表ひょうに分わけると改名かいめいは一いっか所しょで済すみます。

考かんがえよう・グループで話はなそう

  1. 学生がくせいID・授業じゅぎょうID・教員きょういんIDで表ひょうを結むすび、必要ひつような列れつが揃そろうか確たしかめます。
  2. 担当変更たんとうへんこうの手順てじゅんや、同おなじIDに複数ふくすうの名前なまえを付つけない規則きそくを確認かくにんします。
  3. 一行いちぎょうの意味いみ・キー・接続列せつぞくれつを図ずにし、分割前ぶんかつまえの三行さんぎょうが戻もどるか確たしかめます。

ワークシート

空欄くうらんは「teacher_idで決きまる」です。teacher_idから教員名きょういんめいが決きまります。一部いちぶだけ直なおすと同おなじ教員きょういんIDに異ことなる名前なまえが残のこります。teachers表ひょうへ分わけ、courses.teacher_id = teachers.teacher_idで授業じゅぎょうと教員きょういんを結むすびます。履修表りしゅうひょうはenrollments.course_id = courses.course_idで授業じゅぎょうと結むすびます。

第だい9章しょう:トランザクションと同時利用どうじりよう

自己じこチェック

1節せつ

  1. トランザクションです。
  2. C01総登録そうとうろく2行ぎょう、残席ざんせき2です。
  3. ROLLBACKを実行じっこうします。

2節せつ

  1. 処理全体しょりぜんたいを実行じっこうするか、全体ぜんたいを取とり消けす考かんがえ方かたです。
  2. 一ひとつです。
  3. 原子性げんしせい・一貫性いっかんせい・独立性どくりつせい・永続性えいぞくせいです。

3節せつ

  1. データの複製ふくせいを別べつに保存ほぞんし、必要時ひつようじに戻もどせるようにすることです。
  2. いいえ。元もとデータを上書うわがきしない場所ばしょで試ためします。
  3. 表ひょう、ID、件数けんすう、値あたい、外部がいぶキーの関係かんけいです。

4節せつ

  1. 対象たいしょう・ID・開始終了かいししゅうりょう値ち・件数けんすう・終了命令しゅうりょうめいれいです。
  2. 今回分こんかいぶん0行ぎょう、総登録そうとうろく2行ぎょうです。
  3. いいえ。まず値あたいと確定状態かくていじょうたいを確認かくにんします。

確認問題かくにんもんだい

Q1 正答せいとうはAです。二ふたつの変更へんこうを同おなじまとまりにして、条件不じょうけんふ成立せいりつならROLLBACKします。Bは両方りょうほうを先さきに確定かくていし、条件不じょうけんふ成立せいりつでも後あとから一方いっぽうだけを削除さくじょします。Cはバックアップを取消命令とりけしめいれいと同おなじように扱あつかっています。Dは履修追加りしゅうついかを確定かくていしてから残席ざんせきを更新こうしんするため、残席更新ざんせきこうしんに失敗しっぱいすると履修りしゅうだけが残のこるおそれがあります。

成功例せいこうれいはBEGIN後あとに履修りしゅうと残席ざんせきを変更へんこうしてCOMMITします。失敗例しっぱいれいは別べつDBで仮変更後かりへんこうごにROLLBACKします。今回分こんかいぶんの0行ぎょうとC01総数そうすう2行ぎょうを区別くべつします。

Q2 正答せいとうはCです。SQLiteの書込かきこみトランザクションは同時どうじに一ひとつです。復元後ふくげんごは表ひょうや件数けんすうなどを照合しょうごうします。AはSQLiteで複数ふくすうの書込かきこみが同時どうじに確定かくていするという点てんと、復元後ふくげんごに件数けんすうだけを見みる点てんが誤あやまりです。Bは復元後ふくげんごの照合しょうごうを省はぶいています。DはSQLiteの書込かきこみが一ひとつずつである点てんを取とり違ちがえています。

SQLiteでは書込かきこみトランザクションは同時どうじに一ひとつです。バックアップは復元後ふくげんごに表ひょう、ID、件数けんすう、主要値しゅようちを照合しょうごうします。ここでいう同時どうじ書込かきこみの説明せつめいはSQLiteに限かぎります。

練習れんしゅう

  1. 開始かいしは総数そうすう2行ぎょう・残席ざんせき2です。BEGIN後あとに履修行りしゅうぎょうと残席ざんせきを更新こうしんします。成功せいこうはCOMMIT後あと、今回分こんかいぶん1・総数そうすう3・残席ざんせき1。失敗しっぱいはROLLBACK後あと、今回分こんかいぶん0・総数そうすう2・残席ざんせき2です。
  2. 原子性げんしせい・一貫性いっかんせい・独立性どくりつせい・永続性えいぞくせいです。全体ぜんたいの取消とりけし、制約せいやく、途中状態とちゅうじょうたい、確定後かくていごの保存ほぞんに順じゅんに対応たいおうします。
  3. 表名おもてな、ID、件数けんすう、残席ざんせき、外部がいぶキーなどです。三項目さんこうもく以上いじょうと理由りゆうがあれば正答せいとうです。

考かんがえよう・グループで話はなそう

  1. 画面がめんや集計しゅうけいが実態じったいと合あわなくなります。履修行りしゅうぎょう・総数そうすう・残席ざんせきを照合しょうごうできれば正答せいとうです。
  2. 製品せいひんの読よみ書がき・競合時きょうごうじの扱あつかいとアプリ側がわの再確認さいかくにん方法ほうほうを調しらべます。SQLiteの説明せつめいを広ひろげなければ正答せいとうです。
  3. 元もとDBを上書うわがきしない場所ばしょに復元ふくげんし、表ひょう・ID・件数けんすう・値あたいを照合しょうごうします。適切てきせつな別案べつあんも認みとめます。

ワークシート

空欄くうらんの正答せいとうは、失敗例しっぱいれいの「ROLLBACK」「今回分こんかいぶん0行ぎょう」「C01総登録そうとうろく2行ぎょう」「残席ざんせき2」です。開始時かいしじと同おなじ総登録数そうとうろくすう・残席ざんせきへ戻もどり、E06が今回分こんかいぶんとして残のこっていないと確たしかめられれば完成かんせいです。

第だい10章しょう:安全あんぜんに使つかい、設計せっけいを説明せつめいする

自己じこチェック

1節せつ

  1. 集あつめず、表示ひょうじしません。
  2. 本人ほんにんだけとなる条件じょうけんを決きめます。
  3. 件数けんすう・ID・参照関係さんしょうかんけいを見みます。

2節せつ

  1. 目的もくてきに合あわせて分わけます。
  2. 件数けんすう・ID・参照関係さんしょうかんけいを見みます。
  3. 組織窓口そしきまどぐちや公式情報こうしきじょうほうで確認かくにんします。

3節せつ

  1. 外部がいぶから受うけ取とった値あたいを不適切ふてきせつにSQLへ組くみ込こみ、意図いとしないSQLとして解釈かいしゃくされるおそれがある問題もんだいです。対策たいさくとしてSQL文ぶんと値あたいを分わけます。
  2. 値あたいがSQLとして解釈かいしゃくされるおそれがあります。
  3. 攻撃文字こうげきもじ列れつや手順てじゅんは扱あつかいません。

4節せつ

  1. SQLに?を置おき、値あたいを別引数べつひきすうで渡わたします。
  2. いいえ。SQLiteにGRANT/REVOKEはありません。
  3. DBMS、アプリ、OSの機能きのうから決きめます。

確認問題かくにんもんだい

Q1 正答せいとうはBです。教員きょういんは担当授業たんとうじゅぎょう、学生がくせいは本人ほんにんの履修りしゅうだけを参照さんしょうし、目的もくてきに必要ひつような列れつを使つかいます。Aは教員きょういんの参照範囲さんしょうはんいが広ひろすぎます。Cは成績一覧せいせきいちらんに不要ふような住所じゅうしょ・個人こじんメールも表示ひょうじします。Dは教員きょういんに担当外たんとうがいの成績せいせきの行ぎょうまで削除さくじょできる範囲はんいを与あたえ、必要ひつような権限けんげんを超こえています。

Q2 正答せいとうはBです。?と別引数べつひきすうを使つかいます。Aは値あたいをSQL文ぶんに連結れんけつし、Cは値あたいを列名れつめいと混同こんどうします。DはSQLiteにないGRANTを使つかいます。

練習れんしゅう

  1. 教員きょういんは担当授業たんとうじゅぎょうの氏名しめい・授業名じゅぎょうめい・点数てんすうを参照さんしょうし、必要ひつようなら更新こうしんします。学生がくせいは本人ほんにんの履修りしゅうを見みて、成績せいせきを変更へんこうしません。運用担当うんようたんとう者しゃは複製ふくせいを管理かんりします。
  2. 表ひょうの件数けんすう、学生がくせい・授業じゅぎょうID、参照関係さんしょうかんけいを照合しょうごうします。不足ふそくや重複ちょうふく、IDの不一致ふいっちを確認かくにんします。
  3. 例れい:cur.execute("SELECT student_id,name FROM students WHERE program=? ORDER BY student_id", (program,))。SQL文ぶんは第一引数だいいちひきすう、値あたいはタプルの第二引数だいにひきすうです。結果けっかはstudent_idとnameの二列にれつです。

考かんがえよう・グループで話はなそう

目的もくてき・列れつ・役割やくわり・保管先ほかんさき・復元確認ふくげんかくにんが結むすびついていればよいでしょう。個別条件こべつじょうけんは組織窓口そしきまどぐちや公式情報こうしきじょうほうで確たしかめます。

ワークシート

学生がくせいには本人ほんにんの履修りしゅう、教員きょういんには担当授業たんとうじゅぎょうの点数てんすうを見みせます。不要列ふようれつを外はずし、複製後ふくせいごに件数等けんすうとうを照合しょうごうします。値あたいは別引数べつひきすうにします。

付録URL