中小企業診断士のSQL対策|SELECT・WHERE・JOINを図解で完全整理【経営情報システム】

中小企業診断士 SQL対策 アイキャッチ画像

U

経営情報システムの科目でSQLが出てきたとき、最初は「プログラミングみたいで難しそう」と思ってしまいました。

でも実際に学んでみると、SQLは特定の構文を覚えれば読み解けるようになる、比較的パターンの決まった分野だとわかりました。

今回は、試験に出やすいポイントを中心に、SQLの基礎を図解で整理してみます。

中小企業診断士試験の科目の中でも、「経営情報システム」は苦手科目になりやすい分野として知られています。とりわけSQLに関する問題を見ると、アルファベットや記号が並んでいるため、プログラミングのように感じてしまい、「IT経験がない自分には難しい」と考えてしまう受験生も少なくありません。

しかし、この認識は大きな誤解です。SQLは高度なプログラムを書くための技術ではなく、データを取り出すためのルールを定めた言語に過ぎません。基本構造を理解すれば、むしろ試験では得点しやすい論点になります。

出題パターンは比較的安定しており、SELECT・FROM・WHEREといった基本構造や、条件分岐、テーブルの結合といったポイントを理解していれば、多くの問題を読み解くことができます。ここでは、SQLを初めて学ぶ受験生でも理解できるように、仕組みと重要ポイントを具体例と図表を交えながら整理します。

目次

データベースとSQLが必要な理由

SQLを学ぶ前に、まず「なぜデータベースが必要なのか」を押さえておくと、SQLの役割が見えてきます。

Excel 〜数千行まで対応 手動操作しやすい 大量データは困難 データが 膨大に データベース 数百万行も高速処理 複数ユーザーで共有 セキュリティ管理 SQL データを取り出す言語

企業では売上・在庫・顧客情報などが毎日追加され続けます。Excelでは限界がある大量データを管理するのがデータベースで、そこから「必要な情報だけを取り出す」ための言語がSQL(Structured Query Language)です。

U

最初は「エンジニアが使う特殊な言語」というイメージがあったのですが、SQLは「どのテーブルから・どの条件で・何を取り出すか」を日本語に近い感覚で書ける言語なんですね。構文を覚えてしまえば、あとはパターン認識で解けるようになってきました。

SQLの基本構造|SELECT・FROM・WHERE の3要素

SQLのほぼすべての文は、次の3つのキーワードで構成されています。この骨格を頭に入れておくと、複雑な文を見ても分解して読めるようになります。

SELECT 商品名, 価格 — ① どの列を取り出すか
FROM 売上テーブル — ② どのテーブルから
WHERE 価格 >= 500; — ③ どの条件で絞り込むか
② FROM テーブルを指定する ③ WHERE 条件で行を絞り込む ① SELECT 表示する列を選ぶ 実行順序:1番目 実行順序:2番目 実行順序:3番目(最後)

SQLは書いた順番ではなく、FROM → WHERE → SELECT の順で処理されます。「まずテーブル全体を指定し、条件で行を絞り込み、最後に表示する列を選ぶ」という流れです。

WHERE句と比較演算子|試験で差がつく境界値

次のような飲料の売上テーブルを例に、WHEREの使い方を確認します。

商品ID商品名価格販売数地域
001コーヒー300120東京
002緑茶20085大阪
003紅茶50060東京
004ほうじ茶35040名古屋
005抹茶ラテ60095大阪
演算子意味
=等しい地域 = ‘東京’
<>等しくない地域 <> ‘東京’
>より大きい(その値は含まない)価格 > 500
>=以上(その値を含む)価格 >= 500
<より小さい(その値は含まない)販売数 < 100
<=以下(その値を含む)販売数 <= 100
BETWEEN A AND BA以上B以下(両端を含む)価格 BETWEEN 300 AND 500
IN (…)リスト内のいずれかに一致地域 IN (‘東京’,’大阪’)
LIKE ‘〜%’前方一致(% は任意の文字列)商品名 LIKE ‘抹茶%’
IS NULL値が空(NULL)である販売数 IS NULL
試験頻出ポイント|境界値
「500円以上」と「500円より大きい」は別物です。
価格 >= 500(以上)→ 500円の商品は含まれる
価格 > 500(より大きい)→ 500円の商品は含まれない
BETWEEN も両端を含みます。BETWEEN 300 AND 500 は 300・350・500 の3件が該当します。
— 価格が500円以上の商品
SELECT 商品名, 価格
FROM 売上テーブル
WHERE 価格 >= 500;

— 東京または大阪の商品
SELECT 商品名, 地域
FROM 売上テーブル
WHERE 地域 IN (‘東京’, ‘大阪’);

集計関数と GROUP BY|地域別・商品別の集計

SQLでは行を集計するための関数が使えます。GROUP BY と組み合わせると、グループ別の集計が可能です。

関数内容使用例
COUNT(*)行数を数えるCOUNT(*) → 件数
SUM(列名)合計値SUM(販売数) → 総販売数
AVG(列名)平均値AVG(価格) → 平均価格
MAX(列名)最大値MAX(価格) → 最高価格
MIN(列名)最小値MIN(価格) → 最低価格
— 地域ごとの販売数合計
SELECT 地域, SUM(販売数) AS 販売数合計
FROM 売上テーブル
GROUP BY 地域;

— 合計100件以上の地域のみ(HAVING はGROUP BY後の絞り込み)
SELECT 地域, SUM(販売数) AS 販売数合計
FROM 売上テーブル
GROUP BY 地域
HAVING SUM(販売数) >= 100;
POINT|WHERE と HAVING の違い
WHERE:GROUP BY ので行を絞り込む(個々の行に条件を適用)
HAVING:GROUP BY のでグループを絞り込む(集計結果に条件を適用)
WHERE SUM(販売数) >= 100 はエラーになります。集計関数はWHEREでは使えません。
U

WHERE と HAVING の使い分けは最初に混乱しやすいポイントでした。「WHERE は行を絞る・HAVING はグループを絞る」と言葉で整理しておくと、試験問題を読むときに落ち着いて判断できるようになりました。

CASE式|条件によって表示内容を切り替える

CASE式は、条件によって返す値を切り替える機能です。顧客の購入金額によってランク分けするような場面で使われます。

SELECT 商品名, 価格,
        CASE
          WHEN 価格 >= 500 THEN ‘高価格帯’
          WHEN 価格 >= 300 THEN ‘中価格帯’
          ELSE ‘低価格帯’
        END AS 価格帯
FROM 売上テーブル;
商品名価格価格帯(CASE式の結果)
コーヒー300中価格帯
緑茶200低価格帯
紅茶500高価格帯
ほうじ茶350中価格帯
抹茶ラテ600高価格帯

JOIN|2つのテーブルを横につなぐ

実際の業務では、データは複数のテーブルに分かれて管理されています。JOINを使うと、共通の列(キー)をもとに2つのテーブルを横方向に結合できます。

売上 テーブル 商品 テーブル INNER JOIN 「商品ID」をキーに結合
売上テーブル
注文ID商品ID数量
A0010013
A0020031
A0030012
商品テーブル
商品ID商品名価格
001コーヒー300
002緑茶200
003紅茶500
SELECT s.注文ID, p.商品名, s.数量, p.価格
FROM 売上テーブル s
INNER JOIN 商品テーブル p
ON s.商品ID = p.商品ID;
注文ID商品名数量価格
A001コーヒー3300
A002紅茶1500
A003コーヒー2300

INNER JOINは両方のテーブルに存在するデータのみを結合します。一方にしか存在しないデータは結果に含まれません。LEFT JOINを使うと、左テーブルのデータをすべて残し、一致しない右テーブルの列はNULLになります。

U

「どちらが左・右か」は、FROM句に書いたテーブルが左、JOIN句に書いたテーブルが右、と覚えると整理しやすくなりました。

UNION|テーブルを縦に積み上げる

UNIONは2つのSELECT文の結果を縦方向に結合します。例えば東京店と大阪店の売上データが別テーブルで管理されている場合、UNIONで一つにまとめられます。

SELECT 商品名, 販売数 FROM 東京店
UNION
SELECT 商品名, 販売数 FROM 大阪店;
CAUTION|UNIONの3つの条件(試験頻出)
① 結合する両方の SELECT 文の列数が同じであること
② 対応する列の順序が一致していること
③ 対応する列のデータ型が一致していること

列名の一致は不要です(結果の列名は最初のSELECT文の列名が使われます)。
また UNION は重複行を除去しますが、UNION ALL は重複を含めてすべての行を返します。

コンビニのレジで考えてみると

U

「SQLって抽象的でイメージが持ちにくいな」と感じていたとき、コンビニのデータ管理を思い浮かべてみたら少しすっきりしました。

Q
「昨日、おにぎりを3個以上買った人は何人?」
→ WHERE 商品名 = ‘おにぎり’ AND 数量 >= 3
Q
「カテゴリ別の売上合計を出したい」
→ GROUP BY カテゴリ + SUM(売上金額)
Q
「東京・大阪・名古屋の全店舗データをひとつにまとめたい」
→ UNION で3つの店舗テーブルを縦に結合

日常の「知りたいこと」がそのままSQLの構造に対応しています。試験問題を見るときも、「このSQLは日本語でいうと何を聞いているのか」と置き換えて考えると、正誤の判断がしやすくなります。

試験問題で確認してみましょう

経営情報システム|WHERE・BETWEEN 頻出 ★★★
次のSQL文を実行したとき、取得される行数として最も適切なものを選べ。

SELECT 商品名
FROM 商品テーブル
WHERE 価格 BETWEEN 300 AND 500;
商品テーブルには価格が 200・300・350・500・600 円の5件のデータが入っている。
  • ア 1件
  • イ 2件
  • ウ 3件
  • エ 4件
解説
BETWEEN A AND B は「A以上かつB以下」を意味し、両端を含みます。300円・350円・500円の3件が該当します。200円(300未満)と600円(500超)は条件外です。境界値の「含む・含まない」の判断が正解の鍵になります。正解は
経営情報システム|UNION 頻出 ★★☆
UNIONを使って2つのSELECT文を結合する条件として、誤っているものを選べ。
  • ア 結合する両方のSELECT文の列数が一致していること
  • イ 対応する列のデータ型が一致していること
  • ウ 両方のテーブルに同じ列名が存在すること
  • エ UNIONは重複した行を自動的に除去する
解説
UNIONの条件は「列数・列の順序・データ型の一致」です。列名の一致は不要です。列名が異なっていても、列数とデータ型が一致していれば結合できます。結果の列名には最初のSELECT文の列名が使われます。誤りはです。

まとめ

  • SQLはデータベースからデータを取り出す言語。処理順序は FROM → WHERE → SELECT
  • SELECT・FROM・WHERE の3要素がSQLの骨格。この構造を読めれば大半の問題に対応できる
  • 比較演算子の境界値(>= と >、BETWEEN の両端を含む)は試験頻出。1点差に直結する
  • 集計関数(SUM・AVG・COUNT等)は GROUP BY と組み合わせてグループ別集計に使う
  • WHERE はGROUP BY の前・HAVING はGROUP BY の後の絞り込み。集計関数はWHEREでは使えない
  • CASE式は WHEN〜THEN〜ELSE〜END の構造で、条件に応じて返す値を切り替える
  • INNER JOIN は共通キーでテーブルを横に結合。両方に存在するデータのみ取り出す
  • UNION はテーブルを縦に結合。列数・順序・データ型の一致が必要。列名の一致は不要
U

SQLは最初こそ記号の羅列に見えますが、「どこから・何を・どんな条件で」という問いに答える構造だとわかると、問題を落ち着いて読み解けるようになりました。まずは SELECT・FROM・WHERE の流れを体に染み込ませるところから始めてみてください。同じように学び始めた方のお役に立てましたら嬉しいです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

中小企業診断士試験勉強中のアラフィフシングルマザーです。
大学卒業後から現在まで、数々の失敗をしながらずっと自営業として試行錯誤を重ねてきました。
もっときちんと経営やビジネスの知識を身につけて、将来は他の事業者の方のお役にも立てたらいいな、と思うようになり、中小企業診断士の試験に挑戦中です。

目次