SQL練習問題10選|SELECT文からJOINまで実践で身につける
SQLの基本を練習問題で学べる実践ガイド。SELECT、WHERE、GROUP BY、JOINなど、よく使うSQL文を10問の練習問題で身につけます。
editor

チョットデキルの編集部です。プログラミング学習に役立つ情報をお届けします。
SQLは書籍や動画で文法を学んだだけでは、なかなか身につきません。実際に手を動かしてクエリを書くことで、はじめてデータベース操作の感覚がつかめるようになります。本記事では、実務でも頻出するSQL文を10問の練習問題として用意しました。SELECT文の基本から、WHERE、ORDER BY、GROUP BY、JOIN、サブクエリまで、段階的に難易度を上げていきます。SQLとは?の基本概念を押さえた上で取り組むと、より理解が深まります。
SQL 練習問題 とは
実務で頻出する SELECT / WHERE / JOIN / GROUP BY のパターンを、初級から中級まで段階的に解いていく問題集のことです。手を動かして覚えるのが SQL 上達の最短ルートです。
TL;DR 早わかりサマリー
- SQL は手を動かさないと身に付かない言語です。練習問題 10 本をやり切れば、業務で 8 割の場面に対応できる土台ができます
- SELECT → WHERE → JOIN → GROUP BY → サブクエリ → ウィンドウ関数、の順で難易度を上げるのが王道
- 問題はブラウザで動く SQL Playground、SQLite、DB Fiddle で全て試せます
- 答え合わせだけで終わらせず、自分で書き換えて何度も試すのが上達の鍵
練習用テーブルの構成
本記事の練習問題では、以下の2つのテーブルを使用します。
employees テーブル
| id | name | department_id | salary | hire_date |
|---|---|---|---|---|
| 1 | 佐藤太郎 | 1 | 450000 | 2020-04-01 |
| 2 | 鈴木花子 | 2 | 520000 | 2019-07-15 |
| 3 | 田中一郎 | 1 | 380000 | 2022-01-10 |
| 4 | 高橋美咲 | 3 | 600000 | 2018-03-20 |
| 5 | 伊藤健太 | 2 | 480000 | 2021-06-01 |
| 6 | 渡辺直美 | 1 | 410000 | 2023-02-14 |
| 7 | 山本翔太 | 3 | 550000 | 2020-11-01 |
| 8 | 中村裕子 | 2 | 500000 | 2017-09-01 |
| 9 | 小林大輔 | 4 | 470000 | 2022-08-15 |
| 10 | 加藤彩 | 4 | 430000 | 2024-01-05 |
departments テーブル
| id | name | location |
|---|---|---|
| 1 | 営業部 | 東京 |
| 2 | 開発部 | 大阪 |
| 3 | 人事部 | 東京 |
| 4 | マーケティング部 | 福岡 |
問題1: 全カラムの取得(SELECT基本)
問題: employeesテーブルから、全社員のすべての情報を取得してください。
ヒント: すべてのカラムを取得するには、カラム名の代わりにワイルドカードを使います。
解答:
SQL クエリ
SELECT * FROM employees;解説: SELECT文はSQLの最も基本的な命令です。*(アスタリスク)はすべてのカラムを意味します。実務では必要なカラムだけを指定する方がパフォーマンス面で望ましいですが、データの全体像を確認したいときにSELECT *は便利です。
問題2: 特定カラムの取得(SELECT応用)
問題: employeesテーブルから、社員の名前(name)と給与(salary)だけを取得してください。
ヒント: SELECTの後に取得したいカラム名をカンマ区切りで指定します。
解答:
SQL クエリ
SELECT name, salary FROM employees;解説: 必要なカラムだけを指定してデータを取得するのは、SQL操作の基本です。カラムが多いテーブルでSELECT *を使うと、不要なデータまで取得してしまい処理が遅くなることがあります。取得するカラムを明示する習慣をつけましょう。
問題3: 条件付きの絞り込み(WHERE)
問題: 給与が500000円以上の社員の名前と給与を取得してください。
ヒント: WHERE句で条件を指定します。比較演算子>=を使います。
解答:
SQL クエリ
SELECT name, salary FROM employees WHERE salary >= 500000;解説: WHERE句はSELECT文に条件を追加するために使います。=、!=、>、<、>=、<=といった比較演算子のほか、BETWEEN、IN、LIKEなどの条件指定も可能です。WHERE句を使いこなすことが、SQLの実務スキルに直結します。
問題4: 複数条件の組み合わせ(AND / OR)
問題: department_idが1で、かつ給与が400000円以上の社員の名前、部署ID、給与を取得してください。
ヒント: 複数の条件を同時に満たす場合はANDを使います。
解答:
SQL クエリ
SELECT name, department_id, salary
FROM employees
WHERE department_id = 1 AND salary >= 400000;解説: ANDは両方の条件を同時に満たす行だけを返します。一方、ORはどちらか一方の条件を満たす行を返します。条件が複雑になる場合は括弧を使って優先順位を明確にすることが重要です。例えばWHERE (A OR B) AND Cのように書くと意図が明確になります。
問題5: 並べ替え(ORDER BY)
問題: 全社員の名前と入社日を、入社日が新しい順に並べて取得してください。
ヒント: ORDER BY句で並べ替えの基準を指定します。降順(新しい順)にはDESCを使います。
解答:
SQL クエリ
SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;解説: ORDER BY句はデータの並べ替えを行います。ASC(昇順、デフォルト)またはDESC(降順)を指定できます。複数のカラムで並べ替えることも可能で、ORDER BY salary DESC, name ASCのようにカンマ区切りで指定します。最初の基準が同じ値の場合、次の基準で並べ替えが行われます。
問題6: 集計関数(COUNT / AVG)
問題: 全社員の平均給与と、社員の総数を取得してください。
ヒント: 平均にはAVG関数、件数にはCOUNT関数を使います。
解答:
SQL クエリ
SELECT AVG(salary) AS avg_salary, COUNT(*) AS total_employees
FROM employees;解説: 集計関数はデータ全体を集約して1つの値を返します。代表的な集計関数にはCOUNT(件数)、SUM(合計)、AVG(平均)、MAX(最大値)、MIN(最小値)があります。AS句でカラムに別名を付けると、結果が読みやすくなります。
問題7: グループ化と集計(GROUP BY)
問題: 部署ごとの社員数と平均給与を取得してください。
ヒント: GROUP BY句で部署IDごとにグループ化し、集計関数を適用します。
解答:
SQL クエリ
SELECT department_id, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;解説: GROUP BY句は指定したカラムの値が同じ行をグループにまとめます。グループごとに集計関数を適用できるため、「部署ごとの平均給与」や「年ごとの売上合計」といった分析に使います。SELECT句にはGROUP BYで指定したカラムと集計関数だけを書くのが基本ルールです。
問題8: グループの絞り込み(HAVING)
問題: 社員数が3人以上の部署について、部署IDと社員数を取得してください。
ヒント: GROUP BYの結果に対する条件指定にはHAVING句を使います。WHEREではなくHAVINGを使う点に注意してください。
解答:
SQL クエリ
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) >= 3;解説: WHERE句はグループ化の前に個々の行を絞り込みますが、HAVING句はグループ化の後に集計結果で絞り込みます。「平均給与が500000円以上の部署」のように、集計結果に対して条件を付けたい場合にHAVINGを使います。WHEREとHAVINGの使い分けは頻出の面接質問でもあります。
問題9: テーブル結合(JOIN)
問題: 社員の名前、給与、所属部署名を一覧で取得してください。
ヒント: employeesテーブルとdepartmentsテーブルをJOINで結合します。結合条件はemployees.department_idとdepartments.idの一致です。
解答:
SQL クエリ
SELECT e.name, e.salary, d.name AS department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;解説: JOINは複数のテーブルを関連付けてデータを取得する、リレーショナルデータベースの核心的な機能です。INNER JOIN(単にJOINとも書く)は両方のテーブルに一致するデータがある行だけを返します。テーブルに別名(エイリアス)を付けると、カラム名の指定が簡潔になります。JOINの種類としてはLEFT JOIN、RIGHT JOIN、FULL JOINなどもあり、SQL vs NoSQLで触れたリレーショナルDBの強みはこのJOIN機能にあります。
問題10: サブクエリ
問題: 全社員の平均給与よりも高い給与を受け取っている社員の名前と給与を取得してください。
ヒント: まず平均給与を求めるクエリを作り、それをWHERE句の中で使います。
解答:
SQL クエリ
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);解説: サブクエリ(副問合せ)は、クエリの中に別のクエリを埋め込む手法です。内側のクエリが先に実行され、その結果が外側のクエリの条件として使われます。この例では、まずAVG(salary)で平均給与が計算され、その値よりも高い給与の社員が抽出されます。サブクエリはWHERE句だけでなく、FROM句やSELECT句でも使用でき、複雑なデータ抽出を可能にします。
練習を重ねるためのポイント
上記の10問を解き終えたら、次のステップとして応用問題に挑戦してみましょう。
組み合わせて使う: 実務のクエリでは、WHERE、JOIN、GROUP BY、ORDER BYを1つのクエリ内で組み合わせることが一般的です。例えば「東京にある部署の社員について、部署ごとの平均給与を高い順に表示する」といった問題を自分で作って解いてみてください。
実行環境を用意する: SQLは実際に実行して結果を確認することが上達の近道です。MySQLやPostgreSQLをローカル環境にインストールするか、DB Fiddleのようなオンラインツールを活用すると手軽に試せます。
エラーを読む力をつける: SQL学習の過程では構文エラーに何度も遭遇します。エラーメッセージには問題の箇所や原因が書かれているため、慌てずにメッセージを読む習慣をつけることが重要です。
練習環境の選び方 — 4 つの選択肢
SQL を練習するなら、次のいずれかで OK です。
1. SQL Playground (ブラウザ完結) インストール不要で、ブラウザで SQL を書ける環境。本記事のサンプルもこれで試せます。最も低コストで始められます。
2. SQLite 1 ファイルで完結する軽量 DB。Python / 各種 GUI ツールから扱え、PC 1 台で完結します。本格的に学ぶならこれ。
3. DB Fiddle / SQL Fiddle ブラウザ完結で MySQL / PostgreSQL / SQL Server などのエンジンを切り替えられます。エンジン別の挙動差を試すのに便利。
4. Docker + PostgreSQL/MySQL 本番に近い環境で練習したいなら Docker。後の業務で同じセットアップを使うので、慣れておくと良いです。
練習問題を解く上での 5 つのコツ
問題を解くだけでなく、次の 5 つの姿勢で取り組むと習熟が早いです。
1. まず自分で考える 答えを見る前に 5-10 分は手を動かします。間違えた SQL を実行してエラーメッセージを読む経験が、最大の学習材料です。
2. EXPLAIN で実行計画を確認 同じ結果が返る SQL でも、実行計画によって速度が 100 倍違うこともあります。EXPLAIN を打って実行計画を読む習慣を持ちます。
3. 別解を考える JOIN とサブクエリで同じ結果が出ることが多いです。両方書き比べて、可読性と性能を比較します。
4. データを少し変えて試す 「もし NULL があったら?」「もし重複があったら?」と仮定を変えて試すと、SQL の挙動が深く理解できます。
5. 業務シナリオで考える 「マーケがこの数字を欲しがったらどう書く?」のように、実務シナリオに変換して練習すると、応用力がぐっと上がります。
関連リソース
よくある質問
Q. SQL の練習は何時間くらい必要ですか
A. 基礎をひととおり押さえるなら 20-30 時間、業務で十分使えるレベルなら 50-100 時間が目安です。1 日 1 時間で 1-3 ヶ月のイメージです。
Q. MySQL / PostgreSQL / SQL Server のどれで学ぶべきですか
A. 基本構文はほぼ共通なので、最初はどれでも構いません。業務で使う DB に合わせるのが現実的です。迷ったらシェアが大きい PostgreSQL か MySQL を選んでください。
Q. SQL を業務で使う場面はどんなときですか
A. データ抽出 / レポート作成 / 不具合調査 / マーケ分析 / 経営ダッシュボード作成など、多くのビジネス職で使います。非エンジニアにとっても SQL は最も投資対効果の高いスキルの 1 つです。
Q. SQL ができれば BI ツールは不要ですか
A. 用途が違います。SQL は柔軟性が高く深い分析向き、BI ツール (Tableau / Looker / Power BI) はダッシュボード共有や定期レポート向きです。両方の使い分けが理想です。
Q. ウィンドウ関数まで学ぶ必要がありますか
A. 業務で深く使うなら必須です。ROW_NUMBER, LAG, LEAD, 移動平均など、サブクエリで書くより遥かに簡潔に書けます。中級レベルの線引きはウィンドウ関数を使えるかどうか、が一つの目安です。
Q. AI に SQL を書かせれば自分で書けなくてもいい?
A. AI に頼るほど、SQL の読解力が重要になります。AI が間違った JOIN を生成した、無駄なサブクエリを書いた、を見抜けないと事故が起きます。SQL を読める力は今後も必須です。詳しくは SQL とは を参照してください。
ハンズオン Step-by-Step
ブラウザ完結の SQL Fiddle を使い、5 分で 3 問解いてみます。
Step 1. 練習用テーブルを作る
http://sqlfiddle.com/ で SQLite (WebSQL) を選び、Schema パネルに次を貼って Build します。
SQL クエリ
CREATE TABLE orders (id INTEGER, user_id INTEGER, amount INTEGER, region TEXT);
INSERT INTO orders VALUES (1, 1, 1000, 'east');
INSERT INTO orders VALUES (2, 2, 2500, 'west');
INSERT INTO orders VALUES (3, 1, 500, 'east');
INSERT INTO orders VALUES (4, 3, 1800, 'west');
INSERT INTO orders VALUES (5, 2, 700, 'east');Step 2. 問題 1: 全 region と合計金額を出す
Query パネルに貼って Run。region ごとの合計が 2 行で返ります。
SQL クエリ
SELECT region, SUM(amount) AS total
FROM orders
GROUP BY region;Step 3. 問題 2: 1000 円以上の注文だけを user_id 別に集計
WHERE → GROUP BY の順で考えると整理しやすくなります。
SQL クエリ
SELECT user_id, SUM(amount) AS total
FROM orders
WHERE amount >= 1000
GROUP BY user_id;Step 4. 問題 3: 合計金額が大きい順 TOP 2
ORDER BY と LIMIT を組み合わせれば、ランキング集計はすぐに作れます。
SQL クエリ
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
ORDER BY total DESC
LIMIT 2;解けたら次は JOIN にチャレンジしましょう。詳しい解説は SQL 完全ガイド を参照してください。
まとめ
本記事では、SQLの基本であるSELECT文から、WHERE、ORDER BY、GROUP BY、HAVING、JOIN、サブクエリまでを10問の練習問題で扱いました。これらはデータベースを扱う仕事において日常的に使用する構文です。繰り返し手を動かして書くことで、クエリの組み立て方が自然と身につきます。
SQLをさらに体系的に学びたい方は、SQLコースで実際のデータベースを操作しながら学習できます。練習問題だけでは得られない、テーブル設計やインデックスの考え方まで含めた実践的なカリキュラムを用意しています。
関連記事
次に読むべきリソース
- 学習を始めたい方 — SQL 入門コース
- 深く理解したい方 — SQL 完全ガイド
- 無料相談したい方 — LuaGate 無料相談
出典・参考リンク
本記事の主張・数値・仕様に関する根拠は、以下の一次情報・公式ドキュメントを参照しています。リンク先の更新により内容が変わる場合があるため、最新情報は各公式サイトで確認してください。
- PostgreSQL 公式ドキュメント (Tutorial)
- MySQL 公式リファレンスマニュアル
- SQLite Documentation
- MDN Web Docs (SQL)
- PostgreSQL 公式ドキュメント
- ISO/IEC 9075 (SQL 標準) 概要
この記事について
- 監修: 生田 陸人 (LuaGate エンジニア / 大手 IT 企業現役エンジニア)
- 公開: 2026-05-28
- 最終更新: 2026-05-28
- カテゴリ: データベース
- 検証環境: PostgreSQL 16 / MySQL 8.x / SQLite 3.45
- 編集ポリシー: 公式ドキュメント・公的統計を一次情報として優先し、社内エンジニアが実機検証した内容のみを掲載しています。修正提案や事実誤認の指摘は チョットデキル運営 までお寄せください。