検索:在庫切れを探す
productsから、在庫が0の商品名と価格を安い順に表示してください。
解答例と実行結果
解答例MYSQL
SELECT name, price
FROM products
WHERE stock = 0
ORDER BY price ASC;実行結果の例OUTPUT
name price
ボールペン 150.00集計:カテゴリ別の在庫金額
カテゴリごとに価格×在庫数の合計を求め、金額の大きい順にしてください。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結合:注文の明細
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設計:制約を追加する
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を置ける動作があります。未登録を一件だけにしたいのか、複数許可するのかは要件を決めてください。
更新:失敗時に戻す
在庫を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文の構造が変わらないことを確認しましょう。
