MySQL

MySQL練習問題

答えを見る前にSQLを書き、実行結果と違った理由を調べましょう。

MySQL入門の講座一覧

01

検索:在庫切れを探す

productsから、在庫が0の商品名と価格を安い順に表示してください。

解答例と実行結果
解答例MYSQL
SELECT name, price
FROM products
WHERE stock = 0
ORDER BY price ASC;
実行結果の例OUTPUT
name          price
ボールペン    150.00
02

集計:カテゴリ別の在庫金額

カテゴリごとに価格×在庫数の合計を求め、金額の大きい順にしてください。NULLカテゴリは「未分類」と表示します。

解答例
解答例MYSQL
SELECT COALESCE(category, '未分類') AS category_name,
       SUM(price * stock) AS stock_value
FROM products
GROUP BY category
ORDER BY stock_value DESC;
実行結果の例OUTPUT
category_name  stock_value
book            14000.00
stationery       3600.00
未分類           2700.00
03

結合:注文の明細

ordersとproductsを結合し、注文番号、商品名、数量、金額を表示してください。

解答例
解答例MYSQL
SELECT o.id, p.name, o.quantity,
       p.price * o.quantity AS total
FROM orders AS o
JOIN products AS p ON p.id = o.product_id
ORDER BY o.id;
実行結果の例OUTPUT
id  name          quantity  total
1   MySQL入門書   2         5600.00
2   ノート        3         900.00
04

設計:制約を追加する

customersへ電話番号を追加し、同じ電話番号を登録できないようにしてください。NULLを許可するかどうかも考えます。

解答例
解答例MYSQL
ALTER TABLE customers
    ADD phone VARCHAR(30) NULL,
    ADD UNIQUE KEY uq_customers_phone (phone);
確認結果の例OUTPUT
Query OK, 0 rows affected
SHOW INDEX FROM customers;  -- uq_customers_phone を確認

MySQLではUNIQUE列に複数のNULLを置ける動作があります。未登録を一件だけにしたいのか、複数許可するのかは要件を決めてください。

05

更新:失敗時に戻す

在庫を1減らしたあと、注文追加に失敗した想定で、在庫が元へ戻ることを確認してください。

解答例
解答例MYSQL
START TRANSACTION;
UPDATE products SET stock = stock - 1
WHERE id = 1 AND stock >= 1;
SELECT stock FROM products WHERE id = 1;
ROLLBACK;
SELECT stock FROM products WHERE id = 1;
確認する結果OUTPUT
トランザクション中は1少なくなり、
ROLLBACK後は開始前の値へ戻る。
発展課題 商品名検索をPHP PDOで実装し、入力へ「' OR 1=1 -- 」を渡してもSQL文の構造が変わらないことを確認しましょう。