コース一覧
SQL入門:データベース操作のきほん
SELECT文の実行順序

SQL入門:データベース操作のきほん

SELECT、INSERT、UPDATE、DELETE に加え、WHERE、JOIN、GROUP BY、サブクエリなど SQL の基礎構文を、ブラウザ上のサンプル DB を操作しながら学べる無料コースです。データ分析やアプリ開発で SQL を初めて学ぶ社会人や学生を対象としています。約 18 時間 (1 日 30 分 × 36 日) で 71 レッスンを修了でき、修了後は業務データの抽出、集計、簡単なレポート作成を SQL で行えるようになります。

1
SQLとデータベースの基礎
01. データベースとは何か5分
02. リレーショナルDBの仕組み5分
03. テーブル・行・列の基本5分
04. 主キーとNULL制約5分
05. 基礎確認クイズ5分
2
データの取得 - SELECT文マスター
01. SELECT文の基本構文5分
02. WHERE句で条件絞り込み5分
03. 比較演算子とLIKEパターン5分
04. AND/OR/NOTで複合条件5分
05. ORDER BYでソート5分
06. LIMITで件数制限5分
07. 日付関数の活用5分
08. データ取得チャレンジ5分
3
データ集計と分析
01. 集計関数 COUNT/SUM/AVG/MAX/MIN5分
02. NULLの扱い方5分
03. 算術演算とエイリアス5分
04. CASE式で条件分岐5分
05. DISTINCTで重複排除5分
06. 文字列関数5分
07. GROUP BYでグループ化5分
08. HAVINGでグループ条件5分
09. SELECT文の実行順序5分
10. 集計分析チャレンジ5分
4
テーブル結合
01. なぜ結合が必要か5分
02. INNER JOINの基本5分
03. LEFT/RIGHT OUTER JOIN5分
04. 複数テーブルの結合5分
05. 自己結合5分
06. 集合演算 UNION/INTERSECT/EXCEPT5分
07. 結合の実践演習5分
08. テーブル結合クイズ5分
5
サブクエリ活用
01. サブクエリとは5分
02. WHERE句のサブクエリ5分
03. FROM句のサブクエリ5分
04. SELECT句のサブクエリ5分
05. WITH句(CTE)の活用5分
06. サブクエリ実践クイズ5分
6
テーブル作成とデータ操作
01. CREATE DATABASE と CREATE TABLE5分
02. データ型の選び方5分
03. INSERT 文でデータを追加する5分
04. UPDATE 文でデータを更新する5分
05. DELETE 文でデータを削除する5分
06. 物理削除と論理削除5分
07. ALTER TABLE で構造を変更する5分
08. 制約 (NOT NULL / UNIQUE / DEFAULT)5分
09. TRUNCATE と DROP5分
10. DDL / DML 実践クイズ5分
7
外部キーと参照整合性
01. 外部キーの役割5分
02. FOREIGN KEY制約の設定5分
03. ON DELETE/UPDATE ポリシー5分
04. CASCADE vs RESTRICT vs SET NULL5分
05. 物理FK vs 論理FK5分
06. 外部キークイズ5分
8
データモデリング入門
01. データモデリングとは5分
02. ER図の読み方・書き方5分
03. エンティティと属性5分
04. リレーションシップとカーディナリティ5分
05. 1対1/1対多/多対多の設計5分
06. モデリング基礎クイズ5分
9
正規化
01. なぜ正規化が必要か5分
02. 第1正規形 (1NF)5分
03. 第2正規形 (2NF)5分
04. 第3正規形 (3NF)5分
05. 非正規化の判断5分
06. 正規化クイズ5分
10
物理設計とインデックス
01. 物理設計の考え方5分
02. 命名規則のベストプラクティス5分
03. インデックスの仕組み5分
04. CREATE INDEXの使い方5分
05. インデックス設計の注意点5分
06. 物理設計クイズ5分

SELECT文の実行順序

AS を使って列に名前を付けられるようになりました。ところがその名前を WHERE で使おうとすると、多くのデータベースで「そんな列は無い」と言われます。

付けたはずの別名が、WHERE からは見えない

SQL クエリ

-- 税込価格が 5000 円を超える本を探したい SELECT title, price * 1.10 AS price_with_tax FROM books WHERE price_with_tax > 5000;

書いた順序では SELECT が先頭にあるので、price_with_tax はもう存在しているように見えます。しかし SQL は書いた順には実行されません。WHERE が動くのは SELECT よりずっと前で、その時点では別名がまだ生まれていないのです。

回避するには、式をそのまま書き直します。

SQL クエリ

SELECT title, price * 1.10 AS price_with_tax FROM books WHERE price * 1.10 > 5000;

ORDER BY なら、同じ別名がそのまま使える

SQL クエリ

SELECT title, price * stock AS inventory_value FROM books ORDER BY inventory_value DESC;

ORDER BY は出力する列が決まったあと、つまり SELECT より後に動きます。別名はもう存在しているので、そのまま参照できます。使える句と使えない句がある理由は、この前後関係だけです。

実際に動く順番

読み込み (FROM) から始まり、行を絞り (WHERE)、グループに束ね (GROUP BY)、集計し、グループを絞り (HAVING)、出力する列を決め (SELECT)、並べ替え (ORDER BY)、上から必要な数だけ切り出します (LIMIT)。

書く順序 SELECT [DISTINCT] → FROM → WHERE GROUP BY → HAVING → ORDER BY → LIMIT 論理実行順序 · 演習の値 01 FROM products · 8 行 02 WHERE price >= 1000 · 8 行 03 GROUP BY 3 組 · 3 / 3 / 2 行 04 SUM 137780 / 8500 / 2700 05 HAVING 食品 2700 を除外 · 2 行 06 SELECT category, total · total 生成 07 DISTINCT 未使用 · 2 行のまま 08 ORDER BY total DESC · 137780 → 8500 09 LIMIT LIMIT 2 · 2 行のまま total は 06 で生まれる · WHERE × · ORDER BY ○ 結果 家電 137780 · 書籍 8500

この順番が分かっていると、もう一つのよくあるエラーも読めます。

SQL クエリ

-- 集計はまだ終わっていないので、ここでは使えない SELECT genre, SUM(price) FROM books WHERE SUM(price) >= 10000 GROUP BY genre;

WHERE が動く時点では、まだ 1 行 1 行がばらばらのままです。合計という値が生まれるのはもっと後なので、WHERE からは触れません。集計し終わったあとで絞りたいなら HAVING の出番です。

解説

エラーが出たら「その値は、この句が動く時点でもう存在しているか」を考えてみてください。実行順序がらみの詰まりは、ほぼこれで説明が付きます。

テーブル構造

CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, category VARCHAR(30) NOT NULL, price INT NOT NULL ); INSERT INTO products (id, name, category, price) VALUES (1, 'ノートPC', '家電', 128000), (2, 'マウス', '家電', 2980), (3, 'キーボード', '家電', 6800), (4, '小説A', '書籍', 1800), (5, '小説B', '書籍', 2200), (6, '専門書A', '書籍', 4500), (7, 'コーヒー豆', '食品', 1500), (8, '紅茶葉', '食品', 1200);

期待される出力

categorytotal
家電137780
書籍8500

ヒント

WHERE で集計前の絞り込み (price >= 1000)

GROUP BY と SUM で集計、HAVING で集計後の絞り込み (>= 5000)

ORDER BY total DESC LIMIT 2 で上位 2 件

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • データベースデータを構造化して保存する仕組み
  • SQLデータベースを操作するための共通言語
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • 評価出力品質を数値化して継続改善する活動
  • 実行順序SQLが内部で評価される手順
  • URLページの住所全体
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...