CASE式で分類する
検索結果へ条件に応じた表示名を加えられます。WHENは上から評価されるため、重なる条件は順番に注意します。
在庫状態MYSQL
SELECT name, stock,
CASE
WHEN stock = 0 THEN '在庫切れ'
WHEN stock <= 3 THEN '残りわずか'
ELSE '在庫あり'
END AS stock_status
FROM products
ORDER BY id;実行結果の例OUTPUT
MySQL入門書 5 在庫あり
ノート 12 在庫あり
ボールペン 0 在庫切れ
マグカップ 3 残りわずかGROUP BYとHAVING
COUNT、SUM、AVG、MIN、MAXで集計します。WHEREは集計前、HAVINGは集計後の条件です。
カテゴリ別の在庫と平均価格MYSQL
SELECT category,
COUNT(*) AS product_count,
SUM(stock) AS total_stock,
ROUND(AVG(price), 2) AS average_price
FROM products
WHERE category IS NOT NULL
GROUP BY category
HAVING SUM(stock) >= 5
ORDER BY total_stock DESC;実行結果OUTPUT
category product_count total_stock average_price
stationery 2 12 225.00
book 1 5 2800.00COUNT(*)は行数、COUNT(category)はNULLでないカテゴリ数です。違いを意識しましょう。
INNER JOINで関連する表を読む
注文と商品を商品IDで結合します。まず準備として注文表を作ります。
注文テーブルMYSQL
CREATE TABLE orders (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
product_id INT UNSIGNED NOT NULL,
quantity INT UNSIGNED NOT NULL,
ordered_at DATE NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (product_id) REFERENCES products(id)
) ENGINE = InnoDB;
INSERT INTO orders (product_id, quantity, ordered_at) VALUES
(1, 2, '2026-10-01'),
(2, 3, '2026-10-02');商品名と注文金額MYSQL
SELECT o.id, p.name, o.quantity,
p.price * o.quantity AS total
FROM orders AS o
INNER 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.00LEFT JOINで未注文も残す
INNER JOINは両方に一致する行だけを返します。商品ごとの注文数を出し、注文がない商品も表示するならLEFT JOINです。
商品別の注文数MYSQL
SELECT p.name,
COALESCE(SUM(o.quantity), 0) AS ordered_quantity
FROM products AS p
LEFT JOIN orders AS o ON o.product_id = p.id
GROUP BY p.id, p.name
ORDER BY p.id;実行結果OUTPUT
name ordered_quantity
MySQL入門書 2
ノート 3
ボールペン 0
マグカップ 0右側に一致がない商品では集計値がNULLになるため、COALESCEで0にします。
副問い合わせを使う
問い合わせの結果を、別の問い合わせの条件に使えます。平均価格より高い商品を探す例です。
平均より高い商品MYSQL
SELECT name, price
FROM products
WHERE price > (
SELECT AVG(price)
FROM products
)
ORDER BY price DESC;実行結果OUTPUT
name price
MySQL入門書 2800.00複雑になったら、まず内側のSELECT AVG(price)だけを実行し、結果を確認してから外側を組み立てます。
練習:商品別売上
注文テーブルと商品テーブルを結合し、商品ごとの売上金額を求めてください。
解答例
解答例MYSQL
SELECT p.name,
SUM(p.price * o.quantity) AS sales
FROM products AS p
INNER JOIN orders AS o ON o.product_id = p.id
GROUP BY p.id, p.name
ORDER BY sales DESC;実行結果の例OUTPUT
name sales
MySQL入門書 5600.00
ノート 900.00