パソコン利用技術検定試験1級
パソコン利用技術検定試験
1級のカリキュラム
<<<ページ内リンク>>>
・データベース関連知識
・SQL
・パソコンのハードウェア、ソフトウェア
・パソコンの周辺機器
・ネットワーク関連、マルチメディア
・RASIS、法令
データベース関連知識
・SQL
パソコンの周辺機器
実技の解説 1 select 商品仕様在庫.品番,コンピュータ.品名,商品仕様在庫.在庫 from 商品仕様在庫,コンピュータ where 商品仕様在庫.分類番号=コンピュータ.分類番号
これは在庫している商品をすべて出力するものです。ただし、[コンピュータ]表の[品名]を出力する必要があるので[分類番号]で二つの表を結合しています。(3) select 商品仕様在庫.品番,コンピュータ.品名,商品仕様在庫.分類番号,商品仕様在庫.在庫 from 商品仕様在庫,コンピュータ where 商品仕様在庫.分類番号=コンピュータ.分類番号 and 商品仕様在庫.在庫<10 order by 商品仕様在庫.在庫 desc
これは、(2)に、分類番号を表示し、在庫量が10以下のものだけを表示させたものです。また、在庫量の降順なので、[order by]句を使い、[desc]を指定しています。
2 select 商品.分類,sum(売上.売上数量*商品価格.販売価格) as 売上 from 商品,売上,商品価格 where 商品.品番=商品価格.品番 and 商品.品番=売上.品番 group by 商品.分類,売上.売上日 having 売上.売上日=#4/16/2001#
これは、分類ごとに、日付で集計した数値を出す必要があるので、[group by]で、グループ化することを指示しています。その上で、ある特定の日付を指定するため[having]を使っています。このように、グループ化した後に条件を指定するには、[where]ではなく[having]を使います。また、[売上]という列名を[as]を利用してつけています。
(3)
select sum((商品価格.販売価格-商品価格.仕入価格)*売上.売上数量) as 利益 from 商品価格,売上 where 商品価格.品番 = 売上.品番 group by 売上.売上日 having 売上.売上日=#4/17/2001#
こちらは、分類で分ける必要がないので、日付だけでグループ化を行い、[having]で日付を指定しています。
3 select 顧客ID,顧客名,count(伝票.発送者ID) as 回数 from 伝票 inner join 顧客 on 顧客.顧客ID=伝票.発送者ID group by 顧客.顧客ID,顧客.顧客名 order by count(伝票.発送者ID) desc
このSQLの特徴は、表の結合を[inner join]を使っていることです。[where]を使わなくても[表 inner join 表 on 列=列]とすることで表の結合を行えます。そして、[count]関数で数の集計を行い、顧客ごとに表示しています。(3) select 顧客.顧客ID,顧客.顧客名,sum(料金.料金) as 請求金額 from 顧客,料金,伝票 where 伝票.サイズ=料金.サイズ and 顧客.顧客ID=伝票.発送者ID group by 顧客.顧客ID,顧客.顧客名
これは、顧客ごとに、料金を合計した請求金額を求めています。4 select 社員.社員ID, 社員.社員名, sum(勤務.退勤時間-勤務.出勤時間) as 勤務時間 from 社員,勤務 where 社員.社員ID=勤務.社員ID and 勤務.日付 between #04/16/2001# and #04/19/2001# group by 社員.社員ID,社員.社員名
日付の期間を[between]を使って求めています。この日付の期間内のデータの中から社員ごとの勤務時間を算出しています。(3) select 社員.社員ID, 社員.社員名, (sum(勤務.退勤時間-勤務.出勤時間))*社員.時間給 as 給与 from 社員,勤務 where 社員.社員ID=勤務.社員ID and 社員.社員ID=6 and 勤務.日付 between #04/15/2001# and #04/20/2001# group by 社員.社員ID,社員.社員名,社員.時間給
これは(2)に、日付範囲を変え、特定の一人だけ抽出し、給与を計算する式を与えたものです。5 select 顧客.顧客ID,顧客.顧客名,count(利用者ID) as 利用回数 from 顧客 inner join 使用記録 on 顧客.顧客ID = 使用記録.利用者ID where 使用記録.利用日=#05/03/2001# group by 顧客.顧客ID,顧客.顧客名 having 顧客.顧客ID=1
[inner join]を用いて[顧客]表と[使用記録]表を結合させます。ある日を特定した上で、顧客ごとグループ化します。
そして、[having]句を用いて一人の顧客を特定しています。(3) select 顧客.顧客ID,顧客.顧客名,sum(使用記録.通常使用料金) as 使用料金 from 顧客 inner join 使用記録 on 顧客.顧客ID = 使用記録.利用者ID group by 顧客.顧客ID,顧客.顧客名,使用記録.利用日 having 使用記録.利用日=#05/03/2001#
[sum]関数を使い、顧客ごとにグループ化して顧客ごとの利用料金を求めています。さらに日付でもグループ化し、日付には[having]で日を指定しています。6 select ソフトウェア.製品名,制作会社.会社名,ソフトウェア.価格 from ソフトウェア,制作会社 where ソフトウェア.会社ID=制作会社.会社ID and ソフトウェア.分類='表計算'
少し表の数が増えただけで問題は簡単。普通のSQL。(3) select 制作会社.会社名,ソフトウェア.製品名,導入数.導入数,導入数.導入場所 from 制作会社,ソフトウェア,導入数 where 制作会社.会社ID=ソフトウェア.会社ID and ソフトウェア.製品ID=導入数.製品ID order by 制作会社.会社名
これも3つのテーブルを結合するだけでいいと思ったのに[order by]を使わないと不正解になる。SQLを記述する欄には[order by]は載ってないのに。それに、問い1の主キーの会社IDの属性、[c]という文字が入っているのにもかかわらず数値型ですか??? 7 select 名簿.ID,名簿.氏名,身長.3年身長,体重.3年体重 from 名簿,体重,身長 where 名簿.ID=体重.ID and 身長.ID=名簿.ID and 身長.3年身長<=170 and 体重.3年体重>=60
テキストのほうの問題には身長170cm以下、体重60kg以上の生徒を抽出すると書いてあるのに、解答を見ると身長170cm以下、体重60kg以下の生徒を抽出するSQLが書かれています。その上、ソフトのほうに表示される問題には「身長体重が170cm未満,体重60sより重い生徒を抽出」となっていて、「以下」と「未満」、「以上」「より重い」という違いがありてんでばらばら。 これでは絶対に正しい解答は出せません。 (3)はさらにひどい。 問題は「[視力]cの生徒を[学年][クラス]ごとにごとにグループ化して、学年、氏名、右視力、左視力の一覧表を作成するためのSQLを作成しなさい。」というのに、 解答が「 SELECT 視力.視右, 視力.視左, Count(視力.視右) AS 人数 FROM 視力 GROUP BY 視力.視右, 視力.視左;」 とはまったく意味がわかりません。 学年とクラスでグループ化するように書いてあるのに解答では視力でグループ化しているし、「視力cの生徒」というのが右なのか左なのか、総合なのか、その場合どうやって総合を決めるのかなどがかかれていません。また、テキストのほうの表には「視力右」なのに実際は「視右」だったりと不整合がありすぎて問題をやる気が起きませんでした。 8
1.「生徒」という表は存在しない 2.仮に「生徒」表を「名簿」表に読み替えたとしても、「名簿」表には「ID」は存在しない。あるのは番号。 3.同じく「所属委員会部活動」には「ID」は存在しない。 正しくは
生徒の一覧だから表の名前は「生徒」だろう。管理番号は「ID」だろう。という思い込みもあるかもしれません。 (2) select 所属委員会部活動.委員会,count(所属委員会部活動.委員会) as 人数 from 所属委員会部活動 group by 所属委員会部活動.委員会
これは珍しくまともに解けた問題です。「部活動顧問」表には「HR長」や「資格検定」などの委員会名が含まれていないので使えません。(3) select 所属委員会部活動.部活動,部活動顧問.ID,名簿.氏名,部活動顧問.担当者名 from 所属委員会部活動,部活動顧問,名簿 where 所属委員会部活動.番号=名簿.番号 and 部活動顧問.部活動名=所属委員会部活動.部活動 order by 部活動顧問.部活動名 asc
問題どおりにSQLを作成するとこのようになりますが、解答例と比べても、採点しても不正解になってしまいます。テキスト、ソフトのほうの問題では「部活動名,ID,氏名,顧問名」を出力するよう求められています。 しかし、解答を見てみると「部活動名,(生徒の)番号,氏名,顧問名」が出力されています。 問題で「ID」を出すよう求められているのですから、「番号」を出すはずがありません。 ここで「ID」が使われているのは委員会や部活動の通し番号ですから、部活動名に対応するIDを出すのだろうと考え、フィールドを「部活動顧問.ID」にすると間違っている始末です。 しっかりと問題に則してSQLを作成しても問題と解答では表の項目名が違うために答えが不正解になるのではやる気もおきません。演習問題7、8の4問中3問がこうではやってられません。どのような作り方をしているんでしょうか? こんな調子ではこの資格をとったってたいしたスターテスにはならないな・・・そんな気がしてなりません。 9 select 生徒.生徒ID,生徒.氏名,科目名.科目名 from 生徒,科目名,選択科目 where 科目名.科目ID = 選択科目.科目ID and 生徒.生徒ID = 選択科目.生徒ID and 生徒.生徒ID>1105 and 生徒.生徒ID<1115
「ID」は、全角ということに注意。ソフトのほうでは半角で入力しても区別されないのか、実行できてしまうのに、採点してみると区別するようで不正解になってしまいます。それはともかく、「生徒IDが1105から1115を選択し、」と問題にあるのに、「生徒.生徒ID>1105 and 生徒.生徒ID<1115」としては1105と1115は入らなく、1106〜1114までの生徒になってしまいます。これは問題文どおりに解釈すると等号をつけた「生徒.生徒ID>=1105 and 生徒.生徒ID<=1115」というようになるのではないでしょうか? ああ、ここでも問題と解答のずれがある・・・。 (3) SELECT 生徒.生徒ID, 生徒.氏名, ハードウェア.得点 FROM ハードウェア,生徒 WHERE ハードウェア.生徒ID = 生徒.生徒ID and ハードウェア.得点>=30;
これは普通ですね。レベルとしてもかなり低いほうでしょう。10 select 生徒.氏名,資格名.資格名,主催.主催 from 生徒,取得資格,資格名,主催 where 生徒.生徒ID=取得資格.生徒ID and 取得資格.資格ID=資格名.資格ID and 資格名.資格ID=主催.資格ID and 生徒.生徒ID<=1107 order by 生徒.生徒ID asc
問題「生徒IDが1107以下の氏名、資格名、主催の一覧表を作成するためのSQL文を作成しなさい」ここから「生徒ID」を出力するべきだと読み取れますか?ほとんどの人が氏名、資格名、主催だけを出力すると思います。私もそうしました。 ところが、答えを見ると「生徒ID」も出力されていて不正解になりました。 はっきり生徒IDも入れることを書くべき! (3) select 資格名.資格名,count(取得資格.資格ID) as 取得人数 from 資格名,取得資格 where 資格名.資格ID=取得資格.資格ID group by 資格名.資格名,取得資格.資格ID order by count(取得資格.資格ID) desc
問題は「[資格名]ごとにグループ化して,生徒の取得した資格ごとの人数をカウントし,資格名,取得人数(降順)の一覧表を作成するためのSQL文を作成しなさい。」出力する項目は「資格名」と「取得人数」です。 しかし、このとおりにやっても不正解です。ああ、また・・・。 そうです、解答は「取得人数」でなくて「取得者数」になっていたのです! 問題文と解答でつけてる名前が違う。こんな問題できる人いません! この滅茶苦茶さにはあきれ果てるしかありません。 しっかり問題文どおりにSQLを作成した・・・のにもかかわらず解答が問題と違うため、不正解になる。 ものすごいフラストレーションがたまりますね。受ける人があまりいないのも分かる気がする。 でも意外と、テキストの前半の筆記問題の演習問題はミスがないんですよね。どういうこっちゃ? 最後になって急いで仕上げたんじゃないの??全国工業高等学校長協会の先生方。 | |||||||||||||||||||