狙った分野の午後問題をやっつけたいよPart3・・・小学生を対象とした、ある子供会の名簿を管理する関係データベース『設問1』
#基本情報技術者試験 #平成30年 #春期 #午後 #データベース #SQL
テーマと、四つの表のつながりが確認できたので、設問1へ。大事そうに見えるところをチェック。
・6年生向けイベントの案内を配布したい。
・そのために6年生の保護者(氏名と住所)を抽出したい。
・同一人物を重複して抽出するのはダメ。
という部分に注目してみる。
では解答群。ごちゃごちゃしてるように・・・見える。から、調べるポイントを絞り込みたいな。
まずは、それぞれの一行目を見比べてみた。
一行目は、ア~エすべてに保護者表.保護者氏名, 保護者表.住所
があって、DISTINCTがついていないのがエだけ。
DISTINCTは、重複データの表示をしないというキーワード。
これをつけることで、氏名も住所も同じっていうのは表示されなくなる。
そういえば、問題文にの中にそんなことが書いてあったな。
ということは、エは候補からはずしていいね。
次は二行目。候補として残っているア~ウを見比べる。
二行目はFROMキーワードで、使いたい表が書いてある。
アは保護者表のみ、イとウは保護者表と児童表。
イとウは、二つ以上の表を使っているんだから、次のWHEREでひもづけをしているかをチェックしなきゃいけない。
その流れで・・・
三行目のWHEREを見てみる。
まずは、ひもづけチェックをしたいので、イとウだけに注目。
イのWHEREは、いきなり児童表.学年 = 6。
ウは、二つの表を保護者番号でひもづけして、からの児童表.学年 = 6。
イもウも二つの表を使っているから、ひもづけはしなきゃいけない。
ということは、イはそれをやっていないからダメ。
で、イも候補から消えた。
ここまでで、
イとエが候補から消えたので、残っているのはアとウ。
その二つをさらに調べる。調べるところは、WHEREからうしろ。
アから見ていく。
アのWHEREからうしろは、副問い合わせになっている。
( )内のSELECT文が書かれているのが副問い合わせ。
この場合、まずこの( )内が実行され、その結果がカッコ内にずらずらと並ぶ。
この①部分は『児童表から、6年生の児童の、保護者番号を取得』するためのSELECT文が書かれているので、6年生の保護者の番号が、ずらずらと並ぶのだ。
こんな感じで。
それから、WHERE全体の処理が行われる。
保護者表.保護者番号 NOT IN ( ・・・)は、( )内のデータと一致しない保護者番号という意味。
( )にずらずら並べたのは、6年生の保護者の番号だった。
つまりアには、6年生の保護者の番号と一致しないものを抽出する、という絞り込み条件が書かれているのだ。
だめじゃん、6年生の保護者を抽出したいのに。
だから、アは候補から消えました。
じゃあもう残りはウしかないね。
ウのWHEREも見ておこうかな。
まちがいないぞ。