【4点狙い】診断士 情シスSQLは「型」で解く|頻出WHERE/GROUP BY/HAVING/JOINを最短攻略 by ゆうゆう

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
一発合格道場ブログを
あなたのPC・スマホの
「お気に入り」「ブックマーク」に
ご登録ください!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
みなさん、おはようございます。 ゆうゆうです。
本日は私の専門分野であるデータベースの最頻出論点であるSQLを徹底解説したいと思います。
今回の記事でみなさんマスターして4点取りましょう!
- 1. お知らせ ①「道場MeetUp!」
- 2. はじめに:SQL/統計が苦手でも大丈夫
- 2.1.1. この記事のゴール
- 3. 全体像:経営情報システムで“データ系”はこう出る経営情報システムのデータ系は、大きく次の3つに分かれます。
- 4. 最低限の前提知識(ここだけ)
- 4.1. データ関連の用語
- 4.2. SQLミニ辞書
- 5. 例題テーブル
- 5.1. customers(顧客マスタ)
- 5.2. products(商品マスタ)
- 5.3. stores(店舗マスタ)
- 5.4. sales(売上明細)
- 6. 例題で身につけるSQLの“型”
- 6.1. 例題1
- 6.2. 例題2
- 6.3. 例題3
- 6.4. 例題4
- 6.5. 例題5
- 6.6. 例題6
- 6.7. 例題7
- 6.8. 例題8
- 7. 過去問で実際に学ぼう
- 8. 最後に:まだまだ時間ある。SQLを得点源にしましょう
お知らせ ①「道場MeetUp!」

受験生の皆さんの参加をメンバー一同お待ちしています。
参加申し込みは下記のリンクからどうぞ!
はじめに:SQL/統計が苦手でも大丈夫
「経営情報システムのSQL/統計って、データサイエンスのバックグラウンドがないと無理…」と思っていませんか?
先日てせが紹介してくれた17代目道場メンバーの捨て論点の中にもSQL/統計を捨てたと解答したメンバーが何人かいました。
情シスのSQLと正規化は捨てたな〜
統計は捨てた!
統計は4点の労力が見合わない
データ関連の論点は嫌われがちだよね、、
データベース?統計?診断士に求めること多くない?と私も思います。
ただ、データベース/統計関連の中にも理解すると簡単に点が取れる論点があります。
この記事はその中でもSQLに絞って解説し、この記事を読み終えた時点で“経営情報システムの頻出SQL問題”を解ける状態になることを目的にしています。
統計関連は次回以降の記事で紹介したいと思います!
この記事のゴール
- SQL問題で頻出の WHERE / GROUP BY / HAVING / ORDER BY / JOIN を使い分けできる
- 問題文を見て、SQLのどの句から考えるか理解して流れを身につける
全体像:経営情報システムで“データ系”はこう出る経営情報システムのデータ系は、大きく次の3つに分かれます。
- SQL:抽出(WHERE)、集計(GROUP BY)、集計後条件(HAVING)、結合(JOIN)など
- 統計・分析っぽい用語:平均、分散、相関、回帰など(計算より概念判断)
- DB設計:主キー・外部キー、正規化、ER図など
最低限の前提知識(ここだけ)
データ関連の用語
SQLを勉強する前に、設問でよく出る用語をまず押さえておきましょう。
- テーブル:データの表
- 例:顧客マスタ、売上明細、のようなまとまったデータ群
- 行:レコード(1件のデータ)
- 各テーブルの横方向のデータ(レコード数)。店舗マスタで言うと「店舗数」で、例なら3件
- 列:項目(属性)
- 各テーブルの縦方向のデータ(項目数)。商品マスタで言うと product_id / product_name / category / price の4項目
- 主キー(PK):行を一意に識別する列
- 例:顧客マスタではcustomer_idを指していて、customer_idがわかると顧客名や都道府県が分かる項目
- 外部キー(FK):別テーブルの主キーを参照する列(JOINの接続点
- 例:売上明細では store_id / customer_id / product_id を指します。売上明細だけ見ても「どの店舗・どの顧客・どの商品か」は分かりませんが、店舗マスタ・顧客マスタ・商品マスタと紐づけ(JOIN)することで、それぞれの名称や属性を付与できます
SQLミニ辞書
SQLは試験に頻出の構文を下記にまとめました。
今回の記事では紹介していない構文もまだたくさんありますが、難易度が高いものは取り扱いません。
各構文で使用する式(例:=、>)は後述の例題で解説します。 また、下記の順番はSQLの文法順ではなく、SQLの実行順です。
実行順とは、コンピュータが処理するときに「どの構文から見て処理するか」の順序で、SQLの文法とは異なります。
試験時は0からSQLを組み立てることは少なく、私も実務でSQLを書くときは実行順で考えた方が理解しやすいので、この記事でも実行順でSQLを完成させていきましょう。
- 対象テーブルを決める(FROM)
- 結合するテーブルを追加する(JOIN)
- 条件で絞る(WHERE)
- まとめる(GROUP BY)
- まとめた後に絞る(HAVING)
- 欲しい列を決める(SELECT)
- 並べる(ORDER BY)
例題テーブル
今回の記事では、オフィス機器を取り扱い、複数店舗を展開している小売店のサンプルデータを用意しました。
このデータに基づいて、いくつか例題を解いていきましょう。
customers(顧客マスタ)
小売店の会員プログラムに登録されている顧客情報
| customer_id | customer_name | prefecture |
|---|---|---|
| 1 | 佐藤 | 神奈川 |
| 2 | 鈴木 | 東京 |
| 3 | 高橋 | 神奈川 |
| 4 | 田中 | 千葉 |
| 5 | 伊藤 | 東京 |
products(商品マスタ)
小売店に取り扱われている商品情報
| product_id | product_name | category | price |
|---|---|---|---|
| 1 | ノートPC | PC | 120000 |
| 2 | マウス | 周辺機器 | 3000 |
| 3 | キーボード | 周辺機器 | 8000 |
| 4 | モニター | 周辺機器 | 25000 |
| 5 | タブレット | モバイル | 60000 |
stores(店舗マスタ)
現在、運営している店舗情報
| store_id | store_name | area |
|---|---|---|
| 1 | 横浜店 | 神奈川 |
| 2 | 新宿店 | 東京 |
| 3 | 千葉店 | 千葉 |
sales(売上明細)
運営している全店舗の売上情報
※ customer_id が空欄(NULL)の行は「非会員の購入」という想定です。
| sales_id | sales_date | store_id | customer_id | product_id | quantity |
|---|---|---|---|---|---|
| 1 | 2026-05-01 | 1 | 1 | 2 | 2 |
| 2 | 2026-05-01 | 1 | 2 | 1 | 1 |
| 3 | 2026-05-02 | 2 | 2 | 4 | 1 |
| 4 | 2026-05-02 | 2 | 5 | 2 | 1 |
| 5 | 2026-05-03 | 3 | 4 | 3 | 1 |
| 6 | 2026-05-03 | 3 | 2 | 3 | |
| 7 | 2026-05-04 | 1 | 3 | 5 | 1 |
| 8 | 2026-05-04 | 2 | 1 | 2 | 1 |
| 9 | 2026-05-05 | 2 | 4 | 2 | |
| 10 | 2026-05-05 | 1 | 5 | 3 | 2 |
| 11 | 2026-05-06 | 3 | 4 | 1 | 1 |
| 12 | 2026-05-06 | 2 | 3 | 2 | 4 |
例題で身につけるSQLの“型”
ここからは例題を解きながら、私が紹介した実行順でSQLの解答を作成していきましょう。
例題1
顧客マスタより東京の顧客のみを取得しましょう。
SELECT ③
FROM ①
WHERE ②;解答・解説
①customers、②prefecture = ‘東京’、③customer_id, customer_name, prefecture(もしくは ALL)
本例題ではまず①でcustomersが選べることが重要です。 「顧客マスタから取得する」という問題なので、対象テーブルは customers(顧客マスタ)です。指定先はFROM句になります。 ②、③はこちらの例題で覚えましょう。 ②では東京のみを取得するという条件から、顧客マスタより都道府県の情報が格納されている項目:prefectureの指定が必要です。 また、「東京」のみという1つのデータを指定する場合、SQLの条件として項目:prefecture内で「東京」と一致するという表現に言い換えられます。そのため、prefecture = ‘東京’となります。今回の問題では指定するデータが文字なので、シングルコーテーション:’で東京を囲む必要があります。数値の場合はシングルコーテーションが不要になります。 ③では顧客マスタから取得する列を選択します。今回は指定がないので、どれでも正解ですが、特定列を選ぶ場合は項目名を指定します。全ての場合はALLを指定になります。試験時はGROUPBY句を使用した際の制約を問われますので、後述の例題にて解説します。
例題2
商品マスタより、価格が1万円以上の商品のみ取得しましょう。
SELECT ③
FROM ①
WHERE ②;解答・解説
①products、②price >= 10000、③product_id, product_name, price
本例題では②の条件について説明します。 今回の条件は「価格が1万円以上」になりますので、使用する列はpriceになります。 〇〇以上は不等号の「>」「<」を使用し、今回は1万円以上なので、「≧10000」をSQLで表すと「>= 10000」になります。以下の場合は不等号が逆に「<=」となります。
例題3
売上明細から非会員の顧客の売上を取得しましょう。
SELECT ③
FROM ①
WHERE ②;解答・解説
①sales、②customer_id IS NULL、③sales_id, sales_date, store_id, customer_id, product_id, quantity
本例題でも②の条件について説明します。 売上明細から非会員のデータを取得する=列:customer_idを使用することになります。 その中でも今回は非会員のため、会員idが割り振られていないデータは空欄(=NULL)となります。 NULLを条件に指定する場合、例題①の「=」は使用できず、IS句を使用します。 そのため、今回の例題では「= NULL」ではなく、「IS NULL」が回答になります。
あるあるのひっかけなので、気をつけましょう!
例題4
店舗ごとの売上件数を集計しましょう。
SELECT ③
FROM ①
GROUP BY ②;解答・解説
①sales、②store_id、③store_id, COUNT(*) AS sales_count
まず皆さん、売上件数を集計するためには売上明細から取得する必要があるため、①FROM句ではsalesを指定しましょう。 ②GROUP BY句では集計する単位を項目で指定します。本例題では「店舗ごと」のため、売上明細で店舗を指す項目:store_idになります。 今回のサンプルデータにはないですが、例えば、各店舗の年代別で集計したい場合はstore_id、ageのように集計単位が細かくなればなるほどGROUP BY句でしている項目も増えます。 ③SELECT句ではGROUP BY句を使用した際、集計項目と集計関数以外は指定できないという制約が発生します。 本例題の場合、項目は②で指定したstore_idのみになります。集計関数は売上件数の取得のため、データの行数(レコード数)を数えるのにCOUNTを使用します。 COUNT(*)に含まれているアスタリスクや AS sales_countは本例題で指定できなくてもOKです。 重要なのは②の項目と集計関数がしっかり③で選べているかが重要です。
例題5
商品ごとの総販売数量を集計しましょう。
SELECT ③
FROM ①
GROUP BY ②;解答・解説
①sales、②product_id、③product_id, SUM(quantity) AS total_quantity
本例題では①を割愛して②から解説します。 今回の集計単位は「商品ごと」になりますので、②で指定するのはproduct_idになります。 その他の集計単位は特にないため、②は以上になり、③に移ります。 ③では②で指定した項目:product_idに加え、総販売数量を算出するため、SUM()を使用します。 今回は販売数量の合計のため、項目:quantityをSUM(quantity)のように集計する項目名を関数の中に追加します。 SQLにはその他に様々な関数がありますが、行数のカウント:COUNT、合計:SUM、平均:AVGあたりを押さえておけば十分だと思います。
例題6
販売数量の合計が3以上の商品だけを表示しましょう。
SELECT ④
FROM ①
GROUP BY ②
HAVING ③;解答・解説
①sales、②product_id、③SUM(quantity) >= 3、④product_id, SUM(quantity) AS total_quantity
本例題では販売数量を集計後、3以上の条件でデータを抽出する問題です。 この問題で注意する点はGROUP BYで集計した項目を条件で絞る際、WHERE句を使用できないことです。 冒頭でSQLの実行順序が関係しています。 WHERE句の順序を実行していただくと3番目ですが、GROUP BY句は4番目です。このため、GROUP BYで集計する前にWHEREで条件を絞り込む処理が実行され、期待通りの処理にはならないです。 GROUP BYで集計後の条件を指定する際、HAVING句を使用する必要があります。 そのため、③で指定する条件文はWHERE句の時と変わりはしませんが、配置する位置が変わります。 ④では先ほどの例題と同様にGROUP BY句で使用した項目名と集計関数のみになります。
例題7
売上明細を販売数量が多い順に表示しましょう。
SELECT ③
FROM ①
ORDER BY ②;解答・解説
①sales、②quantity DESC、③sales_id, sales_date, store_id, product_id, quantity
売上明細から販売数量を取得するため、①salesになることはわかるかと思います。 ②のORDER BY句では指定した項目を昇順(小さい順)、降順(大きい順)に並べ替えます。 本例題では多い順なので、DESCを使用します。少ない順はASCを使用します。 ③のSELECT句はGROUP BYを使用していないため、制約はないです。何か項目を選べていたら正解になります。
例題8
売上明細に店舗名と商品名を紐づけて表示しましょう。
SELECT ⑦
FROM ①
LEFT JOIN ② ON ③
LEFT JOIN ④ ON ⑤
ORDER BY ⑥;解答・解説
①sales AS s、②stores AS st、③s.store_id = st.store_id、④products AS p、⑤s.product_id = p.product_id、⑥s.sales_id、⑦s.sales_id, s.sales_date, st.store_name, p.product_name, s.quantity
本例題では、①〜⑤を適切に選べるようになりましょう。 設問から「売上明細に〇〇」と売上明細に他テーブルのデータを紐づけるよう指定されていますので、複数テーブルを紐づける際、JOIN句を使用します。主となるテーブルは売上明細なので、①salesになります。②では紐づけるテーブルを指定します。今回は「店舗名」が設問では先に指定されているので、店舗マスタを②storesにて指定します。③では売上明細を店舗マスタと紐付けする項目を指定します。売上明細と店舗マスタで共通して含まれている項目としてstore_idがあります。データを見ていただくとわかりますが、売上明細のstore_idを店舗マスタと照合すると店舗名やエリアの情報が取得できそうな気がしませんか?このように紐付け可能な項目同士を「テーブル名.項目名=テーブル名.項目名」をON句の後に置くことでデータの紐付けが可能になります。 ④と⑤でも同様に商品名を紐づけるため、④productの商品マスタを指定します。⑤では売上明細と商品マスタを紐づけるため、共通して含まれている項目(今回の場合、product_idを商品マスタと照合して商品名を取得できそうじゃないですか?)を「テーブル名.項目名=テーブル名.項目名」で指定します。 ⑥以降は解説を割愛しますが、先ほどまでの例題をベースに考えていただくと解けるかと思います。
過去問で実際に学ぼう
例題を使用して、SQLの実行順序に基づいて見ていただきました。
ここでは1つ過去問を使用して解きましょう。
使用するのはR7年度で没になった問題です。
没問になったのは選択肢に解答がなかったためですが、例題を通してSQLの基本を押さえている方はなぜ没になったのかわかるかと思いますので、なぜ没になったのか考えてみてください。



解説
本題では②の選択肢に解答がありませんでした。
GROUP BY句を使用した際の制約としてGROUP BYで使用した項目と集計関数以外の以外の項目はSELECT句で指定することができません。そのため、本題ではSELECT句で指定されている3つの項目は必ず②に含まれている必要があります。本題では該当する選択肢が含まれていないため、正解が存在しない没問となりました。
本番では没問となり、全受験生が正解となりましたが、上記説明している項目を見るだけで瞬時に正解がないことが見抜けるため、GROUP BY句の制約は覚えておきましょう。
最後に:まだまだ時間ある。SQLを得点源にしましょう
本日は情シスのSQLに関して基礎に絞って解説しました。
ITに馴染みがない方は大変な科目だと思いますが、理解すると設問を読まなくてもSQLをみるだけで正解を導けますので得点源にしましょう!
最後に余談で少しマニアックな話もさせてください。
SQLはプログラミング言語ではなく、データベース操作言語の分類には入りますが、言語の扱いやすさと実行速度から大発明であると言われています。
世の中のシステムのほとんどで使われている言語であり、データが豊富な企業では非エンジニアでもSQLを書ける人が多いです。
診断士試験を通して興味を持ってもらえると嬉しいです!

明日は最近野菜に向き合っている「そうる」、よろしく〜

野菜見たくない、、
☆☆☆☆☆
いいね!と思っていただけたらぜひ投票(クリック)をお願いします!
ブログを読んでいるみなさんが合格しますように。
にほんブログ村
にほんブログ村のランキングに参加しています。
(クリックしても個人が特定されることはありません)



