この記事は「データベーススペシャリスト資格に興味はあるが、どのようなものか?どう学ぶのか?」という方向けに、具体的な内容と私自身の挑戦ログをお伝えする。学び中の方や、これから学ぼうとされる方の参考になれば幸いだ。今回は知識およびSQL(確認ドリル)について書く。(SQLはGoogle Big Queryに準拠)
知識(SQLの午前問題例)
SQLの午前問題のポイント
- ここに記すのはあくまでサンプルであり、過去問ベースにselect句について一通りは解けるようにしておく必要がある。
問題サンプル(H26問16)(問題の要旨)
- “商品月間販売実績”表(商品コード、総販売数)について。例えば「S001,150」「S004,400」「S005,400」「S006,500」と4つのレコード(行)があるとする。
- SQLを以下のとおり記述したとき、抽出されないレコードはどれか。
- select A.商品コード as 商品コード,A.総販売数 as 総販売数
- from 商品月間販売実績 A
- where 3 > (select count(*) from 商品月間販売実績 B where A.総販売数 < B.総販売数)
問題サンプル(H26問16)(回答)
- この問題は相関副問い合わせ。
- まず、カッコ内のwhere句を見ると、selectで求めるA表の総販売数と、比較用のB表の総販売数を比べ、カウントしているのがわかる。
- そして、カッコ外のwhere句を見ると、カウントの結果が3未満のとき抽出すると読める。
- よって、「S001,150」は唯一、カウント数が”3″なので抽出対象外となる。
問題サンプル(H29問8)(問題の要旨)
- “社員”表(社員コード、部署コード、社員名、役職)について、部署コードごとの主任の人数と一般社員の人数を求める。
- select 部署コード
- count(case when 役職 = “主任” 【 】end ) as 主任の人数,
- count(case when 役職 = “一般社員” 【 】end ) as 一般社員の人数
- from 社員 group by 部署コード
問題サンプル(H29問8)(回答)
- まずcaseだが、「case when 条件 then 真の戻り値 else 偽の戻り値」のように用いる。エクセルのIF関数のような形。
- 次にcountだが、これはnull以外の値をカウントする。
- よって、【】内は「then 1 else null」が正解とわかる。
- 偽の戻り値はnullにして、count対象とされないようにするのがポイント。
知識(SQLの午後問題例)
SQLの午後問題のポイント
- 本文とSQLの一部が記載されているので、本文をよく読んで”何をしたいのか”把握し、適切にSQLを埋める。
- なお、今回は必要な部分がピンポイントで書いてあるので即答できるが、本番では至る所に散りばめられているので、回答に必要な部分を探し出す必要がある。
- とはいえ、SQLの基本的な構文は把握しておく必要がある。
- たとえば以下の事例であれば、出庫年月日”ごと”という表記から”group by”、”集計する”という表記から”sum”、”全くない部品も”という表記から”outer join”とアテがつかなければいけない。
問題サンプル(H29問2のSQL1)(問題の要旨)
- SQL1は各部品の出庫年月日ごとの出庫数量を集計する。また、SQL1では、出庫が全くない部品も集計対象とする。
- SQL1の記述は以下のとおり。【】内に入る記述を答えよ。
- なお、出庫表は出庫番号を主キーとし、”部品番号”,”出庫年月日”,”出庫数量”等を持つものとする。
- select B.部品番号,S.出庫年月日,【a】
- from 在庫 as B 【b】出庫 as S
- on B.倉庫コード = S.出庫元倉庫コード and B.部品番号 = S.部品番号 and S.出庫年月日>”2016-04-01″ and S.出庫年月日 < “2017-04-01”
- 【c】
問題サンプル(H29問2のSQL1)(回答)
- まず【c】だが、本文でやりたいことが「各部品の出庫年月日ごとの出庫数量を集計」と読み取れ、select文で部品番号と出庫年月日を指定しているので、「group by B.部品番号,S.出庫年月日」とわかる。なお、表の相関名(BやS)で必ず書くこと。
- 次に【a】だが、出庫数量を集計とあるので、「sum(S.出庫数量)」とわかる。
- 最後に【b】だが、「出庫が全くない部品も集計対象とする」とあるので、B表のデータは全て残す必要がある。よって「left outer join」とわかる。
9月22日復習時追記
- SQLは、午前2では頻出問題。TACテキストおよび過去5年分解いており、対策済。
- また、SQLの全般的な構文は、三好先生のSQLページでも確認済。
- 午後については「SQL問題」として過去問ベースで確認しており、対策済。
問題086(SQL確認ドリル)
問題文
- customersテーブルに都道府県(prefecture)が「東京」以外の顧客は何人いるか調べてください。
- 結果テーブルのカラム名は「users」とします。
count(distinct 列名),whereのおさらい
- count(distinct 列名)は指定した列のユニークな値の数を取得できる。
- whereは条件の絞り込みを行う。今回は”以外”なので”!=”を用いる。
- 具体的には以下のとおり。
考察
- データベーススペシャリスト資格について。今回は知識(SQLの試験問題例)の復習を行い、回答の方法や注意点を学習した。また、SQLの確認ドリル(customersテーブルで都道府県が東京以外の顧客の人数)を解いた。
- 考察。何か新しいことを始めるときは「学び、練習して、内省する」サイクルが重要だと思う。このうち内省とは、問題点を発見したり指摘してもらい、次に活かすことだ。たとえば車の運転であればはじめは慎重だが、慣れてくると思い込みや慢心が生まれやすい。そこで同乗者に意見をもらうなどだ。
考察のシンプル化と英訳(練習中)
- Study, Practice, Introspection. I think this “SPI” is important with new challenge.
- (勉強、実践、内省。この「SPI」は新しい挑戦において重要だと思います)
参考資料
- 集中演習 SQL入門/木田和廣/株式会社インプレス
- 2022年度版 ALL IN ONE パーフェクトマスター データベーススペシャリスト/TAC
コメント