SQL Visual Guide

図で理解する
SQL SELECT文の中で起きていること

SQLは、完成した結果を突然取り出しているわけではありません。 同じデータを追いかけながら、結合・絞り込み・グループ化・列の選択で 表の形が変わる様子を見てみましょう。

  • 6ステップで確認
  • ボタンでもスクロールでも操作
  • SQLコードと図が連動

LOGICAL FLOW

  1. 01JOIN表をつなぐ
  2. 02WHERE行を絞る
  3. 03GROUP BY行を束ねる
  4. 04HAVING束を絞る
  5. 05SELECT列を選ぶ

Interactive

同じデータがどう変わるかを見る

「次へ」で順に進むか、対応する解説までスクロールしてください。
前の状態にもいつでも戻れます。

DATA TRANSFORMATION

STEP 0 / 5 — TABLES

0 / 5

STEP 0

2つのテーブルから始める

2 tables

データベースには、複数のテーブルがそれぞれ独立して存在しています。

users5 rows
nameactivedepartment_id
Alicetrue10
Bobtrue10
Carolfalse20
Davetrue20
Evetrue30
departments3 rows
idname
10Sales
20Dev
30Support

TABLES:まだ表どうしは接続されていません。

0

START

TABLES

処理の前には、users と departments が独立して存在しています。まずは、どの表からデータを取り出すかを FROM で決めます。

1

CONNECT

JOIN

department_id = id を手がかりに2つの表を結び、部署名の列を持ち込みます。JOIN後の行数は、結合条件とデータの関係によって増える・減る・同じのいずれもあり得ます。

JOINの用語解説
2

FILTER ROWS

WHERE

active = true を1行ずつ判定し、条件に合わない Carol の行を除外します。WHEREが絞る対象は、グループではなく個々の行です。

WHEREの用語解説
3

MAKE GROUPS

GROUP BY

部署名が同じ行を Sales・Dev・Support の箱に束ねます。行を重複として削除する処理ではなく、COUNT・SUM・AVGなどを計算する単位を作る処理です。

GROUP BYの用語解説
4

FILTER GROUPS

HAVING

COUNT(*) >= 2 を各グループに適用し、2人いる Sales だけを残します。HAVINGが絞る対象は、GROUP BY後のグループです。

HAVINGの用語解説
5

SHAPE RESULT

SELECT

最後に、部署名と人数だけを取り出します。AS で結果列に読みやすい名前を付け、2列の完成した表へ整えます。

SELECTの用語解説

Mental Model

SQLは、表の形を段階的に変えていく

構文を個別に暗記する前に、「いま何を対象に、
表をどう変えているか」を意識してみましょう。

  1. STARTTABLES独立した表
  2. 01JOIN横に広がる
  3. 02WHERE行が減る
  4. 03GROUP BY束になる
  5. 04HAVING束が減る
  6. 05SELECT列が減る

Written order

SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING

Logical order

FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT

この論理順序は学習用のモデルです。実際のDBMSは、同じ結果を効率よく返すために物理的な実行計画を組み替えることがあります。

JOIN Variations

JOINの違いは「どの行を残すか」で見る

円の重なりだけでなく、対応相手がいない行とNULLの位置を、実際の表で比べてみましょう。

users
namedepartment_id
Alice10
Bob10
Frank99
departments
idname
10Sales
40HR

一致する行だけ

INNER JOIN

userdepartment
AliceSales
BobSales
Frank—
—HR
対応相手がいない Frank と HR は結果に残りません。

左の表をすべて残す

LEFT OUTER JOIN

userdepartment
AliceSales
BobSales
FrankNULL
相手がいない Frank の部署情報にはNULLが入ります。

右の表をすべて残す

RIGHT OUTER JOIN

userdepartment
AliceSales
BobSales
NULLHR
相手がいない HR のユーザー情報にはNULLが入ります。

WHERE vs HAVING

似ているけれど、絞る対象が違う

BEFORE GROUP BY

WHEREは「行」を絞る

Alice、Bob、Carol…という個々の行を条件判定します。集約前のデータ量を減らす役割です。

userdepartmentactive
AliceSalestrue
BobSalestrue
CarolDevfalse
WHERE u.active = true Carolの1行を除外
↓ 条件適用後
userdepartmentactive
AliceSalestrue
BobSalestrue
AFTER GROUP BY

HAVINGは「束」を絞る

Sales、Dev、Supportというグループを、COUNTなどの集約結果を使って条件判定します。

departmentCOUNT(*)
Sales2
Dev1
Support1
HAVING COUNT(*) >= 2 Dev・Supportの2グループを除外
↓ 条件適用後
departmentCOUNT(*)
Sales2

Miria SQL Learning

流れが見えたら、
今度は自分で動かしてみよう。

インストール不要の学習環境で、SELECT文を実際に書いて確認できます。

ブラウザだけで実行できます