Courses
SQLスキルを活かせる新たな機会を探している求職者であれ、会社の採用面接で候補者に質問する採用担当者であれ、よくあるSQL面接の質問と回答を知っておくことは不可欠です。
この記事では、2026年版のSQL面接の質問と回答99選を掲載し、準備・学習・採用を効果的に進めるための主要なSQLトピックを以下の観点から整理しています。
- 基礎知識: RDBMS、キー、SQL方言の明確な定義。
- 技術の習熟: DDLとDML、制約、インデックスの深掘り。
- クエリロジック: 結合、サブクエリ、集約関数の解説。
- 実践的応用: n番目に大きい値の取得や重複削除などの実務的なコーディング解法。
- シナリオ型質問: 累積和、重複検出、ギャップ分析などを扱う面接スタイルの課題。
さらに知識とスキルを高めたい場合は、データエンジニアリング、クラウド技術、AWSの包括的なコースもぜひご覧ください。
SQL面接質問の概観
SQLの面接は、人が実際に言語を学ぶプロセスに近い形で進む傾向があります。
初期段階では、結合とは何か、SELECTの動作、DDLとDMLの違いといった語彙や文法が中心です。
慣れてくると、焦点は「クエリを書けるか」から「正しいクエリを書けるか」へ移ります。インデックスが効く場面、正規化の意義、DELETEとTRUNCATEの微妙な違いなど、内部的な挙動が理解できるようになります。
上級レベルでは文法は前提となり、本当の試金石は問題解決力です。重複やNULL、タイ(同順位)、ウィンドウ関数やCTEによるランキングロジックの扱い、トランザクション・同時実行・パフォーマンスに関する思考が問われます。
中級者向け
-
SQLの関数。集約関数とスカラー関数、ビルトイン関数とユーザー定義関数を把握しておきましょう。
-
高度なコマンド。結合、主キーと外部キー、インデックス、テーブル間のリレーションなどが問われることがあります。
-
データベース設計。正規化・非正規化、
DELETE、TRUNCATE、DROPなどSQL文の違いが話題になります。 -
高度なクエリ。入れ子および相関サブクエリ、列のn番目に大きい値を見つけるなどの特定タスクの方法が問われる場合があります。
一般的なSQL面接の質問
技術的な質問の前に、面接官はSQLの全般的な経験について一般的な質問をすることがあります。\
SQLの経験が限られていても心配はいりません。履歴書から面接官は既に把握しているはずです。それでも面談に進んでいるということは、応募者として十分適合すると判断されたということです。また、1つのSQL方言しか使ったことがなくても問題ありません。SQL方言はかなり似通っています。1つを使いこなせていれば、他を学ぶうえで強固な土台になります。
1. SQLとは?
Structured Query Language(構造化問い合わせ言語)の略で、リレーショナルデータベース管理システム(RDBMS)と対話するためのプログラミング言語です。テーブルからのデータの取得・更新・挿入・削除などを含みます。
2. SQL方言とは?例を挙げてください。
有償・無償を含むSQLの各種バージョンはSQL方言とも呼ばれます。文法は非常によく似ており、追加機能の違いがわずかにある程度です。例として、Microsoft SQL Server、PostgreSQL、MySQL、SQLite、T-SQL、Oracleなどがあります。
3. SQLの主な用途は?
SQLを使うと、次のことができます。
- データベース内のテーブルの作成・削除・更新
- テーブル内のデータへのアクセス、操作、変更
- 1つまたは複数のテーブルから必要な情報の取得や要約
- 特定の行や列の追加・削除
初心者向けSQL面接の質問
面接官はウォーミングアップとして、次のような易しい質問から始めるかもしれません。
4. SQLステートメントとは?
SQLコマンドとも呼ばれます。SQLエンジンが合法的なコマンドとして解釈し、実行する文字列です。例として、SELECT、CREATE、DELETE、DROP、REVOKEなどがあります。
5. SQLクエリとは?
データベースのデータにアクセスしたり変更したりするためにSQLで記述されたコードの一片です。
SQLクエリには、データ取得用とデータ更新用の2種類があります。前者は必要なデータの取得に使われ(制限・グループ化・並べ替え・複数テーブルからの抽出なども含む)、後者はデータの作成・追加・削除・更新・名称変更に使われます。
6. SQLサブクエリとは?
インナー・クエリとも呼ばれ、あるクエリ内に配置されたクエリ(外側のクエリ)です。サブクエリはSELECT、FROM、WHERE、UPDATEなどの句で使用できます。サブクエリの中にさらにサブクエリを入れることも可能です。最も内側のサブクエリが最初に実行され、その結果が外側のクエリ(またはサブクエリ)に渡されます。
7. SQLジョイン(結合)とは?
2つ以上のテーブルからレコードを結合・取得するための句です。テーブル間の列の関係に基づいて結合します。SQLの結合入門チュートリアルや、SQL結合の面接質問ガイドも参考になります。
8. SQLコメントとは?
特定のコード片が何をするかを人間に分かりやすく説明する注釈です。SQLのコメントは、行頭にダブルハイフン--を付ける単一行、または/*comment_text*/のように複数行にわたる形式があります。SQLエンジン実行時にはコメントは無視されます。将来コードを読む人の理解を助けるために記述します。
9. SQLエイリアスとは?
特定のSQLクエリを実行する間に、テーブル(またはテーブル内の列)に一時的に与える名称です。可読性向上やコードの簡潔化のために用います。エイリアスはASキーワードで導入します。
SELECT col_1 AS column
FROM table_name;
技術的なSQL面接の質問
ここからは技術的なSQLの質問と、その回答例に進みます。
技術質問に答える際は、できるだけ正確に簡潔に答えるのが最善です。話が逸れて見えたり、自信のない追加質問を招く恐れがあります。
SQLでは同じ結果を複数の方法で得られることが多く、さらにPythonやRなど他の言語と容易に統合でき、相乗効果が期待できます。
10. 知っているSQLコマンドの種類は?
- データ定義言語(DDL) – データベースの構造を定義・変更する。
- データ操作言語(DML) – データベース内のデータにアクセス・操作・変更する。
- データ制御言語(DCL) – ユーザーのアクセス権限の制御や付与・剥奪を行う。
- トランザクション制御言語(TCL) – データベース内のトランザクションを制御する。
- データ問い合わせ言語(DQL) – 必要な情報を取得するために問い合わせを実行する。
11. 一般的なSQLコマンドの例は?
-
DDL:
CREATE、ALTERTABLE、DROP、TRUNCATE、ADD COLUMN -
DML:
UPDATE、DELETE、INSERT -
DCL:
GRANT、REVOKE -
TCL:
COMMIT、SET TRANSACTION、ROLLBACK、SAVEPOINT -
DQL: –
SELECT
12. DBMSとは?どんな種類がありますか?
Database Management System(データベース管理システム)の略で、データベースに保存されたデータに対して、アクセス・更新・加工・挿入・削除などの操作を行うソフトウェアです。関係型、階層型、ネットワーク型、グラフ型、オブジェクト指向型など、データの組織化・構造化・保存方法に基づくさまざまなタイプがあります。
13. RDBMSとは?例を挙げてください。
Relational Database Management System(リレーショナルDBMS)の略です。複数のテーブルが共有キーで相互に関連付けられたデータを扱う際に最も一般的に使われます。SQLはRDBMSと対話するために設計されました。RDBMSの例として、MySQL、PostgreSQL、Oracle、MariaDBなどがあります。
14. SQLにおけるテーブルとフィールドとは?
テーブルは、行と列からなる表形式で関連データを整理して保存したものです。フィールドはテーブルの列を指す別名です。
15. SQLサブクエリの種類は?
- 単一行 – 高々1行を返す。
- 複数行 – 少なくとも2行を返す。
- 複数列 – 少なくとも2列を返す。
- 相関 – 外側のクエリの情報に依存するサブクエリ。
- 入れ子 – サブクエリの中にさらにサブクエリを含む。
16. 制約とは?なぜ使うのですか?
テーブル各列に入力可能なデータの種類を定義する条件の集合です。制約はテーブルのデータ整合性を保証し、望ましくない操作を防ぎます。
17. 知っているSQL制約は?
-
DEFAULT– 列に既定値を与える。 -
UNIQUE– 重複を許さない。 -
NOT NULL– NULLを許さない。 -
PRIMARY KEY– 一意かつNULL不可(NOT NULLとUNIQUE)。 -
FOREIGN KEY– 2つ以上のテーブル間で共有キーを提供する。
18. 結合の種類は?
-
(INNER) JOIN– 両(全)テーブルで結合条件を満たすレコードのみを返す。デフォルトの結合。 -
LEFT (OUTER) JOIN– 左テーブルの全レコードと、右テーブルで条件を満たすレコードを返す。 -
RIGHT (OUTER) JOIN– 右テーブルの全レコードと、左テーブルで条件を満たすレコードを返す。 -
FULL (OUTER) JOIN– 両(全)テーブルの全レコードを返す。LEFTとRIGHTの組み合わせとみなせる。
注意: FULL OUTER JOINはPostgreSQL、SQL Server、Oracle、MySQL 8.0以降でサポートされていますが、MySQLではUNIONパターンでのみ実現可能です。一方、SQLiteはRIGHT JOINをサポートせず、UNIONと組み合わせたLEFT JOINで代替可能です。
19. SQLの主キーとは?
列(または複数列)にPRIMARY KEY制約を課し、その列の値が一意かつNULL不可であることを保証したものです。言い換えると、主キーはNOT NULLとUNIQUEの組み合わせです。主キーはテーブルの各レコードを一意に識別します。
関連概念 — 代理キー: 代理キーは、実データの値とは独立して各レコードに割り当てられる人工的な識別子(通常は連番整数やUUID)です。自然キー(例: メールアドレス)と異なり、ビジネスデータが変わっても安定しているため、本番データベースの主キーとして広く用いられます。
各テーブルが定義できるPRIMARY KEYは高々1つ(複合主キーは可)です。PRIMARY KEY は強く推奨されますが、すべてのエンジンで絶対必須ではありません。
20. SQLの一意キー(UNIQUEキー)とは?
列(または複数列)にUNIQUE制約を課し、その列の値が一意になるよう保証するものです。NULL(1つのみ)を含む場合があります。
注意:
- SQL Server: フィルタ付きインデックスを用いない限り、
NULLは1つのみ許容。 - PostgreSQL / Oracle / MySQL:
NULL <> NULLであるため、複数のNULLが許容されます。
21. SQLの外部キーとは?
列(または複数列)にFOREIGN KEY(またはUNIQUEキー)の制約を課し、当該列を他テーブル(複数も可)の主キーに関連付けるものです。外部キーはデータベース内の複数テーブルを結び付ける目的で用いられます。
22. SQLインデックスとは?
テーブルに関連付けられた特別なデータ構造で、重要な部分を保持し、高速な検索・取得を可能にします。特に大規模データベースで有効で、クエリ性能を大幅に高めます。
23. インデックスの種類は?
- 一意インデックス – 重複を許さず、データ整合性を保つ。
- クラスタ化インデックス – テーブルの物理的なレコード順序を定義し、キー値に基づいて検索する。テーブルに1つのみ。
- 非クラスタ化インデックス – 実データの物理順序とは一致しないレコード順序を保持する。データとインデックスが別領域にあり、複数作成可能。
24. スキーマとは?
テーブル、ストアドプロシージャ、インデックス、関数、トリガーなどの構造要素の集合です。データベース全体のアーキテクチャを示し、各オブジェクト間の関係やアクセス権限を定義します。詳細はデータベーススキーマガイドを参照してください。
25. SQLオペレーターとは?
特定の操作を実行するためにSQLクエリで用いる予約文字・文字の組合せ・キーワードです。多くはWHERE句と併用し、データを絞り込む条件を設定します。
26. SQLオペレーターの種類は?
-
算術(
+、-、*、/など) -
比較(
>、<、=、>=など) -
複合代入(
+=、-=、*=、/=など) -
論理(
AND、OR、NOT、BETWEENなど) -
文字列(
%、_、+、^など) -
集合(
UNION、UNION ALL、INTERSECT、MINUS(またはEXCEPT))
27. 句(clause)とは?
目的の結果を得るためにデータを絞り込む、SQLクエリに課す条件です。例:WHERE、LIMIT、HAVING、LIKE、AND、OR、ORDER BYなど。
28. SELECTクエリと共に使う代表的な句は?
代表例はFROM、GROUP BY、JOIN、WHERE、ORDER BY、LIMIT、HAVINGです。
29. テーブルを作成するには?
CREATE TABLEステートメントを使用します。例:定義済みデータ型の3列を持つテーブルを作成するには次の構文を用います。
CREATE TABLE table_name (col_1 datatype,
col_2 datatype,
col_3 datatype);
30. テーブルを更新するには?
UPDATEステートメントを使用します。構文:
UPDATE table_name
SET col_1 = value_1, col_2 = value_2
WHERE condition;
31. データベースからテーブルを削除するには?
DROP TABLEステートメントを使用します。構文: DROP TABLE table_name;。
32. テーブル内のレコード数を取得するには?
集約関数COUNT()にアスタリスクを引数として渡します: SELECT COUNT(*) FROM table_name;。
33. レコードを並べ替えるには?
ORDER BYを使用します。
SELECT * FROM table_name
ORDER BY col_1;
降順はDESCで指定し、デフォルトは昇順です。複数列での並べ替えや列ごとの昇降順指定も可能です。例:
SELECT * FROM table_name
ORDER BY col_1 DESC, col_3, col_6 DESC;
34. テーブルの全列を選択するには?
アスタリスク*をSELECTと併用します。構文: SELECT * FROM table_name;。
35. 2つのテーブルで共通のレコードを選ぶには?
次のようにINTERSECTを使用します。
SELECT col1, col2 FROM table_1
INTERSECT
SELECT col1, col2 FROM table_2;
注意: INTERSECTは同数の列と互換型が必要です。
36. DISTINCTステートメントとは?使い方は?
テーブル列から重複を除外し一意の値のみを返すために、SELECTと併用します。構文:
SELECT DISTINCT col_1
FROM table_name;
37. リレーションシップとは?例を挙げてください。
エンティティ間の結び付き・相関関係を指し、データベース内で2つ以上のテーブルがどのように関連しているかを意味します。例えば、同一顧客のIDが売上テーブルと顧客テーブルの両方に存在する、といった関係です。
38. NULL値とは?ゼロや空白との違いは?
NULLは、テーブルのあるセルにデータが存在しないことを示します。ゼロは有効な数値、空文字は長さ0の合法な文字列です。
39. SQLとNoSQLの違いは?
SQLデータベースはリレーショナルで構造化され、事前定義スキーマを持つテーブルを使用します。一方、NoSQLデータベースは非リレーショナルでスキーマレス、非構造化または半構造化データの処理に適しています。
40. SQLデータベースでよくある課題は?
大規模データの性能チューニング、インデックス戦略の管理、制約によるデータ整合性の確保、同時トランザクションの扱い、クエリ実行の最適化などが挙げられます。
中級レベルのSQL面接の質問
41. 共通テーブル式(CTE)とは?
共通テーブル式(CTE)は、一時的に名前を付けた結果セットで、SELECT、INSERT、UPDATE、DELETE文内で参照できます。CTEはクエリの可読性を高め、複雑な処理を再利用可能な単位に分割できます。構文はWITHキーワードを使います。
WITH sales_summary AS (
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id
)
SELECT p.product_name, s.total_sales
FROM products p
JOIN sales_summary s ON p.id = s.product_id
WHERE s.total_sales > 10000;
CTEは、(組織図のような)階層データに対する再帰クエリや、同じサブクエリを複数回参照する必要がある場合に特に有用です。
42. ウィンドウ関数とは?集約関数との違いは?
ウィンドウ関数は、現在行に関連する行集合に対して計算を行いますが、集約関数のように結果を1行に潰しません。行集合はOVER()句で定義します。
代表的なウィンドウ関数:
ROW_NUMBER()– 各行に一意の連番を付与RANK()– タイに同順位を付与し、順位番号に欠番が生じるDENSE_RANK()– タイに同順位を付与し、欠番は生じないLAG()/LEAD()– 前/次の行のデータにアクセスSUM() OVER()、AVG() OVER()– ランニング/累積計算
例: 売上の累積合計を計算
SELECT
order_date,
amount,
SUM(amount) OVER (ORDER BY order_date) AS running_total
FROM orders;
43. RANK()、DENSE_RANK()、ROW_NUMBER()の違いは?
いずれもランキング用のウィンドウ関数ですが、タイの扱いが異なります。
ROW_NUMBER()– タイでも常に一意の連番(1, 2, 3, 4...)RANK()– タイに同順位を付与し、次の順位に欠番(1, 2, 2, 4...)DENSE_RANK()– タイに同順位を付与し、欠番なし(1, 2, 2, 3...)
SELECT
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num,
RANK() OVER (ORDER BY score DESC) AS rank,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM students;
タイが同順位として扱われる「n番目に高い」値の取得にはDENSE_RANK()が適しています。
このセクションでは、中級のSQLでよく問われる質問と回答を確認し、面接で何が期待されるか把握できるようにします。
44. SQLの関数とは?
特定のタスクで頻用するSQL文の集合を表すデータベースオブジェクトです。関数は入力パラメータを受け取り、それに基づく計算や処理を行い、結果を返します。関数は可読性を高め、同一コード片の繰り返しを避けます。
45. SQL関数の種類は?
- 集約関数 – 複数(通常はグループ化された)レコードに対して動作し、単一値(通常はグループごと)を返す。
- スカラー関数 – 各個の値に対して動作し、単一値を返す。
また、SQL関数には、システムが定義したビルトイン関数と、ユーザーが作成するユーザー定義関数があります。
46. 知っているSQL集約関数は?
-
AVG()– 平均値 -
SUM()– 合計値 -
MIN()– 最小値 -
MAX()– 最大値 -
COUNT()– NULLを含む行数
47. 知っているSQLスカラー関数は?
-
LEN()(他方言ではLENGTH())– 文字列長(空白含む) -
UCASE()(他方言ではUPPER())– 大文字化 -
LCASE()(他方言ではLOWER())– 小文字化 -
INITCAP() – タイトルケース化(各単語の先頭を大文字) -
MID()(他方言ではSUBSTR())– 部分文字列の抽出 -
ROUND()– 指定桁数へ四捨五入 -
NOW()– 現在日時
48. 大文字小文字操作関数とは?
文字関数の一部で、テキストデータの大小文字を変換します。上記の関数で大文字・小文字・タイトルケースへ変換できます。
-
UCASE()(他方言ではUPPER())– 大文字化 -
LCASE()(他方言ではLOWER())– 小文字化 -
INITCAP()– タイトルケース化
49. 文字列操作関数とは?
文字関数の一部で、テキストデータを加工します。
-
CONCAT()– 複数文字列を連結 -
SUBSTRING()/SUBSTR()– 指定範囲の部分文字列を返す -
LENGTH()(他方言ではLEN())– 文字列長(空白含む) -
REPLACE()– 指定の部分文字列を別の文字列に置換 -
INSTR()– 指定の部分文字列の位置を返す -
LPAD()/RPAD()– 右寄せ/左寄せ用に左/右側へパディング -
TRIM()– 指定文字や空白を左右または両端から除去
50. ローカル変数とグローバル変数の違いは?
ローカル変数は宣言された関数内でのみアクセス可能です。グローバル変数は関数外で宣言され、固定的なメモリ構造に保持され、プログラム全体で利用できます。
51. SQLとPL/SQLの違いは?
SQLはリレーショナルデータベースの問い合わせ・管理のための標準言語で、主にデータの操作と取得に用いられます。PL/SQL(Procedural Language/SQL)はOracleデータベースで使用されるSQLの拡張で、ループや条件分岐、例外処理などの手続き型構文を備え、複雑なビジネスロジックをデータベース内に実装できます。Oracleについての知識が問われる場合に備えたレビューとして、 Top 20 PL/SQL Interview Questions and Answersもあります。
52. LEFT JOINとLEFT OUTER JOINの違いは?
LEFT JOINとLEFT OUTER JOINに違いはありません。互換であり、OUTERキーワードは省略可能です。LEFT JOINはLEFT OUTER JOINの短縮形です。いずれも左テーブルの全レコードと右テーブルの一致レコードを返します。
53. SQLのインデックス付与(Indexing)とは?性能はどう向上しますか?
インデックスは、データの検索を効率化する特別なデータ構造を作成し、テーブル全走査の必要性を減らします。最適化されたルックアップテーブルのように機能します。ただし、過度なインデックスは、インデックスの保守が発生するため、挿入・更新・削除を低速化させる場合があります。
54. ストアドプロシージャとは?関数との違いは?
ストアドプロシージャは、タスクを実行するためにひとまとまりとして事前コンパイルされたSQL文の集合です。データやスキーマオブジェクトの変更、トランザクション管理、複数の結果セットの返却などが可能です。関数は通常SQL式内で用いられ、値(スカラーまたはテーブル型)の返却が必須で、多くのDBでは副作用が制限されます。DBによって挙動は異なり(例: T-SQLにはスカラー関数とテーブル値関数、PostgreSQLは関数とプロシージャを区別)、詳細は各DBに依存します。
55. ORDER BYのデフォルトの並び順と変更方法は?
デフォルトは昇順です(NULLS FIRST/LASTはDBにより異なる)。列ごとにASC/DESCを指定します。
SELECT * FROM table_name
ORDER BY col_1 DESC;
56. SQLの集合演算子とは?
-
UNION– 2つのクエリの少なくとも一方で得られたレコード(重複除外) -
UNION ALL– 2つのクエリの少なくとも一方で得られたレコード(重複含む) -
INTERSECT– 両方のクエリで得られたレコード -
EXCEPT(MySQLとOracleではMINUS)– 第1クエリでのみ得られ、第2クエリでは得られないレコード
57. パターンマッチングで使用する演算子は?
LIKE演算子と%、_のワイルドカードを組み合わせます。%は0文字以上の任意文字、_はちょうど1文字を表します。
58. 主キーと一意キーの違いは?
いずれも列の一意性を保証しますが、主キーはテーブルの各レコードを一意に識別し、一意キーは列の重複を防ぐ点が異なります。
59. 複合主キーとは?
複数列を基に定義されたテーブルの主キーです。
60. SELECT文の典型的な句の並び順は?
SELECT – FROM – JOIN – ON – WHERE – GROUP BY – HAVING – ORDER BY – LIMIT
61. インタプリタがSELECTクエリの一般的な句を実行する順序は?
こちらがSQLの実行順序です。
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT/OFFSET (FETCH)
62. ビューとは?
1つ以上のテーブル(や他のビュー)から取得したデータのサブセットを含む仮想テーブルです。標準ビューはデータを保持しませんが、マテリアライズドビューは保持します。ビューはクエリを簡素化し、ロジックをカプセル化し、権限と組み合わせることで列/行を制限できます。複数テーブルの結合や集約も可能です。
63. ビューを別のビューに基づいて作成できますか?
可能です。入れ子ビューとも呼ばれます。ただし多重の入れ子は可読性・デバッグ性を損なうため避けるべきです。
64. 元のテーブルを削除してもビューは使えますか?
いいえ。基底テーブルを削除すると、そのテーブルに基づくビューは無効になります。使用しようとするとエラーになります。
65. SQLのリレーションの種類は?
- 一対一 – 一方の各レコードが他方の1レコードのみに対応
- 一対多 – 一方の各レコードが他方の複数レコードに対応
- 多対多 – 双方の各レコードが複数レコードに対応
66. BOOLEAN型の取りうる値は?
PostgreSQLのような方言ではBOOLEAN型が明示的に存在し、TRUE、FALSE、NULLを取ります。Microsoft SQL Serverのような方言ではBIT型で1(true)と0(false)として格納します。
67. 正規化とは?
データの冗長性・依存・重複・不整合を減らすよう、データを整理・再構成するデータベース設計のプロセスです。これにより、データ整合性の向上、テーブル数の適切な分割、効率的なアクセスやセキュリティ制御、柔軟なクエリが実現します。
68. 非正規化とは?
非正規化は正規化と逆で、冗長性を導入し、複数テーブルのデータを統合します。読み取りが重視される場面で、複雑な結合を避け、クエリ時間を短縮し、データベースのパフォーマンスを最適化します。
69. 列名の変更とエイリアスの付与の違いは?
列名の変更は、元テーブル内の実際の名前を恒久的に変えることです。エイリアスは、SQLクエリ実行中のみの一時的な名称で、コードの可読性と簡潔性を高めるために使います。
70. 入れ子サブクエリと相関サブクエリの違いは?
相関サブクエリは、外側のクエリの値を参照して実行され、外側に依存します。非相関サブクエリは外側に依存せず独立して実行可能です。
71. クラスタ化と非クラスタ化インデックスの違いは?
クラスタ化インデックスはテーブルの物理的なレコード順序を定義し、キーに基づき検索します。非クラスタ化は実データの物理順序と一致しない順序を保持します。クラスタ化は1つ、非クラスタ化は複数作成可能です。
72. CASE()関数とは?
SQLにおけるif-then-elseロジックの実装方法です。WHEN句の条件を順に評価し、最初に満たしたTHENの値を返します。いずれも満たさなければELSEがあればその値、なければNULLを返します。構文:
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
WHEN condition_3 THEN value_3
...
ELSE value
END;
73. DELETEとTRUNCATEの違いは?
DELETEはDMLで、WHERE句の条件に基づいて1行以上を削除します。トランザクション(ROLLBACK)で巻き戻せる場合のみ可逆です。
TRUNCATEはDDLで、ページの割当て解除により全行を削除します。高速ですが一般に不可逆で、外部キー参照のあるテーブルには使用できません。
74. DROPとTRUNCATEの違いは?
DROPはテーブル構造や制約、他テーブルとの関係、権限を含め、テーブルを完全に削除します。 TRUNCATEはテーブルの全行を削除しますが、構造や制約は残ります。 いずれもDDLです。DROPはテーブルとメタデータを削除し、TRUNCATEは全行を削除して定義を残します。性能やトランザクションの挙動はDBエンジンに依存します。
75. HAVINGとWHEREの違いは?
HAVINGはグループ化後の集約データに対して作用し、WHEREは各行を個別に評価します。両方を用いる場合の順序はWHERE – GROUP BY – HAVINGで、SQLエンジンの解釈順も同様です。
76. テーブルにレコードを追加するには?
INSERT INTO とVALUESを使用します。構文:
INSERT INTO table_name
VALUES (value_1, value_2, ...);
77. テーブルからレコードを削除するには?
DELETEを使用します。構文:
DELETE FROM table_name
WHERE condition;
この方法で、条件を満たす複数行を削除することもできます。
78. テーブルに列を追加するには?
ALTER TABLEとADDを使用します。構文:
ALTER TABLE table_name
ADD column_name datatype;
79. テーブルの列名を変更するには?
ALTER TABLEとRENAME COLUMN ... TO ...を使用します。構文:
ALTER TABLE table_name
RENAME COLUMN old_column_name TO new_column_name;
80. テーブルから列を削除するには?
ALTER TABLEとDROP COLUMNを使用します。構文:
ALTER TABLE table_name
DROP COLUMN column_name;
81. 偶数行/奇数行のみを選択するには?
2で割った余りを判定します。PostgreSQLやMySQLではMOD、Microsoft SQL ServerやSQLiteでは剰余演算子(%)を使います。偶数行を選ぶ例(MOD使用):
SELECT * FROM table_name
WHERE MOD(ID_column, 2) = 0;
偶数行(%使用):
SELECT * FROM table_name
WHERE ID_column % 2 = 0;
奇数行は、いずれも=の代わりに不等号<>を用います。
82. クエリで重複を防ぐには?
SELECTとDISTINCTを併用するか、テーブルにUNIQUEキーを作成します。
83. 多数の行を挿入するには?
INSERT INTOとVALUESを使用します。構文:
INSERT INTO table_name
VALUES (value_1, value_2, ...),
(value_3, value_4, ...),
(value_5, value_6, ...),
...;
84. 列のn番目に大きい値を求めるには?
タイを正しく扱うためにウィンドウ関数を用います。
SELECT column_name
FROM (
SELECT column_name, DENSE_RANK() OVER (ORDER BY column_name DESC) AS rnk
FROM table_name
) t
WHERE rnk = :n;
タイを無視してn番目の行を取得する場合: ORDER BY column_name DESC OFFSET n-1 ROWS FETCH NEXT 1 ROW ONLY.
85. 文字列列で特定の文字で始まる値を探すには?
LIKEと%、_を使います。例えば姓が「A」で始まるレコードを探す場合:
SELECT * FROM table_name
WHERE surname LIKE 'A_';
姓が1文字「A」だけの可能性も含めるなら、次のとおり:
SELECT * FROM table_name
WHERE surname LIKE 'A%';
86. テーブルで最後のidを取得するには?
最も簡単なのは集約関数MAX()を使う方法です。
SELECT MAX(id) AS highest_id
FROM table_name;
別法:ORDER BYとLIMIT(またはTOP)を使う方法。
SELECT id
FROM table_name
ORDER BY id DESC
LIMIT 1;
87. ランダムな行を選ぶには?
RAND()(PostgreSQLではRANDOM())をORDER BYとLIMITと併用します。以下はMySQLで5行を返す例:
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 5;
シナリオ別SQL面接の質問
シナリオ型の質問は、SQLで実際のビジネス課題を解く力を試します。構文知識だけでなく、重複、NULL、タイなどの端ケースへの対応力や問題解決アプローチが評価されます。
88. 重複レコードを検出・削除するには?
重複の検出:
SELECT email, COUNT(*) AS duplicate_count
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
重複の削除(1件を残す):
WITH duplicates AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (SELECT id FROM duplicates WHERE rn > 1);
この方法では、CTEとROW_NUMBER()で重複を特定し、最小IDのレコードを残します。
89. 累積和(ランニングトータル)を計算するには?
SUM()ウィンドウ関数をORDER BY付きで使用します。
SELECT
transaction_date,
amount,
SUM(amount) OVER (ORDER BY transaction_date) AS running_total
FROM transactions;
カテゴリごと(例: 顧客別)の累積:
SELECT
customer_id,
transaction_date,
amount,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY transaction_date
) AS customer_running_total
FROM transactions;
90. 部署平均より高給の従業員を見つけるには?
典型的な相関サブクエリの例です。
SELECT e.name, e.department, e.salary
FROM employees e
WHERE e.salary > (
SELECT AVG(salary)
FROM employees
WHERE department = e.department
);
ウィンドウ関数を用いる方法:
SELECT name, department, salary
FROM (
SELECT
name,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
) t
WHERE salary > dept_avg;
91. 数列の欠番(例: 伝票番号の抜け)を見つけるには?
LEAD()で次の値と比較します。
SELECT
invoice_number,
LEAD(invoice_number) OVER (ORDER BY invoice_number) AS next_invoice,
LEAD(invoice_number) OVER (ORDER BY invoice_number) - invoice_number - 1 AS gap_size
FROM invoices
WHERE LEAD(invoice_number) OVER (ORDER BY invoice_number) - invoice_number > 1;
連番の差が1を超える箇所を特定します。
92. 連続する月に購入した顧客を見つけるには?
LAG()で前行と比較します。
WITH monthly_purchases AS (
SELECT
customer_id,
DATE_TRUNC('month', purchase_date) AS purchase_month,
LAG(DATE_TRUNC('month', purchase_date)) OVER (
PARTITION BY customer_id
ORDER BY DATE_TRUNC('month', purchase_date)
) AS prev_month
FROM purchases
GROUP BY customer_id, DATE_TRUNC('month', purchase_date)
)
SELECT DISTINCT customer_id
FROM monthly_purchases
WHERE purchase_month = prev_month + INTERVAL '1 month';
93. 行を列にピボットするには?
CASEを用いた条件付き集計を使います。
SELECT
product_name,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1 THEN amount ELSE 0 END) AS jan_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2 THEN amount ELSE 0 END) AS feb_sales,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3 THEN amount ELSE 0 END) AS mar_sales
FROM sales
GROUP BY product_name;
一部のデータベース(SQL Server、Oracle)にはネイティブなPIVOT構文があります。
94. 各カテゴリで売上上位3商品の抽出方法は?
DENSE_RANK()とPARTITION BYを使用します。
WITH ranked_products AS (
SELECT
category,
product_name,
SUM(sales_amount) AS total_sales,
DENSE_RANK() OVER (
PARTITION BY category
ORDER BY SUM(sales_amount) DESC
) AS sales_rank
FROM sales
GROUP BY category, product_name
)
SELECT category, product_name, total_sales
FROM ranked_products
WHERE sales_rank <= 3
ORDER BY category, sales_rank;
95. トランザクションのACID特性とは?
ACIDは、信頼性の高いデータベーストランザクションを保証する4特性の頭字語です。
- Atomicity(原子性): 「全て行うか、全く行わないか」– 一連の操作が全て成功するか、何も反映されない
- Consistency(一貫性): 定義されたルールや制約を保ち、DBをある正しい状態から別の正しい状態へ移行させる
- Isolation(分離性): 同時実行トランザクションが互いに干渉せず、各トランザクションは一貫したスナップショットを見る
- Durability(耐久性): コミット後の変更は、システム障害が起きても保持される
トランザクション例:
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
96. デッドロックとは?どのように防ぎますか?
2つ以上のトランザクションが互いのロック解除を待ち合い、循環待ちでいずれも進めなくなる状況です。
例: トランザクションAがテーブルXをロックしてYを待ち、BがテーブルYをロックしてXを待つ。
防止策:
- ロック取得順の統一: すべてのトランザクションで同じ順序でロックを取得
- トランザクションを短く: 速やかにコミットまたはロールバック
- 適切な分離レベル: 低めの分離でロック競合を軽減
- 必要なデータのみアクセス: 不要な行のロックを避ける
- デッドロック再試行の実装: 多くのDBはデッドロックを自動検知し、一方をロールバック
97. 遅いSQLクエリを最適化するには?
主な最適化戦略:
-
適切なインデックス:
WHERE、JOIN、ORDER BYに使う列に作成 -
実行計画の分析: ボトルネック特定に
EXPLAIN(PostgreSQL/MySQL)やEXPLAIN PLAN(Oracle)を使用 -
SELECT *の回避: 必要な列のみ取得
-
サブクエリよりJOIN: 相関サブクエリより
JOINが効率的な場合が多い -
結果件数を制限: すべて不要なら
LIMIT/TOPを使用 -
インデックス列での関数使用回避:
WHERE YEAR(date_col) = 2026はインデックスを使えない可能性。代わりにWHERE date_col >= '2026-01-01' -
パーティショニング検討: 非常に大きなテーブルは日付やカテゴリで分割
98. 計算や比較でNULLをどう扱う?
NULLは欠損・不明値を表すため、特別な扱いが必要です。
-
比較:
= NULLではなくIS NULLやIS NOT NULLを使用 -
COALESCE(): 最初の非
NULLを返す:COALESCE(column, 'default') -
NULLIF(): 2値が等しいと
NULLを返す:NULLIF(a, b) -
ISNULL() / NVL(): DB固有のNULL代替関数
SELECT
name,
COALESCE(phone, email, 'No contact') AS contact_info,
CASE WHEN status IS NULL THEN 'Unknown' ELSE status END AS status
FROM customers;
99. ユーザーの連続ログイン最長日数を求めるには?
高度な「島とギャップ」問題です。
WITH login_groups AS (
SELECT
user_id,
login_date,
login_date - ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY login_date
) * INTERVAL '1 day' AS group_id
FROM user_logins
)
SELECT
user_id,
MIN(login_date) AS streak_start,
MAX(login_date) AS streak_end,
COUNT(*) AS streak_length
FROM login_groups
GROUP BY user_id, group_id
ORDER BY streak_length DESC
LIMIT 1;
各日付から行番号を引くことで、連続日が同じ「group_id」になるのがポイントです。
チームのSQLスキルを底上げする
SQL面接の準備は求職者や採用担当者にとって重要ですが、企業にとってはチームの継続的なSQLトレーニングに投資することも同様に重要です。データ活用の重要性が高まる中、従業員が強固なSQLスキルを持つことは、企業の成功を左右し得ます。
チーム全体のSQL習熟を目指すリーダーや経営者の方は、DataCamp for Businessのカスタマイズ可能なトレーニングをご検討ください。基礎から高度な概念まで習得できるよう支援します。提供内容:
- ターゲット型学習パス: 現在のスキルや業務ニーズに合わせてカスタマイズ可能
- 実践的トレーニング: 学習定着を促す実務シナリオと演習
- 進捗トラッキング: 学習目標の達成を可視化・評価するためのツール
DataCampのようなプラットフォームでSQLスキルを強化することは、チームの能力向上だけでなく、競争力の維持と成果創出の観点でも戦略的な優位性につながります。弊社チームまでご連絡のうえ、デモのご依頼をご検討ください。
まとめ
本記事では、初級・中級・シナリオ別の必須SQL面接質問99選と、その適切な回答を解説しました。SQL職を目指す方も、中級レベルのSQL人材を採用する方も、面接準備に役立ち自信を持てる内容になっているはずです。
面接対策としてさらなるトレーニングが必要と感じたら、SQLコース一覧もご覧ください。
FAQs
SQLはどうやって学び始めればよいですか?
SQL学習を始めるには、データベースの基本概念とリレーショナルデータベース管理システムから取り組むのがよいでしょう。DataCampには、Introduction to SQL、Data Analyst in SQL Career Track、SQLチートシートなど多数の入門リソースがあります。あるいは、SQLコース一覧からすべての教材を参照してください。
実務的なSQLの練習問題はどこで見つかりますか?
DataCampのプラットフォームには、あらゆるレベルに対応したスキル研鑽用のSQLプロジェクトが多数あります。
初心者向けの一般的なSQL面接の質問は?
初心者には、SELECTとINSERTの違い、データベースのキー(主キー・外部キー)の役割、WHERE句を使った単一テーブルからの基本的なデータ取得クエリなど、基本概念の説明が求められることが多いです。
中級者向けの一般的なSQL面接の質問は?
中級者には、結合(INNER、LEFT、RIGHT、FULL)、サブクエリ、集約とグループ化(GROUP BY)、UNION・INTERSECT・EXCEPTなどの集合演算、さらにパフォーマンス最適化に関する問題など、より複雑な概念が問われます。
SQL面接にはどう準備すべきですか?
SQL面接の準備として以下に取り組んでください。
- SQLの基礎と発展的概念の復習
- 代表的な課題を解くクエリの練習
- データベース設計と正規化の理解
- 応募先が使うSQL方言(PostgreSQL、MySQL、SQL Serverなど)への習熟
- オンラインのサンプル問題や面接質問の演習
技術的なSQL面接では何が問われ、どう示せばよいですか?
技術面接では、SQL構文、データベース設計、クエリ最適化、SQLを用いた問題解決力が問われます。スキルを示すには:
- 問題を解く際の思考プロセスを言語化する練習をする
- ホワイトボードやオンライン環境でエラーのないSQLを書けるようにする
- 結合、サブクエリ、トランザクションなどの複雑概念を例で説明できるようにする
- 実務でのデータベース経験を語り、課題や最適化の取り組みを具体的に示す
特定のSQL方言を学ぶ重要性と、重点的に学ぶべき方言は?
SQLの中核構文はRDBMS間で共通ですが、各システム(MySQL、PostgreSQL、SQL Server、Oracle)には固有の方言や機能があります。特定のRDBMSを使う職種を目指す場合、その方言の学習は重要です。キャリア目標や業界で一般的な方言に注力しましょう。ただし、標準SQLの基礎が強ければ、他方言への適応は容易です。
SQL面接対策のための無料リソースはありますか?
はい。現在、大学の教員または学生であれば、DataCamp Classroomsを利用して、プレミアムカタログ全体を無料でご利用いただけます。これにはSQLトラックや認定資格も含まれます。
また、無料のSQL Basicsチートシートもご覧ください。
2026年の面接に向けて最重要のSQLトピックは?
重点的に学ぶべき領域は次のとおりです。(1) 結合とサブクエリ:INNER/LEFT/RIGHT/FULL、相関・非相関サブクエリの理解;(2) ウィンドウ関数:ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD、累積計算;(3) CTE:読みやすく保守しやすいクエリの作成;(4) 集約とGROUP BY:HAVINGの使い方も含む;(5) クエリ最適化:インデックス戦略と実行計画。
ROW_NUMBER、RANK、DENSE_RANKの違いは?
いずれもランキング用ウィンドウ関数ですが、タイの扱いが異なります。ROW_NUMBER()はタイでも一意の連番(1, 2, 3, 4)を付与、RANK()はタイに同順位を付与し次の番号を飛ばす(1, 2, 2, 4)、DENSE_RANK()はタイに同順位を付与し番号を飛ばさない(1, 2, 2, 3)。タイを同順位とする「n番目に高い」値の取得にはDENSE_RANKが有用です。