検索:在庫切れを探す
productsから、在庫が0の商品名と価格を安い順に表示してください。
解答例と実行結果
解答例SQL
SELECT name, price
FROM products
WHERE stock = 0
ORDER BY price ASC;実行結果OUTPUT
name price
ボールペン 150.00集計:カテゴリ別の在庫金額
カテゴリごとにprice * stockの合計を求め、金額の大きい順にしてください。NULLカテゴリは「未分類」と表示します。
解答例と実行結果
解答例SQL
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 16400.00
stationery 3600.00
未分類 2700.00結合:商品別の売上
ordersとproductsを結合し、商品名、数量、売上を表示してください。
解答例と実行結果
解答例SQL
SELECT p.name, SUM(p.price * o.quantity) AS sales
FROM products AS p
JOIN orders AS o ON o.product_id = p.id
GROUP BY p.id, p.name
ORDER BY sales DESC;実行結果OUTPUT
name sales
PostgreSQL入門書 6560.00
ノート 900.00制約:エラーを読む
customersへ同じメールアドレスを追加し、UNIQUE制約のエラーから制約名を探してください。
解答例と実行結果
解答例SQL
INSERT INTO customers (email, name, age)
VALUES ('a@example.com', '別の人', 30);実行結果OUTPUT
ERROR: duplicate key value violates unique constraint "uq_customers_email"
DETAIL: Key (email)=(a@example.com) already exists.JSONB:タグを検索する
JSONB列にdatabaseタグが含まれる行を探してください。
解答例と実行結果
解答例SQL
SELECT product_id, metadata ->> 'color' AS color
FROM product_metadata
WHERE metadata @> '{"tags": ["database"]}';実行結果OUTPUT
product_id color
1 blue更新:失敗時に戻す
在庫を1減らしたあとで注文登録に失敗した想定にし、ROLLBACK後に元の値へ戻ることを確認してください。
解答例と実行結果
解答例SQL
BEGIN;
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
トランザクション中: 4
ROLLBACK後: 5発展課題 PHP PDOで商品名検索を作り、入力値をプレースホルダーへ渡してSQL文の構造が変わらないことを確認しましょう。
