MySQL

検索・集計・結合

一つのテーブルから複数テーブルまで、欲しい結果を組み立てます。

MySQL入門の講座一覧

01

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   残りわずか
02

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

COUNT(*)は行数、COUNT(category)はNULLでないカテゴリ数です。違いを意識しましょう。

03

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.00
04

LEFT 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にします。

05

副問い合わせを使う

問い合わせの結果を、別の問い合わせの条件に使えます。平均価格より高い商品を探す例です。

平均より高い商品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)だけを実行し、結果を確認してから外側を組み立てます。

06

練習:商品別売上

注文テーブルと商品テーブルを結合し、商品ごとの売上金額を求めてください。

解答例
解答例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