PostgreSQL

PostgreSQL練習問題

答えを見る前にSQLを書き、結果とエラーの理由を説明しましょう。

PostgreSQL入門の講座一覧

01

検索:在庫切れを探す

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

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

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

カテゴリごとに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
03

結合:商品別の売上

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
04

制約:エラーを読む

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.
05

JSONB:タグを検索する

JSONB列にdatabaseタグが含まれる行を探してください。

解答例と実行結果
解答例SQL
SELECT product_id, metadata ->> 'color' AS color
FROM product_metadata
WHERE metadata @> '{"tags": ["database"]}';
実行結果OUTPUT
product_id  color
1            blue
06

更新:失敗時に戻す

在庫を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文の構造が変わらないことを確認しましょう。