付録A SQL練習ノート
🔒 研修参加者向け
この章は研修参加者向けです
この付録では、短い問題を解きながら基本SQLを一巡し、第1~第3正規形を復習します。
研修参加者の方は、講師から案内されたパスワードを入力してください。
この教材を利用した研修については、お問い合わせください。
この付録の使い方
Section titled “この付録の使い方”この付録は、SQLをもう少し練習したい方のための補助教材です。 本編6章とは別に、研修後の復習、早く演習を終えたときの追加課題、 講師による補講で使用します。2日間・14時間の標準カリキュラムには含めません。
本編と同じ架空の飲料メーカーのデータベースを使い、短い問いに答えるSQLを作ります。 最後に、受注一覧を第1正規形から第3正規形まで整理します。
この付録を終えると、次のことができるようになります。
- 必要な列と行を
SELECTで取り出す - 条件、並び順、件数を指定する
- 集計関数と
GROUP BYでデータをまとめる INNER JOINとLEFT JOINでテーブルをつなぐ- 安全を確認してからデータを追加、更新、削除する
- 小さなテーブルを作成、変更、削除する
- 一覧表を第1~第3正規形へ整理する
練習するSQLの範囲
Section titled “練習するSQLの範囲”ここでいう「基本的なSQL」は、業務データの構築と確認に必要な次の範囲です。 SQL製品にあるすべての構文や関数を網羅するものではありません。
| 分類 | 主なSQL | この付録で行うこと |
|---|---|---|
| 検索 | SELECT、AS、DISTINCT | 列の選択、別名、重複の除外 |
| 条件 | WHERE、比較、AND、OR | 行の絞り込み |
| 条件 | BETWEEN、IN、LIKE | 範囲、候補、文字列の検索 |
| NULL | IS NULL、IS NOT NULL | 値が未設定の行の検索 |
| 並べ替え | ORDER BY、LIMIT | 順序と取得件数の指定 |
| 集計 | COUNT、SUM、AVG | 件数、合計、平均 |
| 集計 | MIN、MAX、GROUP BY、HAVING | 最小、最大、グループの絞り込み |
| 結合 | INNER JOIN、LEFT JOIN | 関連するテーブルの参照 |
| データ操作 | INSERT、UPDATE、DELETE | 行の追加、更新、削除 |
| トランザクション | START TRANSACTION、COMMIT、ROLLBACK | 変更の確定と取り消し |
| テーブル操作 | CREATE、ALTER、DESCRIBE、DROP | 小さな一時テーブルの操作 |
| 設計 | 第1~第3正規形 | 一覧表の分割とキーの設定 |
複雑な副問い合わせ、ウィンドウ関数、ストアドプロシージャ、 性能チューニングはこの付録の対象外です。
前提となるテーブル
Section titled “前提となるテーブル”第3章と第5章の配布SQLを実行し、ai_database_trainingに
次のテーブルがある状態から始めます。
product_categories、package_types、productscustomers、delivery_destinationsshipment_plans、shipment_plan_details
まず、次のSQLで接続先とテーブルを確認します。
SELECT DATABASE();
SHOW TABLES;SELECT DATABASE()の結果がai_database_trainingでなければ、
次のSQLを実行します。
USE ai_database_training;練習専用の一時テーブル
Section titled “練習専用の一時テーブル”appendix-sql-practice-setup.sql をダウンロードし、MySQL Workbenchで実行します。
このファイルは、追加、更新、削除の練習に使う
sql_practice_itemsという一時テーブルを作ります。
一時テーブルは、作成した接続の中だけで利用でき、接続を閉じると削除されます。
途中でWorkbenchを閉じた場合は、準備用SQLをもう一度実行してください。
研修用の接続で実行してください。
この付録にはデータを変更するSQLがあります。 実在する業務データベースでは実行しないでください。
問題を解くときの手順
Section titled “問題を解くときの手順”問題ごとに、次の順で進めます。
- どのテーブルに必要な値があるか確認する
- 結果に必要な列と行を日本語で書く
- 実行結果を予想する
- SQLを作り、必要な一文だけを実行する
- 列名、行数、値、並び順を確認する
- 想定と違えば、一度に一か所ずつ修正する
すぐに解答を開くのではなく、まず自分のSQLを保存してください。 同じ結果になる書き方は一つとは限りません。
練習1 必要な列を取り出す
Section titled “練習1 必要な列を取り出す”問題1 商品の一覧
Section titled “問題1 商品の一覧”productsから、商品コードと商品名を表示してください。
商品コードの昇順に並べます。
期待する結果は4行で、先頭はPRD001です。
解答例を表示する
SELECT product_code, product_nameFROM productsORDER BY product_code;問題2 列へ分かりやすい見出しを付ける
Section titled “問題2 列へ分かりやすい見出しを付ける”商品名を商品、内容量を内容量、単位を単位という見出しで表示してください。
解答例を表示する
SELECT product_name AS 商品, content_amount AS 内容量, content_unit AS 単位FROM productsORDER BY product_code;問題3 重複しない内容量
Section titled “問題3 重複しない内容量”productsに登録されている内容量を、重複を除いて表示してください。
結果は350と500の2行です。
解答例を表示する
SELECT DISTINCT content_amountFROM productsORDER BY content_amount;問題4 1ケース当たりの本数を使って計算する
Section titled “問題4 1ケース当たりの本数を使って計算する”商品コード、商品名、1ケース当たりの本数、2ケース分の本数を表示してください。
2ケース分の列にはunits_for_two_casesという別名を付けます。
解答例を表示する
SELECT product_code, product_name, units_per_case, units_per_case * 2 AS units_for_two_casesFROM productsORDER BY product_code;練習2 条件で行を絞る
Section titled “練習2 条件で行を絞る”問題5 一つの条件
Section titled “問題5 一つの条件”内容量が500mlの商品について、商品コード、商品名、内容量を表示してください。
解答例を表示する
SELECT product_code, product_name, content_amountFROM productsWHERE content_amount = 500ORDER BY product_code;問題6 複数の条件をすべて満たす
Section titled “問題6 複数の条件をすべて満たす”内容量が500ml以上で、1ケースが24本の商品を表示してください。
結果はPRD003の1行です。
解答例を表示する
SELECT product_code, product_nameFROM productsWHERE content_amount >= 500 AND units_per_case = 24;問題7 いずれかの条件を満たす
Section titled “問題7 いずれかの条件を満たす”商品分類IDが1または4の商品を表示してください。
ORを使う方法とINを使う方法の両方を試します。
解答例を表示する
SELECT product_code, product_nameFROM productsWHERE product_category_id = 1 OR product_category_id = 4ORDER BY product_code;同じ条件をINで書けます。
SELECT product_code, product_nameFROM productsWHERE product_category_id IN (1, 4)ORDER BY product_code;問題8 範囲を指定する
Section titled “問題8 範囲を指定する”内容量が300ml以上400ml以下の商品を表示してください。
結果はPRD001とPRD002です。
解答例を表示する
SELECT product_code, product_name, content_amountFROM productsWHERE content_amount BETWEEN 300 AND 400ORDER BY product_code;問題9 文字列の一部を指定する
Section titled “問題9 文字列の一部を指定する”商品名が「みなと」で始まる商品を表示してください。 結果は2行です。
解答例を表示する
SELECT product_code, product_nameFROM productsWHERE product_name LIKE 'みなと%'ORDER BY product_code;%は、0文字以上の任意の文字列を表します。
問題10 NULLを調べる
Section titled “問題10 NULLを調べる”sql_practice_itemsから、数量が未設定の行を表示してください。
quantity = NULLとは書きません。
解答例を表示する
SELECT item_code, item_name, quantityFROM sql_practice_itemsWHERE quantity IS NULL;未設定でない行はIS NOT NULLで検索できます。
問題11 等しくない条件
Section titled “問題11 等しくない条件”出荷予定から、状態がCANCELLEDではない行を表示してください。
出荷予定日が2026年11月20日の行だけを対象にします。
解答例を表示する
SELECT shipment_plan_no, shipment_statusFROM shipment_plansWHERE shipment_date = '2026-11-20' AND shipment_status <> 'CANCELLED'ORDER BY shipment_plan_no;練習3 並び順と取得件数を指定する
Section titled “練習3 並び順と取得件数を指定する”問題12 複数の並び順
Section titled “問題12 複数の並び順”商品を1ケース当たりの本数の多い順に並べ、 同じ本数の中では商品コードの昇順にしてください。
解答例を表示する
SELECT product_code, product_name, units_per_caseFROM productsORDER BY units_per_case DESC, product_code ASC;問題13 先頭の2行
Section titled “問題13 先頭の2行”商品コードの昇順に並べた結果から、先頭の2行だけを表示してください。
解答例を表示する
SELECT product_code, product_nameFROM productsORDER BY product_codeLIMIT 2;練習4 集計する
Section titled “練習4 集計する”問題14 行数を数える
Section titled “問題14 行数を数える”productsの商品数を数えてください。
結果は4です。
解答例を表示する
SELECT COUNT(*) AS product_countFROM products;問題15 NULLとCOUNTの違いを確認する
Section titled “問題15 NULLとCOUNTの違いを確認する”sql_practice_itemsについて、全行数と、数量が設定されている行数を
一つの結果に表示してください。結果は4と3です。
解答例を表示する
SELECT COUNT(*) AS all_rows, COUNT(quantity) AS rows_with_quantityFROM sql_practice_items;COUNT(*)は行を数え、COUNT(quantity)はquantityがNULLでない行を数えます。
問題16 最小、最大、平均
Section titled “問題16 最小、最大、平均”商品の内容量について、最小値、最大値、平均値を表示してください。
平均値は425.0000のように表示される場合があります。
解答例を表示する
SELECT MIN(content_amount) AS minimum_amount, MAX(content_amount) AS maximum_amount, AVG(content_amount) AS average_amountFROM products;問題17 グループごとに集計する
Section titled “問題17 グループごとに集計する”容器種別IDごとに、商品数と1ケース当たりの本数の合計を表示してください。
解答例を表示する
SELECT package_type_id, COUNT(*) AS product_count, SUM(units_per_case) AS total_units_per_caseFROM productsGROUP BY package_type_idORDER BY package_type_id;容器種別ID 1は2商品・48本、ID 2は2商品・36本です。
問題18 集計後のグループを絞る
Section titled “問題18 集計後のグループを絞る”2商品以上が登録されている容器種別IDだけを表示してください。
行を集計する前の条件ではなく、集計結果への条件なのでHAVINGを使います。
解答例を表示する
SELECT package_type_id, COUNT(*) AS product_countFROM productsGROUP BY package_type_idHAVING COUNT(*) >= 2ORDER BY package_type_id;問題19 状態ごとの出荷予定ケース数
Section titled “問題19 状態ごとの出荷予定ケース数”2026年11月20日の出荷予定について、状態ごとのケース数を表示してください。
shipment_plansとshipment_plan_detailsを結合します。
解答例を表示する
SELECT sp.shipment_status, SUM(spd.case_quantity) AS total_casesFROM shipment_plans AS spINNER JOIN shipment_plan_details AS spd ON spd.shipment_plan_id = sp.shipment_plan_idWHERE sp.shipment_date = '2026-11-20'GROUP BY sp.shipment_statusORDER BY sp.shipment_status;結果はCANCELLEDが6、CONFIRMEDが49、DRAFTが8ケースです。
練習5 テーブルを結合する
Section titled “練習5 テーブルを結合する”問題20 商品へ分類名と容器名を付ける
Section titled “問題20 商品へ分類名と容器名を付ける”商品コード、商品名、商品分類名、容器種別名を表示してください。
3テーブルをINNER JOINで結合します。
解答例を表示する
SELECT p.product_code, p.product_name, pc.category_name, pt.package_type_nameFROM products AS pINNER JOIN product_categories AS pc ON pc.product_category_id = p.product_category_idINNER JOIN package_types AS pt ON pt.package_type_id = p.package_type_idORDER BY p.product_code;問題21 出荷予定へ取引先名と出荷先名を付ける
Section titled “問題21 出荷予定へ取引先名と出荷先名を付ける”2026年11月20日の出荷予定について、出荷予定番号、取引先名、 出荷先名、状態を表示してください。
解答例を表示する
SELECT sp.shipment_plan_no, c.customer_name, dd.destination_name, sp.shipment_statusFROM shipment_plans AS spINNER JOIN delivery_destinations AS dd ON dd.delivery_destination_id = sp.delivery_destination_idINNER JOIN customers AS c ON c.customer_id = dd.customer_idWHERE sp.shipment_date = '2026-11-20'ORDER BY sp.shipment_plan_no;問題22 LEFT JOINで左側の行を残す
Section titled “問題22 LEFT JOINで左側の行を残す”すべての取引先について、登録されている出荷先数を表示してください。 出荷先が0件の取引先も残る書き方にします。
解答例を表示する
SELECT c.customer_code, c.customer_name, COUNT(dd.delivery_destination_id) AS destination_countFROM customers AS cLEFT JOIN delivery_destinations AS dd ON dd.customer_id = c.customer_idGROUP BY c.customer_id, c.customer_code, c.customer_nameORDER BY c.customer_code;現在のサンプルでは、取引先Aが2件、取引先Bが1件です。 新しい取引先だけを追加して再実行すると、出荷先数0件の行も残ります。
問題23 確定済みの缶飲料を集計する
Section titled “問題23 確定済みの缶飲料を集計する”2026年11月20日の確定済み出荷予定から、缶飲料だけを対象に、 商品別のケース数を表示してください。
解答例を表示する
SELECT p.product_code, p.product_name, SUM(spd.case_quantity) AS total_casesFROM shipment_plans AS spINNER JOIN shipment_plan_details AS spd ON spd.shipment_plan_id = sp.shipment_plan_idINNER JOIN products AS p ON p.product_id = spd.product_idINNER JOIN package_types AS pt ON pt.package_type_id = p.package_type_idWHERE sp.shipment_date = '2026-11-20' AND sp.shipment_status = 'CONFIRMED' AND pt.package_type_code = 'CAN'GROUP BY p.product_id, p.product_code, p.product_nameORDER BY p.product_code;結果は、みなとソーダ19ケース、しおかぜ茶10ケース、合計29ケースです。
練習6 データを追加、更新、削除する
Section titled “練習6 データを追加、更新、削除する”この練習ではsql_practice_itemsだけを変更します。
一連の操作をトランザクションの中で行い、最後にROLLBACKで取り消します。
productsや出荷予定のテーブルは変更しません。また、
CREATE TABLEやALTER TABLEなどのテーブル定義操作は、 次の練習7で別に行います。
問題24 1行追加する
Section titled “問題24 1行追加する”次の値をsql_practice_itemsへ追加してください。
| 列 | 値 |
|---|---|
item_code | ITM005 |
item_name | 試作品E |
quantity | 15 |
is_active | TRUE |
実行前にSTART TRANSACTIONを実行します。
解答例を表示する
START TRANSACTION;
INSERT INTO sql_practice_items ( item_code, item_name, quantity, is_active) VALUES ( 'ITM005', '試作品E', 15, TRUE);
SELECT *FROM sql_practice_itemsWHERE item_code = 'ITM005';問題25 NULLの数量を更新する
Section titled “問題25 NULLの数量を更新する”ITM002の数量を20へ更新してください。
更新前に対象行をSELECTし、更新後にも同じ条件で確認します。
解答例を表示する
SELECT *FROM sql_practice_itemsWHERE item_code = 'ITM002';
UPDATE sql_practice_itemsSET quantity = 20WHERE item_code = 'ITM002';
SELECT *FROM sql_practice_itemsWHERE item_code = 'ITM002';問題26 無効な行を削除する
Section titled “問題26 無効な行を削除する”is_activeがFALSEの行を削除してください。
削除前に、対象がITM003の1行だけであることを確認します。
解答例を表示する
SELECT *FROM sql_practice_itemsWHERE is_active = FALSE;
DELETE FROM sql_practice_itemsWHERE is_active = FALSE;
SELECT *FROM sql_practice_itemsORDER BY item_code;問題27 変更を取り消す
Section titled “問題27 変更を取り消す”ここまでの追加、更新、削除を取り消してください。 取り消した後、4行へ戻ったことを確認します。
解答例を表示する
ROLLBACK;
SELECT *FROM sql_practice_itemsORDER BY item_code;ITM005はなくなり、ITM002の数量はNULL、ITM003は再び表示されます。
ROLLBACKは、同じトランザクションの中で行った変更を取り消します。
COMMITを実行すると変更が確定するため、この練習では実行しません。
実務では、接続の自動コミット設定と、どこからトランザクションが始まったかを
確認してから使用します。
練習7 小さなテーブルを作る
Section titled “練習7 小さなテーブルを作る”ここでは一時テーブルを使い、テーブル定義の基本を復習します。 外部キーを含む完成版テーブルの作成は、第3章と第5章で扱っています。
問題28 テーブルを作成する
Section titled “問題28 テーブルを作成する”次の条件を満たす一時テーブルpractice_checksを作成してください。
| 列 | データ型 | 制約 |
|---|---|---|
check_id | 正の整数 | 主キー、自動採番 |
check_code | 20文字以内 | 必須、重複禁止 |
check_name | 100文字以内 | 必須 |
解答例を表示する
CREATE TEMPORARY TABLE practice_checks ( check_id INT UNSIGNED NOT NULL AUTO_INCREMENT, check_code VARCHAR(20) NOT NULL, check_name VARCHAR(100) NOT NULL, PRIMARY KEY (check_id), CONSTRAINT uq_practice_checks_code UNIQUE (check_code)) ENGINE = InnoDB;問題29 定義を確認して列を追加する
Section titled “問題29 定義を確認して列を追加する”最初にDESCRIBEで列を確認します。
その後、確認日時を保存するchecked_at列を追加し、もう一度確認してください。
解答例を表示する
DESCRIBE practice_checks;
ALTER TABLE practice_checksADD COLUMN checked_at DATETIME NULL;
DESCRIBE practice_checks;問題30 テーブル定義を表示して削除する
Section titled “問題30 テーブル定義を表示して削除する”MySQLが保持している作成SQLを確認してから、練習用テーブルを削除してください。
解答例を表示する
SHOW CREATE TABLE practice_checks;
DROP TEMPORARY TABLE practice_checks;練習8 正規化する
Section titled “練習8 正規化する”この練習は、第5章とは別の「受注一覧」を題材にします。 appendix-normalization-exercise.csv を表計算ソフトで開いてください。
この一覧には、商品1と商品2という繰り返し列があります。 また、取引先名、住所、商品名、商品分類名が、受注のたびに保存されています。
問題31 問題点を見つける
Section titled “問題31 問題点を見つける”次の操作をしたときに起きる問題を、それぞれ一つ以上書いてください。
- 取引先Aの住所を変更する
- 商品名を訂正する
- まだ受注されていない新商品を登録する
- 取引先Bの唯一の受注を削除する
- 一つの受注へ3番目の商品を追加する
解答例を表示する
- 取引先Aの住所が複数行にあり、一部だけ古い住所になるおそれがある
- 同じ商品名を複数箇所で直す必要があり、新旧の名称が混在するおそれがある
- 受注行がないため、商品情報だけを登録する場所がない
- 取引先Bの名称と住所まで一覧から失われる
- 商品3用の列を追加する必要があり、商品数が増えるたびに表の形が変わる
これらは、更新、挿入、削除の操作で別の事実まで影響を受ける問題です。
問題32 第1正規形へ整理する
Section titled “問題32 第1正規形へ整理する”商品1、商品2という繰り返し列をなくし、1行を1商品明細にしてください。
行を識別するためにline_noを追加します。
次の列を持つ一つの表へ書き直します。
order_no, line_no, order_date,customer_code, customer_name,customer_postal_code, customer_address,product_code, product_name,product_category_code, product_category_name,quantity解答例を表示する
最初の受注OR20261120-001は、次の2行になります。
| 受注番号 | 行番号 | 取引先 | 商品 | 数量 |
|---|---|---|---|---|
| OR20261120-001 | 1 | CUS001 | PRD001 | 12 |
| OR20261120-001 | 2 | CUS001 | PRD003 | 20 |
主キーの候補は、order_noとline_noの組です。
すべてのセルが一つの値になり、商品数が増えても明細行を増やせます。
ただし、受注日や取引先情報は明細ごとに重複したままです。
問題33 第2正規形へ整理する
Section titled “問題33 第2正規形へ整理する”第1正規形の表では、主キーをorder_noとline_noの組と考えます。
そのうち、order_noだけで決まる列を見つけて、受注と受注明細へ分けてください。
解答例を表示する
受注日と取引先情報は、行番号に関係なく受注番号だけで決まります。 そこで次の2表へ分けます。
practice_orders order_no PK order_date customer_code customer_name customer_postal_code customer_address
practice_order_details order_no PK, FK line_no PK product_code product_name product_category_code product_category_name quantitypractice_order_detailsの主キーはorder_noとline_noの組です。
受注番号を両方の表に残すことで、一つの受注と複数の明細を結び付けます。
問題34 第3正規形へ整理する
Section titled “問題34 第3正規形へ整理する”第2正規形の2表には、次の依存関係が残っています。
- 取引先コードが決まると、取引先名、郵便番号、住所が決まる
- 商品コードが決まると、商品名と商品分類コードが決まる
- 商品分類コードが決まると、商品分類名が決まる
これらを専用のテーブルへ分け、主キーと外部キーを示してください。
解答例を表示する
practice_customers customer_code PK customer_name customer_postal_code customer_address
practice_product_categories product_category_code PK product_category_name
practice_products product_code PK product_name product_category_code FK
practice_orders order_no PK order_date customer_code FK
practice_order_details order_no PK, FK line_no PK product_code FK quantity関係は次のようになります。
practice_customers 1 ──< practice_orderspractice_orders 1 ──< practice_order_detailspractice_products 1 ──< practice_order_detailspractice_product_categories 1 ──< practice_products取引先、商品、商品分類という事実の保存場所が一つずつになります。 受注と明細には、それらを参照するコードだけを残します。
問題35 分けた後に元の一覧へ戻せるか考える
Section titled “問題35 分けた後に元の一覧へ戻せるか考える”第3正規形の5表から、次の列を表示するには、どの順に結合すればよいでしょうか。
- 受注番号
- 受注日
- 取引先名
- 行番号
- 商品名
- 商品分類名
- 数量
SQLを書く前に、結合するテーブルと列を線で結んでください。
解答例を表示する
結合の順序例は次のとおりです。
practice_orders → practice_customers → practice_order_details → practice_products → practice_product_categories結合条件に使う列は、次の4組です。
practice_orders.customer_code = practice_customers.customer_code
practice_orders.order_no = practice_order_details.order_no
practice_order_details.product_code = practice_products.product_code
practice_products.product_category_code = practice_product_categories.product_category_code正規化で表を分けても、主キーと外部キーを正しく残せば、
JOINを使って業務に必要な一覧へ戻せます。
総合問題 業務上の問いへ答える
Section titled “総合問題 業務上の問いへ答える”2026年11月20日の確定済み出荷予定について、 取引先名、商品名、合計ケース数を表示してください。
次の条件をすべて満たします。
- 取消済みと下書きは含めない
- 取引先名、商品名の順に並べる
- 表示列は3列だけにする
- 一つのSQLで答える
解答例を表示する
SELECT c.customer_name, p.product_name, SUM(spd.case_quantity) AS total_casesFROM shipment_plans AS spINNER JOIN delivery_destinations AS dd ON dd.delivery_destination_id = sp.delivery_destination_idINNER JOIN customers AS c ON c.customer_id = dd.customer_idINNER JOIN shipment_plan_details AS spd ON spd.shipment_plan_id = sp.shipment_plan_idINNER JOIN products AS p ON p.product_id = spd.product_idWHERE sp.shipment_date = '2026-11-20' AND sp.shipment_status = 'CONFIRMED'GROUP BY c.customer_id, c.customer_name, p.product_id, p.product_nameORDER BY c.customer_name, p.product_name;結果は次の4行です。
| 取引先 | 商品 | ケース数 |
|---|---|---|
| 取引先A | みなとソーダ | 12 |
| 取引先A | みなと天然水 | 20 |
| 取引先B | しおかぜ茶 | 10 |
| 取引先B | みなとソーダ | 7 |
自己確認チェックリスト
Section titled “自己確認チェックリスト”解答例を見ずに、次を説明または実行できるか確認します。
-
SELECTで必要な列だけを指定できる -
WHEREで文字列、数値、日付、NULLを条件にできる -
ORDER BYで昇順と降順を使い分けられる -
COUNT、SUM、AVGの違いを説明できる -
WHEREとHAVINGの対象の違いを説明できる - 主キーと外部キーを使って
JOINの条件を書ける -
INNER JOINとLEFT JOINの違いを説明できる - 更新と削除の前に対象行を
SELECTできる -
ROLLBACKで練習中の変更を取り消せる - 第1~第3正規形へ分ける理由を具体例で説明できる
未確認の項目があれば、その項目を含む問題だけをもう一度解きます。 すべてのSQLを暗記する必要はありません。 「どのテーブルの、どの列と行が必要か」を言葉にできることが大切です。
参考にするMySQL公式資料
Section titled “参考にするMySQL公式資料”この付録のSQLはMySQL 8.4の公式構文を基準にしています。 研修で使用するMySQLの正確なバージョンが確定した後、実機で一括確認します。