Courses
データベース関連の求人票の多くで MySQL が要件になっていることに気づいたことはありませんか?それには理由があります。MySQL は、身近なソーシャルメディアから日々使うアプリまで、ほとんどあらゆるものを支えています。
このガイドでは、MySQL の面接質問に取り組めるようサポートします。ジュニア開発者が押さえておくべき基礎から、シニア職で求められる高度な内容まで、一通りをカバーします。さらに、次のデータ関連の面接で自信を持って臨むためのコツも共有します。
MySQL とは?
MySQL は、SQL を基盤とし、データを構造化されたテーブルに整理するオープンソースの RDBMS(リレーショナル・データベース管理システム)です。Oracle Corporation によって開発されました。
2024年には最も人気のある DBMSとしてランクインしました。ただし、2025年の Stack Overflow Developer Survey では、PostgreSQL がプロの開発者の間で最も広く使われるデータベースとして初めて MySQL を上回りました。
誤解のないように言うと、MySQL は依然として非常に人気が高く、2025年には開発者の 40.5% が利用しており、今も数え切れないほどの Web アプリケーション、コンテンツ管理システム、エンタープライズツールを支えています。特に Web アプリケーションや LAMP スタックに関わるなら、MySQL は一級のスキルです。

2024年、MySQL は世界で最も人気のあるオープンソース DBMS で、ランキングスコアは 1061。出典:Statista。
基本的な MySQL 面接質問
一次面接では、基本的なデータベースおよび MySQL の概念理解を測るための基礎的な質問が出ることがあります。
1. データベースとは何ですか?DBMS との違いは?
データベースは、アクセス・更新・分析が可能なデータを保持するストレージの入れ物です。たとえば、ソーシャルメディアは投稿に「いいね」した人の情報をデータベースに保存します。
DBMS(データベース管理システム)は、そのデータに対してユーザーを作成したりアクセス権を管理したりして、やり取りを可能にするソフトウェアです。MySQL は最も人気のある DBMS のひとつです。その他の例には PostgreSQL、MongoDB、Microsoft SQL Server などがあります。
2. MySQL は他の RDBMS とどう違いますか?
MySQL は、SQL を使ってデータを管理するオープンソースの RDBMS です。使いやすさ、速度、Web アプリケーションとの高い親和性で知られています。
他の RDBMS との違いは次のとおりです。
- シンプルさとパフォーマンス: MySQL はシンプルで最適化された性能が評価され、Web 開発者やスタートアップの定番となっています。
- 高度な機能: MySQL は使いやすさに優れる一方で、PostgreSQL などの他 RDBMS にある ACID トランザクションのより包括的なサポート、高度なインデックス、より幅広いデータ型などの高度な機能が不足する場合があります。
- ストレージエンジン: MySQL はテーブルごとに異なるストレージエンジン(例:InnoDB、MyISAM)を選択でき、用途に合わせた柔軟性があります。
MySQL はスピードとスケーラビリティが求められる場面に最適ですが、より複雑またはエンタープライズ向けの機能が必要なら PostgreSQL が適している場合もあります。
3. MySQL で利用できる主なデータ型は?
MySQL は以下のカテゴリのデータ型をサポートします。
-
数値:
INT、DECIMAL、FLOAT、DOUBLEなど -
文字列:
CHAR、VARCHAR、TEXT、BLOB -
日付/時刻:
DATE、DATETIME、TIMESTAMP、TIME -
JSON: JSON オブジェクトの保存用
4. INT と DECIMAL の違いは?
INT は小数点を持たない整数を保存します。端数が不要な場合に使います。対して DECIMAL は金額など、小数点を含む厳密な計算に適しています。
5. MySQL における DATE と DATETIME の違いは?
DATE は年・月・日の形式で日付を保存します。
YYYY-MM-DD
一方、DATETIME は日付に時刻を加えて、次のように保存します。
YYYY-MM-DD HH:MM:SS
6. 外部キーとは何ですか?データベースでどのように使いますか?
外部キーは、あるテーブルのフィールドが別のテーブルの主キーと関連付けられているものです。
たとえば、顧客情報を保存する customers テーブルでは、各顧客に一意の customer_id があります。購入履歴を保存する transactions テーブルでは、この customer_id を外部キーとして使用します。transactions テーブルの customer_id は、各購入を customers テーブル内の特定の顧客に関連付けます。
SQL では次のようになります。
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE transactions (
transaction_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
7. INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN の違いは?
結合は、関連する列に基づいて複数のテーブルの行を結合します。違いは次のとおりです。
-
INNER JOIN: 両方のテーブルで一致がある行のみを返します。
-
LEFT JOIN: 左側のテーブルの全行と、右側で一致する行を返します。一致しない場合、右側の列は
NULLになります。 -
RIGHT JOIN: LEFT JOIN と同様ですが、右側のテーブルを基準にします。
-
FULL JOIN:
LEFT JOINとRIGHT JOINの結果を合わせ、両テーブルの不一致行も含めます。注意: MySQL はFULL JOIN構文をネイティブにサポートしていません。同等の結果を得るには、LEFT JOINとRIGHT JOINのUNIONを使用します。
8. MySQL における DELETE、TRUNCATE、DROP の違いは?
DELETE、TRUNCATE、DROP は似て聞こえますが、挙動は異なります。
DELETE: 条件に基づいてテーブルから行を削除します。トランザクション内であればロールバック可能です。例:
DELETE FROM employees WHERE department_id = 5;
TRUNCATE: テーブルの全行を削除しますが、テーブル構造は残ります。DELETE より高速で、ロールバックできません。例:
TRUNCATE TABLE employees;
DROP: テーブル構造とデータを完全に削除し、インデックスなどの依存関係も含めて取り除きます。例:
DROP TABLE employees;
9. MySQL でテーブルの作成と変更はどう行いますか?例を示してください。
作成には CREATE TABLE、変更には通常 ALTER TABLE を使います。例:
テーブル作成:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department VARCHAR(50));
列の追加:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
10. SQL の一時テーブルとは?
一時テーブルは、現在のデータベースセッションの間だけ存在するテーブルです。セッションを閉じると削除されます。中間結果の一時保存に利用でき、テストやフィルタリング、恒久テーブルに挿入する前の準備に役立ちます。
例:
CREATE TEMPORARY TABLE temp_employees (
id INT,
name VARCHAR(50)
);
INSERT INTO temp_employees VALUES (1, 'John Doe');
SELECT * FROM temp_employees;
11. MySQL のサブクエリとは?例で説明してください。
サブクエリ(入れ子クエリ)は、別のクエリの内側に含まれるクエリです。複雑な処理を段階に分けて扱いやすくします。たとえば、平均給与より高い従業員を見つけるサブクエリは次のとおりです。
SELECT first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
仕組みはこうです。
-
内側のクエリ
SELECT AVG(salary) FROM employeesが先に平均給与を計算します。 -
外側のクエリがその平均を用いて、それより高い給与の従業員を抽出します。
12. MySQL で INSERT 文を使ってデータを追加する方法は?ベストプラクティスもありますか?
テーブルにデータを追加するには INSERT 文を使います。基本構文は次のとおりです。
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
INSERT のベストプラクティス:
-
列名は明示的に列挙する。コードが明確になり、後でテーブル構造が変わってもエラーを防げます。
-
AUTO_INCREMENTの ID などはINSERTから省略する。重複 ID を避けるため MySQL が自動処理します。 -
文字列のクォートは一貫させる。シングルクォートを好む人が多いですが、どちらでも構いません。
-
複数行を挿入する場合は、1 文でまとめるとパフォーマンスが向上します。
13. MySQL の AUTO_INCREMENT 属性の意義は?
AUTO_INCREMENT は、通常は主キー用の列に対して、一意で連番の値を自動生成します。
AUTO_INCREMENT 列を持つテーブルの作成例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
行の挿入例:
INSERT INTO employees (name, department) VALUES ('John Doe', 'Sales');
INSERT INTO employees (name, department) VALUES ('Jane Smith', 'Marketing');
14. MySQL のビューとは?
ビューは、保存されたクエリで、仮想テーブルのように機能します。複雑なクエリに名前を付けて保存し、以後テーブルのように利用できます。毎回クエリ全文を打ち直す必要がありません。
たとえば、従業員情報と部署名を簡単に照会するために、次のようにビューを作成できます。
CREATE VIEW employee_details AS
SELECT
e.id,
e.name,
d.department_name,
e.salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id;
作成した employee_details ビューはテーブルのように問い合わせできます。
SELECT * FROM employee_details;
ただし、ビュー経由での挿入や更新はできない場合があります。多くは読み取り専用を想定し、ユーザーの直接アクセスを制限することでデータのセキュリティを高めます。ビューはアクセスのたびに基になるクエリを実行するため、クエリが遅くなることもあります。
中級レベルの MySQL 面接質問
このセクションでは中級レベルのトピックを扱います。主に MySQL のデータ型や構造に関する知識を確認する質問です。
15. システムバージョン管理テーブルとは?どのように機能しますか?
システムバージョン管理テーブルは、テーブルで行われた変更の完全な履歴を保持します。各行の過去バージョンを保持するため、監査やデータ復旧に利用できます。
各行が有効な期間を記録するために、StartTime と EndTime の 2 列を追加して動作します。挿入・更新・削除のたびに、これらのタイムスタンプが更新されます。
-
挿入: 新しい行が追加され、
StartTimeは現在時刻、EndTimeは9999-12-31 23:59:59(MySQL の最大DATETIME値。現在アクティブであることを示す番兵値)になります。 -
更新: 既存行の
EndTimeを現在時刻に更新して無効化し、更新後のデータで新しい行を作成。新行のStartTimeは現在時刻、EndTimeは「無期限」になります。 -
削除: 既存行の
EndTimeを現在時刻に更新して、その行が無効であることを示します。
SQL の FOR SYSTEM_TIME 句を使うと、特定時点や期間におけるテーブルの状態を照会できます。例:
-
FOR SYSTEM_TIME AS OF '2024-01-01': 2024年1月1日時点のテーブル状態を取得。 -
FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-12-31': この期間内で有効なすべての行を表示。
16. MySQL のトランザクションとは?どのように使いますか?
トランザクションは、一体として実行される一連の操作です。すべての操作がまとめて成功するか失敗するかを保証し、データの整合性を保ちます。
使用例:
START TRANSACTION;
UPDATE accounts SET balance = balance - 500 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 500 WHERE account_id = 2;
COMMIT; -- 変更を永続化
-- または
ROLLBACK; -- 変更を取り消し
17. MySQL のデフォルト制約とは?列にデフォルト値を設定する方法は?
デフォルト制約は、INSERT 時に値が明示されない場合に列へデフォルト値を割り当てます。これにより、ユーザーが値を省略しても列が有効になります。
デフォルト値付きでテーブルを作成する例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
status VARCHAR(10) DEFAULT 'active'
);
その後、status を指定せずに行を挿入できます。
INSERT INTO employees (name) VALUES ('John Doe');
この方法は、重要な列での NULL や無効データの発生を抑え、デフォルト処理を個別に扱う必要が減るためクエリも簡潔になります。
|
Field |
Type |
Null |
Key |
Default |
Extra |
|
id |
INT |
NO |
PRI |
NULL |
AUTO_INCREMENT |
|
name |
VARCHAR(50) |
YES |
NULL |
||
|
status |
VARCHAR(10) |
YES |
active |
このコマンドが有用な理由:
- クエリ作成前にテーブルスキーマを理解しやすくなります。
- 不慣れなデータベースでのデバッグに役立ちます。
- 主キーやデフォルトなどの制約を素早く把握できます。
18. MySQL の CHAR と VARCHAR の違いは?
どちらも文字列を保存しますが、保存方法が異なります。
-
CHAR(n)は常にちょうどn文字を保持し、短い場合は空白で埋めます。固定長のため、国コードやステータスフラグのように長さが一定の列ではやや高速です。 -
VARCHAR(n)は実際に入力された文字のみを最大nまで保存します。可変長データでストレージ効率が良い反面、長さ管理のためのわずかなオーバーヘッドがあります。
CREATE TABLE example (
country_code CHAR(2), -- Always 2 chars, e.g. 'US', 'UK'
email VARCHAR(255) -- Variable length up to 255 chars
);
経験則としては、固定長には CHAR、それ以外には VARCHARを選びます。
19. 文字列関数を使ってテキストを操作する方法は?
SQL の各種文字列関数は、氏名などのテキスト処理に役立ちます。例:
-
LENGTH()は名前の文字数を返します。 -
UPPER()とLOWER()は大文字・小文字に変換します。 -
CONCAT()は名と姓を結合します。 -
SUBSTRING()はテキストの一部を抽出します。たとえば生年月日から月を取り出せます。
クエリ例:
SELECT
UPPER(first_name) AS upper_name,
CONCAT(first_name, ' ', last_name) AS full_name,
SUBSTRING(birthdate, 6, 2) AS birth_month,
TRIM(last_name) AS trimmed_last_name,
REPLACE(first_name, 'a', '@') AS replaced_name
FROM employees;
このクエリは次を行います。
-
名前を大文字に変換。
-
名と姓を結合してフルネームを生成。
-
birthdate列から誕生月を抽出。 -
姓の前後の空白をトリム。
-
名に含まれる「a」をすべて「@」に置換。
20. SQL で特定の行を更新する方法は?
UPDATE と WHERE 句を用いて、変更対象の行を特定します。
たとえば 2010 年の映画「Inception」のジャンルを「Sci-fi」に更新するには、次のクエリを使います。
UPDATE movies
SET genre = 'Sci-Fi'
WHERE movie_title = 'Inception' AND year = 2010;
ここで UPDATE movies は更新対象テーブルを示し、WHERE 句でタイトルが「Inception」、年が「2010」の行を特定しています。
上級レベルの MySQL 面接質問
上級レベルの質問では、複雑な MySQL の状況に対処する能力や、意思決定の考え方が問われます。
21. MySQL のトリガーとは?どのように実装しますか?
MySQL のトリガーは、データベースイベントの発生時に実行される一連の処理です。INSERT、UPDATE、DELETE などの前後で動作するように構成できます。
たとえば、新規注文が追加される orders テーブルがあるとします。各新規注文を order_history テーブルに記録するトリガーを作成できます。
CREATE TRIGGER after_order_insert
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_history (order_id, action, timestamp)
VALUES (NEW.order_id, 'inserted', NOW());
END;
トリガー実行後、order_history テーブルは自動的に更新されます。
|
history_id |
order_id |
action |
timestamp |
|
1 |
1 |
inserted |
2024-12-24 10:00:00 |
|
2 |
2 |
inserted |
2024-12-24 11:00:00 |
22. インデックスを追加すると SQL クエリが速くなるのはなぜですか?
インデックスがない場合、データベースは目的の行を見つけるために全行を走査する必要があります。インデックスは目次のように機能し、関連する行へ素早くアクセスできます。つまり、インデックスの追加により探索時間が短縮され、クエリが高速化します。
インデックスは一般的に B-tree やハッシュテーブルといったデータ構造で実装され、検索・参照・範囲走査を効率化します。
インデックス作成例:
-- インデックスなし:
SELECT * FROM employees WHERE last_name = 'Smith';
-- last_name 列にインデックスを追加:
CREATE INDEX idx_last_name ON employees(last_name);
-- インデックスにより、last_name が 'Smith' の行を素早く特定できます。
インデックスには次のようなデメリットもあります。
-
書き込みが遅くなる:
INSERT、UPDATE、DELETEのたびにインデックスの更新が必要です。 -
ストレージコスト: 追加のストレージ領域が必要です。
23. SQL テーブルで商品の重さと価格にはどのデータ型を使いますか?理由も述べてください。
重さには一般に DECIMAL を使うのが安全です。FLOAT や REAL も小数を扱えますが、浮動小数点演算により丸め誤差が生じることがあります。
配送計算や在庫など精度が重要な重さには、DECIMAL(8, 3) のように小数点以下 3 桁を確実に表現できる型が適しています。わずかな誤差が許容できる場合のみ FLOAT を検討します。
24. ウィンドウ関数で重複行を見つける方法は?
次のように ROW_NUMBER() を使って重複を検出できます。
WITH DuplicateCheck AS (
SELECT product_name,
category,
ROW_NUMBER() OVER(
PARTITION BY product_name, category
ORDER BY id
) AS row_num
FROM sales
)
SELECT *
FROM DuplicateCheck
WHERE row_num > 1;
仕組みを説明します。
1. ROW_NUMBER() は結果の各行に番号を付与します。
2. PARTITION BY は product_name と category ごとにグループ化します。
3. 各グループ内で 1 から連番を振ります。
4. row_num が 1 を超える行が重複です。
例えば、次のようなレコードがあるとします。
- Product A, Category X, row_num = 1
- Product A, Category X, row_num = 2(重複)
- Product B, Category Y, row_num = 1
このクエリでは、row_num が 1 より大きい 2 行目が表示されます。
25. パラメータ付きのストアドプロシージャを MySQL で作成・利用する方法は?例で説明してください。
ストアドプロシージャを使うと、複雑なクエリを保存・再利用でき、データベース操作の効率と保守性が向上します。ここではパラメータ付きの作成と利用を実例で示します。
学生データベースがあり、年齢で学生を絞り込むプロシージャを作るとします。まず、年齢パラメータを受け取るシンプルなプロシージャを作成します。
CREATE PROCEDURE get_student_info(IN age INT)
BEGIN
SELECT * FROM student WHERE student.age = age;
END;
このプロシージャは、目的の年齢を指定して CALL で実行します。
CALL get_student_info(21);
出力パラメータを使って、より高度なプロシージャにすることもできます。例えば、特定の年齢の学生数を数えるプロシージャ:
CREATE PROCEDURE count_students_by_age(IN age INT, OUT student_count INT)
BEGIN
SELECT COUNT(*) INTO student_count FROM students WHERE students.age = age;
END;
この結果を取得するには:
SET @count = 0;
CALL count_students_by_age(21, @count);
SELECT @count AS total_students;
26. 参照整合性がデータベースで重要な理由は?
参照整合性は、テーブル間の関係を正確に保ちます。外部キーを作成すると、あるテーブル内の値が参照先テーブルの一意な値と一致することを保証します。
具体例:EC サイトのデータベースで、Customers と Orders の 2 テーブルがあるとします。各注文は実在の顧客に属していなければなりません。外部キーで参照整合性を実装すると、次を保証します。
- 存在しない顧客に対して注文を作成できない。
- 既存の注文がある顧客を(特別な設定なしに)削除できない。
- 注文のある顧客の ID を更新できない。
次のように外部キー制約を作成すると:
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
データベースは自動的にこれらのルールを強制します。
-
OrdersのすべてのCustomerIDはCustomersに存在していなければならない。 -
無効な
CustomerIDの挿入など、違反は拒否される。
これにより、実在の顧客に紐づかない注文や、顧客情報が欠落したレポートなどの深刻な不整合を防げます。
データベース管理者向けの MySQL 面接質問
データベース管理者職に応募する場合、以下のような質問が想定されます。
27. 大規模アプリケーションがシャーディングを使う理由と、その課題は?
シャーディングは、大量データを複数サーバーに分割して保存する手法です。各シャードはデータの一部のみを保持します。負荷を分散できるため高価なハードウェアが不要になり、速度とスケーラビリティが向上しますが、次のような課題もあります。
- 結合など一部のクエリが難しくなり、データ管理が複雑化する。
- データが増えると特定シャードに負荷が集中し、ホットスポットが発生して性能が低下する可能性がある。
28. MySQL のクラッシュリカバリにおけるリドゥログの役割を説明してください。
MySQL ではデータの変更は最終的にディスクへ書き込む必要がありますが、データファイルへ直接書き込むのは遅くリスクもあります。そこで、データファイルを変更する前に、まず何を行うかをリドゥログへ記録します。これは無秩序にデータファイルを更新するより安全です。
例えば、顧客の住所を更新する場合:
- まず変更内容がリドゥログに書き込まれます。
- その後、トランザクションのコミットが認められます。
- 最終的に変更が実データファイルへ反映されます。
重要なのは、MySQL が手順 1 または 2 の後、3 の前にクラッシュした場合の復旧です。再起動時にリドゥログを参照し、記録されている変更を再生して未完了の作業を完了します。これにより、不都合なタイミングでクラッシュしてもコミット済みトランザクションは失われません。
29. MySQL で利用できるストレージエンジンの種類と違いは?
MySQL は複数のストレージ エンジンをサポートしており、それぞれ用途に最適化されています。代表的なものの比較は次のとおりです。
| Storage Engine | Key Features | Best For |
|---|---|---|
| InnoDB | デフォルト。ACID 準拠、行レベルロック、トランザクションと外部キーをサポート。 | EC、金融など、データ整合性が必須のシステム。 |
| MyISAM | 読み取りが高速、テーブルレベルロック。トランザクションや外部キーは非対応。 | 読み取り中心で整合性より速度重視の用途。 |
| Memory | データを RAM に保存。非常に高速だが再起動で消失。 | キャッシュ、セッション管理、一時データ。 |
| CSV | プレーンな CSV ファイルに保存。インデックスなし。 | アプリ間のデータ交換や簡易なフラットファイル保存。 |
| Archive | 高圧縮。INSERT と SELECT のみ。インデックスなし。 | ログや参照頻度の低い履歴データ。 |
| NDB (Clustered) | 分散ストレージ、高可用、耐障害性、トランザクション対応。 | リアルタイム性能が必要な大規模分散アプリ。 |
30. MySQL でデフォルトのストレージエンジンを設定するには?
まず現在のデフォルトストレージエンジンを確認します。
SHOW ENGINES;
InnoDB をデフォルトにするのが推奨です。以下の重要機能をサポートするためです。
- ACID 準拠のトランザクション
- 外部キー制約
- クラッシュリカバリ
- 行レベルロック
現在のセッションだけ一時的に変更するには:
SET default_storage_engine = 'InnoDB';
恒久的に変更するには、MySQL の設定ファイルの [mysqld] セクションに次を追加します。
default-storage-engine = InnoDB
31. 破損したテーブルを修復するには?
まず次のコマンドで全データベースをチェックします。
mysqlcheck --check --all-databases -u root -p
全テーブルをスキャンして破損の有無を報告します。破損があれば、次のコマンドで修復します。
mysqlcheck --repair database_name table_name -u root -p
深刻な破損では修復によりデータ損失が生じる場合があるため、必ずバックアップを取得してください。
シナリオベース・問題解決型の MySQL 面接質問
現実的な複雑シナリオへの対応力や問題解決力を評価する質問です。
32. MySQL でサブクエリを使ったシナリオを説明してください。
このように答えるとよいでしょう。
直近の職場で EC ストアのデータベースを管理し、製品レポートを作成しました。目標は平均以上の売上を生んだ製品を特定することで、複数段階の分析にサブクエリを用いました。
解決のために作成した SQL は次のとおりです。
SELECT
p.product_id,
p.product_name,
s.sales_amount
FROM products p
JOIN sales s ON p.product_id = s.product_id
WHERE s.sales_amount > (
SELECT AVG(sales_amount)
FROM sales
)
ORDER BY s.sales_amount DESC;
まず、sales テーブルの AVG(sales_amount) を算出するサブクエリで平均売上という基準値を用意しました。これは各製品のパフォーマンスを比較する動的なしきい値として機能します。
メインクエリでは products と sales を結合して製品情報を取得し、WHERE 句で平均未満の製品を除外しました。
この構成により、複数のクエリを個別に実行することなく、1 回の処理で高パフォーマンス製品を特定できました。
33. 複数テーブルのデータを結合するために SQL の JOIN を使った状況を説明してください。
以下は回答例です。
直近のプロジェクトでは、製品の売上データと製品詳細の 2 テーブルがありました。sales、product name、category、price を示すレポートの作成がタスクでした。
共通列 product_id をキーに INNER JOIN を用い、売上トランザクションと製品詳細を結合しました。
SELECT
s.sales_date,
p.product_name,
p.category,
s.quantity_sold,
p.price
FROM
sales s
INNER JOIN
products p
ON
s.product_id = p.product_id;
このレポートにより売上トレンドが明確になり、好調なカテゴリと改善が必要なカテゴリを特定できました。
34. トリガーの使用経験はありますか?どのように使いましたか?
以下は回答例です。
はい、トリガーの経験は豊富です。直近の役割では、価格変更の監査のために AFTER UPDATE トリガーを実装しました。
具体的には、製品価格が変更されるたびに価格履歴を自動記録するトリガーを作成しました。以下が作成した SQL です。
CREATE TRIGGER tr_AuditPriceChanges
AFTER UPDATE ON Products
FOR EACH ROW
BEGIN
-- Only log if the price actually changed
IF OLD.UnitPrice <> NEW.UnitPrice THEN
INSERT INTO PriceAudit (
ProductID,
OldPrice,
NewPrice,
ChangedBy,
ChangeDate,
PercentageChange
)
VALUES (
NEW.ProductID,
OLD.UnitPrice,
NEW.UnitPrice,
CURRENT_USER(),
NOW(),
ROUND(((NEW.UnitPrice - OLD.UnitPrice) / OLD.UnitPrice * 100), 2)
);
END IF;
END;
この解決策が有効だった点:
- 実際に価格が変わったときだけ発火します。
- 変更者を
SYSTEM_USERで記録します。 - レポート用に変化率を計算します。
- 他列の更新で実質変更がないケースを除外します。
また、NULL 価格に関するエッジケースが判明した際には、エラーハンドリングとロギングも追加しました。
MySQL 面接に向けた準備のコツ
キャリアを始めたばかりなら、次のヒントが面接対策に役立ちます。
MySQL の核となる概念を習得する: データベースの基礎(インデックス、トランザクション、クエリオプティマイザ)を学びましょう。MySQL のクエリ処理やストレージ管理を理解しておくと、効率的なクエリを書けるだけでなく、面接での説明にも役立ちます。
手を動かして経験を積む:MySQL をローカルにインストールして継続的に練習しましょう。テスト用 DB を作成し、さまざまな種類のクエリを書き、最適化に挑戦してください。実践こそが仕組みの理解と自信の醸成に最短です。
知識をさらに磨くには、DataCamp のリソースもご活用ください。
- SQL 入門: Introduction to SQL Course
- SQL の練習: Applying SQL to real-world problems
MySQL のツールと連携を学ぶ: MySQL Workbench などの管理・監視ツールに慣れておきましょう。また、MySQL と Python の連携 や関連フレームワークも学ぶと、実運用環境での対応力を示せます。
まとめ
以上、次の仕事獲得に役立つ MySQL の面接質問トップ 34 を紹介しました。エントリーレベルでも上級のデータベース管理者職でも、MySQL の基礎、クエリ最適化、データベース管理をしっかり理解していることが差別化の鍵です。
他のデータベース管理システムの知識も広げたい方は、DataCamp の SQL コース をご覧ください。
複雑なテーマをわかりやすくすることが好きなコンテンツストラテジストです。Splunk、Hackernoon、Tiiny Host などの企業で、読者にとって魅力的で有益なコンテンツの制作を支援してきました。
