🎯 Step 1: 基礎の復習とコース概要
応用コースへようこそ!まずは準備を整えましょう
- SQL基礎コースの重要ポイント復習
- 応用コースで学ぶ内容の全体像
- 実務でのSQL活用レベル診断
- 練習用の大規模データベース準備
🎓 1. SQL基礎コースの重要ポイント復習
これまで学んだことを振り返りましょう
SQL応用コースに進む前に、基礎コースで学んだ重要なポイントを復習しましょう。これらがしっかり理解できていれば、応用コースもスムーズに進められます!
基礎コースでは、データベースを操作するための「基本的な道具」を学びました。これは料理でいえば、包丁の使い方やフライパンの扱い方を覚えた段階です。応用コースでは、これらの道具を組み合わせて、より複雑で美味しい料理を作る方法を学んでいきます。
- SELECT文 – データの取得(データベースから必要な情報を取り出す)
- 集計とグループ化 – データの分析(合計や平均などを計算する)
- テーブル結合 – 複数テーブルの連携(別々の表を組み合わせる)
- データ操作 – INSERT/UPDATE/DELETE(データの追加・変更・削除)
- 実践プロジェクト – 総合的な活用(学んだことを組み合わせて使う)
1-1. SELECT文の基礎
SELECT文は、データベースから情報を取り出すための最も基本的な命令です。「データベースに質問する」ようなイメージで考えると分かりやすいでしょう。
■ すべてのデータを取得する
まずは最もシンプルな形から見ていきましょう。「productsテーブルのすべてのデータを見せて」という質問をSQLで書くとこうなります。
※横にスクロールできます
SELECT→ 「選び出して」という命令。データを取り出す合図です*→ 「すべての列」を意味する記号。アスタリスクと読みますFROM products→ 「productsテーブルから」という指定;→ 命令の終わりを示す記号(文の終わりのピリオドのようなもの)
■ 特定の列だけを選んで取得する
すべての列ではなく、必要な列だけを取り出したい場合は、*の代わりに列名を指定します。これは「商品名と価格だけ教えて」と質問するようなものです。
※横にスクロールできます
product_name, price→ 取得したい列名をカンマで区切って指定
- 必要な情報だけを取り出すことで、データが見やすくなる
- 大量のデータがある場合、処理が速くなる
- 実務では必要な列だけを指定するのが基本です
■ 条件を指定してデータを絞り込む(WHERE句)
「すべての商品」ではなく「価格が1000円以上の商品だけ」のように、条件をつけて絞り込むことができます。これがWHERE句です。
※横にスクロールできます
WHERE→ 「〜という条件で」という絞り込みの合図price >= 1000→ 「priceが1000以上」という条件
=→ 等しい(例:category = '食品')!=または<>→ 等しくない>→ より大きい<→ より小さい>=→ 以上<=→ 以下
■ データを並び替える(ORDER BY句)
取得したデータを特定の順番で並び替えることができます。価格の高い順や、日付の新しい順など、見やすい順序に整理できます。
※横にスクロールできます
ORDER BY price→ 「priceの順番で並び替えて」という指定DESC→ 「降順(大きい順・新しい順)」を意味する。Descendingの略ASC→ 「昇順(小さい順・古い順)」を意味する。Ascendingの略(省略するとこちらがデフォルト)
■ 取得件数を制限する(LIMIT句)
「上位10件だけ」のように、取得するデータの件数を制限できます。ランキングを作るときや、大量のデータから一部だけ確認したいときに便利です。
※横にスクロールできます
LIMIT 10→ 「10件だけ取得して」という制限
- 大量のデータがある場合、すべて表示すると時間がかかる
- 「トップ10」「ワースト5」などのランキングを作成できる
- データの中身をサッと確認したいときに便利
■ SELECT文の完成形サンプル
これまで学んだ要素を組み合わせると、より実用的なクエリが書けます。「価格が1000円以上の商品を、価格の高い順に10件表示する」というクエリを見てみましょう。
※横にスクロールできます
SELECT文の各句は、必ず以下の順番で書く必要があります:
SELECT→ どの列を取得するかFROM→ どのテーブルからWHERE→ どんな条件で(省略可)ORDER BY→ どんな順番で(省略可)LIMIT→ 何件まで(省略可)
1-2. 集計関数とGROUP BY
集計関数は、複数のデータをまとめて計算する機能です。「何件あるか」「合計はいくらか」「平均はいくらか」といった質問に答えるために使います。
■ 件数を数える(COUNT関数)
COUNT関数は、条件に合うデータが何件あるかを数えます。「注文は全部で何件?」という質問に答えるイメージです。
※横にスクロールできます
COUNT(*)→ 「行数を数えて」という命令*→ すべての行を対象にする(NULLも含めて数える)
COUNT(*)→ 全行数を数える(最も一般的)COUNT(列名)→ その列がNULLでない行を数えるCOUNT(DISTINCT 列名)→ 重複を除いた種類数を数える
■ 合計・平均・最大・最小を求める
数値データに対して、さまざまな計算ができます。売上の合計や、価格の平均などを求めるのに使います。
※横にスクロールできます
SUM(amount)→ amountの合計値を計算するAVG(amount)→ amountの平均値を計算するMAX(amount)→ amountの最大値を取得するMIN(amount)→ amountの最小値を取得するas total_sales→ 計算結果に「total_sales」という名前をつける(別名)
- 計算結果の列名が分かりやすくなる
- 後で結果を利用するときに参照しやすい
- レポートの見出しとして使える
| total_sales | avg_sales | max_sales | min_sales |
|---|---|---|---|
| 12,500,000 | 2,500 | 150,000 | 100 |
■ カテゴリ別に集計する(GROUP BY句)
「全体の合計」ではなく「カテゴリごとの合計」のように、グループに分けて集計したい場合はGROUP BY句を使います。
例えば、お店の売上を考えてみましょう。「全体の売上合計」を知りたいこともあれば、「食品の売上」「衣類の売上」「電化製品の売上」のように、カテゴリ別に知りたいこともありますよね。GROUP BYはまさにそのような「分類ごとの集計」を実現します。
※横にスクロールできます
GROUP BY category→ 「categoryが同じものをグループにまとめて」という指定- グループごとにCOUNTやAVGが計算される
- SELECTに書く列は、GROUP BYに含まれるか、集計関数である必要がある
- 例:
SELECT category, COUNT(*)はOK - 例:
SELECT category, product_name, COUNT(*)は通常エラー(product_nameがグループ化されていない)
| category | product_count | avg_price |
|---|---|---|
| 食品 | 150 | 580 |
| 衣類 | 80 | 3,200 |
| 電化製品 | 45 | 25,000 |
■ グループに条件をつける(HAVING句)
グループ化した後に、「商品数が5個以上のカテゴリだけ表示したい」のような条件をつけたい場合はHAVING句を使います。
WHEREとHAVINGの違いが少し分かりにくいかもしれません。簡単に言うと:
- WHERE → グループ化する「前」に個々の行を絞り込む
- HAVING → グループ化した「後」にグループを絞り込む
※横にスクロールできます
HAVING COUNT(*) >= 5→ 「件数が5以上のグループだけ表示して」という条件
- WHERE: 集計する前の絞り込み(例: 価格が100円以上の商品だけを集計対象にする)
- HAVING: 集計した後の絞り込み(例: 商品数が5個以上のカテゴリだけ表示する)
WHERE: 料理を作る前に、傷んだ野菜を取り除く(個々の材料を選別)
HAVING: 料理を作った後に、量が少ない皿は出さない(完成した料理を選別)
1-3. テーブル結合(JOIN)
実際のデータベースでは、情報が複数のテーブルに分かれて保存されています。JOINは、これらの分かれた情報を組み合わせて、一つの結果として取得する機能です。
例えば、「注文テーブル」には顧客ID(customer_id)が記録されていますが、顧客の名前は「顧客テーブル」にあります。これらを組み合わせて「誰が何を注文したか」を知りたいときにJOINを使います。
同じ情報を何度も書くと、データの無駄や矛盾が発生しやすくなります。例えば、顧客の住所が変わったとき、1箇所だけ変更すれば済むようにテーブルを分けておくのがデータベース設計の基本です。
■ INNER JOIN(内部結合)
INNER JOINは、両方のテーブルに一致するデータがある場合のみ結果に含めます。「注文した顧客」だけを表示したい場合に使います。
まず、クエリを分解して説明します。
Step 1: 取得したい列を指定する
※横にスクロールできます
複数のテーブルを結合するときは、テーブル名.列名の形式で書くと、どのテーブルの列かが明確になります。両方のテーブルに同じ名前の列がある場合は、必ずこの形式で書く必要があります。
Step 2: 基準となるテーブルを指定する
※横にスクロールできます
最初に書くテーブルを「基準テーブル」と考えます。ここでは「注文」を中心に見ていきます。「どのテーブルを中心に考えるか」によって、FROMに書くテーブルを決めます。
Step 3: 結合するテーブルと条件を指定する
※横にスクロールできます
INNER JOIN customers→ 「customersテーブルを結合して」という指定ON orders.customer_id = customers.customer_id→ 「customer_idが一致する行同士を結合して」という条件
完成形のクエリ:
※横にスクロールできます
| customer_name | order_date | amount |
|---|---|---|
| 山田太郎 | 2024-01-15 | 5,000 |
| 佐藤花子 | 2024-01-16 | 3,200 |
| 山田太郎 | 2024-01-20 | 8,500 |
■ LEFT JOIN(左外部結合)
LEFT JOINは、左側のテーブル(FROMに書いたテーブル)のデータはすべて表示し、右側のテーブルは一致するものだけを表示します。一致しない場合はNULLになります。
「注文がない顧客も含めて、全顧客の注文状況を見たい」という場合に使います。
※横にスクロールできます
- INNER JOIN: 両方に存在するデータのみ表示(注文がある顧客だけ)
- LEFT JOIN: 左側のデータはすべて表示(注文がない顧客も含む)
| customer_name | order_count |
|---|---|
| 山田太郎 | 5 |
| 佐藤花子 | 3 |
| 鈴木一郎 | 0 |
※ 鈴木一郎さんは注文がないが、LEFT JOINなので表示される(INNER JOINだと表示されない)
■ 3つのテーブルを結合する
JOINは連続して書くことで、3つ以上のテーブルを結合できます。例えば「顧客名」「商品名」「注文数量」を一度に取得したい場合などです。
※横にスクロールできます
- まず orders と customers を customer_id で結合
- その結果に products を product_id で結合
- 最終的に3つのテーブルの情報が1つにまとまる
- 結合条件(ONの後)には、両方のテーブルにある「共通のキー」を指定する
- テーブル名.列名の形式で、どのテーブルの列か明確にする
- 結合の順番は、データの論理的な関係を考えて決める
- 迷ったらINNER JOINから始めて、必要に応じてLEFT JOINに変更する
1-4. データ操作(INSERT/UPDATE/DELETE)
データベースは「読むだけ」ではなく、データを追加・変更・削除することもできます。これらの操作をまとめて「データ操作」と呼びます。
■ データの挿入(INSERT)
新しいデータをテーブルに追加する命令です。新商品を登録したり、新しい顧客を追加したりするときに使います。
※横にスクロールできます
INSERT INTO products→ 「productsテーブルに挿入して」という命令(product_name, price, stock)→ 値を入れる列名を指定VALUES ('新商品', 2000, 100)→ 実際に入れる値(列の順番と一致させる)
■ データの更新(UPDATE)
既存のデータを変更する命令です。価格を変更したり、在庫数を更新したりするときに使います。
※横にスクロールできます
UPDATE products→ 「productsテーブルを更新して」という命令SET price = 1800→ 「priceを1800に変更して」という指定WHERE product_id = 101→ 「product_idが101の行だけ」という条件
WHERE句を忘れると、すべての行が更新されてしまいます!必ず条件を指定して、更新対象を限定しましょう。実行前に必ずSELECT文で対象データを確認する習慣をつけましょう。
■ データの削除(DELETE)
既存のデータを削除する命令です。不要なデータを消したり、古いレコードを削除したりするときに使います。
※横にスクロールできます
DELETE FROM products→ 「productsテーブルから削除して」という命令WHERE product_id = 999→ 「product_idが999の行だけ」という条件
WHERE句を忘れると、すべてのデータが削除されてしまいます!削除は取り消せないので、特に慎重に操作しましょう。本番環境では、まずテスト環境で動作確認することをおすすめします。
応用コースに進む前に、以下の項目ができるか確認しましょう:
- SELECT文で必要なデータを取得できる
- WHERE句で条件を指定できる
- ORDER BYとLIMITを使える
- COUNT、SUM、AVGなどの集計関数を使える
- GROUP BYでカテゴリ別に集計できる
- INNER JOINで2つのテーブルを結合できる
- LEFT JOINの動作を理解している
- INSERT、UPDATE、DELETEが使える
🚀 2. 応用コースで学ぶ内容の全体像
これから何を学ぶのか?
SQL応用コースでは、基礎コースで学んだ知識をさらに発展させて、実務レベルのSQL技術を習得します。大規模なデータを扱う企業で求められるスキルを、初心者でも理解できるよう丁寧に解説していきます!
2-1. Part 2: サブクエリマスター編(Step 2-5)
クエリの中にクエリを入れる技術です。「平均価格より高い商品を探す」のような複雑な条件を、1つのクエリで簡潔に表現できます!
※横にスクロールできます(サブクエリの先取り例)
- WHERE句、FROM句、SELECT句でのサブクエリ
- 相関サブクエリとEXISTS
- サブクエリの最適化テクニック
2-2. Part 3: ウィンドウ関数編(Step 6-9)
データ分析で超強力なツールです!ランキング、累積合計、移動平均などが簡単に計算できます。Excelでいう「連番を振る」「累計を計算する」といった操作をSQLで実現できます。
※横にスクロールできます(ウィンドウ関数の先取り例)
- ROW_NUMBER、RANK、DENSE_RANK(順位付け)
- 累積合計と移動平均
- LAG、LEAD(前後の行を参照)
- 前月比、前年比の計算
2-3. Part 4: 高度なJOIN技術編(Step 10-11)
CROSS JOINや自己結合など、より複雑な結合パターンを学びます。「全商品×全店舗の組み合わせを作る」「同じテーブル内で比較する」といった高度な操作ができるようになります。
- CROSS JOIN(直積結合)
- 自己結合(Self Join)
- 複数条件での結合
- 不等号を使った結合
2-4. Part 5: データ操作応用編(Step 12-13)
CASE文やJOINを使った更新など、実務で頻繁に使う技術です。「条件によって異なる値を設定する」「別テーブルの値を参照して更新する」といった複雑な操作ができます。
- CASE文で条件分岐
- ピボット変換(行を列に)
- INSERT SELECTで大量データ挿入
- JOINを使った更新
2-5. Part 6: インデックス設計編(Step 14-16)
クエリを劇的に速くする仕組みです!本の目次のようなものと考えてください。目次があれば、知りたいページをすぐに見つけられますよね。インデックスはデータベースの「目次」です。
- インデックスの仕組み(B-tree)
- インデックスの作成と設計
- インデックスが効かないケース
- 適切なインデックス設計
2-6. Part 7: パフォーマンス最適化編(Step 17-19)
遅いクエリを速くする技術です!実務で最も重要なスキルの1つです。数分かかっていた処理を数秒に短縮できることもあります。
- 実行計画の読み方
- 遅いクエリの診断と改善
- N+1問題の解決
- ベンチマークの取り方
2-7. Part 8: 実践プロジェクト編(Step 20)
大規模ECサイトの売上分析ダッシュボードを作成します!これまで学んだすべての技術を組み合わせて、実務で使えるレポートを作ります。
- 月次・週次・日次の売上推移
- カテゴリ別ランキング
- 前年比・前月比の計算
- 顧客セグメント分析
- 遅いクエリの最適化
📊 3. 実務でのSQL活用レベル診断
あなたの現在のレベルを確認しましょう
以下の質問に答えて、自分がどのレベルにいるか確認してみましょう!
レベル1初級
基本的なデータ取得ができる
- SELECT文でデータを取得できる
- WHERE句で条件を指定できる
- ORDER BYで並び替えができる
- LIMITで件数を制限できる
→ SQL基礎コースのStep 4-7レベル
レベル2初級〜中級
集計とグループ化ができる
- COUNT、SUM、AVGなどの集計関数を使える
- GROUP BYでカテゴリ別に集計できる
- HAVINGでグループに条件を指定できる
→ SQL基礎コースのStep 8-9レベル
レベル3中級
テーブル結合ができる
- INNER JOINで2つのテーブルを結合できる
- LEFT JOINの動作を理解している
- 3つ以上のテーブルを結合できる
- INSERT、UPDATE、DELETEが使える
→ SQL基礎コースのStep 10-14レベル
レベル4中級〜上級
複雑なクエリが書ける
- サブクエリを使える
- ウィンドウ関数を知っている
- CASE文で条件分岐ができる
- 複雑な集計ができる
→ SQL応用コースで目指すレベル
レベル5上級
パフォーマンス最適化ができる
- インデックスを適切に設計できる
- 実行計画を読んで分析できる
- 遅いクエリを診断して改善できる
- 大規模データを効率的に扱える
→ SQL応用コース修了後のレベル
レベル3(中級)以上の方は、このコースをスムーズに進められます!
レベル1〜2の方は、まずSQL基礎コースから始めることをおすすめします。
💾 4. 練習用の大規模データベース準備
実践的な環境を整えましょう
応用コースでは、より実践的な学習のために大規模なサンプルデータベースを使います。基礎コースよりも多くのデータと複雑なテーブル構造を扱います!
4-1. 使用するデータベースの概要
架空のECサイト「SmartShop」のデータベースを使います。実際のオンラインショップのようなデータ構造で、実務に近い経験ができます。
- 顧客: 10,000人
- 商品: 1,000点
- 注文: 50,000件
- レビュー: 15,000件
4-2. テーブル構造
このデータベースは5つのテーブルで構成されています。それぞれのテーブルがどのような情報を持っているか見ていきましょう。
■ 顧客テーブル(customers)
お客様の情報を保存するテーブルです。名前、連絡先、累計注文数などを管理します。
※横にスクロールできます
■ 商品テーブル(products)
販売している商品の情報を保存するテーブルです。価格、在庫、評価などを管理します。
※横にスクロールできます
■ 注文テーブル(orders)
注文の基本情報を保存するテーブルです。誰がいつ注文したか、支払い方法などを管理します。
※横にスクロールできます
■ 注文明細テーブル(order_details)
1つの注文に含まれる商品の詳細を保存するテーブルです。何をいくつ買ったかを管理します。
※横にスクロールできます
■ レビューテーブル(reviews)
商品に対するお客様のレビューを保存するテーブルです。評価やコメントを管理します。
※横にスクロールできます
4-3. データベースのセットアップ方法
- DB Browser for SQLiteを起動
- まだインストールしていない方は、基礎コースを参照してください
- 新しいデータベースを作成
- ファイル名: smartshop_advanced.db
- テーブルを作成
- 上記のCREATE TABLE文を実行
- サンプルデータを投入
- 次のステップで詳しく説明します
4-4. 基礎コースとの違い
| 項目 | 基礎コース | 応用コース |
|---|---|---|
| 顧客数 | 約100人 | 10,000人 |
| 商品数 | 約50点 | 1,000点 |
| 注文数 | 約500件 | 50,000件 |
| テーブル数 | 3テーブル | 5テーブル |
| データサイズ | 約1MB | 約50MB |
大規模データを扱うため、クエリの実行時間が長くなる場合があります。これは正常な動作です。実務でも同様の状況に直面するため、良い練習になります!
🎯 5. 応用コースで目指すゴール
このコース修了後、あなたができるようになること
- サブクエリを使いこなし、複雑な条件を簡潔に表現できる
- ウィンドウ関数で高度なデータ分析ができる
- インデックスを適切に設計し、クエリを高速化できる
- 実行計画を読み、パフォーマンスの問題を特定できる
- 遅いクエリを診断し、最適化できる
- 大規模データを扱う実務レベルのSQL技術が身につく
- 実際のビジネスデータを分析できる
- 売上レポートやダッシュボードを作成できる
- データベースのパフォーマンス問題を解決できる
- チームメンバーに技術的なアドバイスができる
- データエンジニア・データアナリストへの道が開ける
学習の進め方
- 手を動かす
- 必ず自分でコードを書いて実行しましょう
- コピー&ペーストだけでは身につきません
- 理解してから進む
- わからないことがあれば、前のステップに戻りましょう
- 焦らず、じっくり理解を深めましょう
- 練習問題に挑戦
- 各ステップの練習問題は必ず解きましょう
- 解けなくても大丈夫、解答例を参考に学びましょう
- 応用してみる
- 学んだことを自分のアイデアで試してみましょう
- 創造的に使うことで、理解が深まります
📝 準備確認クイズ
次のステップに進む前に、基礎知識を確認しましょう!
クイズ 1基本
基本的なSELECT
productsテーブルから、priceが1000円以上の商品を価格の高い順に10件取得するクエリを書いてください。
※横にスクロールできます
解説:
WHERE price >= 1000で1000円以上に絞り込みORDER BY price DESCで価格の高い順に並び替えLIMIT 10で10件に制限
クイズ 2基本
集計関数
ordersテーブルから、注文の総件数、合計金額、平均金額を取得するクエリを書いてください。
※横にスクロールできます
解説:
COUNT(*)で注文の総件数を計算SUM(total_amount)で合計金額を計算AVG(total_amount)で平均金額を計算asで分かりやすい列名をつけています
クイズ 3応用
GROUP BY
productsテーブルから、カテゴリ別の商品数と平均価格を取得し、商品数が多い順に並べてください。
※横にスクロールできます
解説:
GROUP BY categoryでカテゴリ別にグループ化COUNT(*)で各カテゴリの商品数を計算AVG(price)で各カテゴリの平均価格を計算ORDER BY product_count DESCで商品数の多い順に並び替え
クイズ 4応用
INNER JOIN
ordersテーブルとcustomersテーブルを結合して、顧客名、注文日、金額を取得してください。
※横にスクロールできます
解説:
INNER JOIN customersで顧客テーブルを結合ON orders.customer_id = customers.customer_idで結合条件を指定テーブル名.列名の形式で、どのテーブルの列かを明確に
クイズ 5チャレンジ
複合クエリ
顧客ごとの注文件数と合計金額を取得し、注文件数が5件以上の顧客だけを表示してください。
※横にスクロールできます
解説:
LEFT JOIN ordersで注文テーブルを結合(注文がない顧客も含む)GROUP BYで顧客ごとにグループ化HAVING COUNT(orders.order_id) >= 5で5件以上の顧客に絞り込みORDER BY total_spent DESCで合計金額の多い順に並び替え
📝 Step 1 のまとめ
- SQL基礎コースの重要ポイントを復習した
- 応用コースで学ぶ内容の全体像を理解した
- 自分の現在のレベルを診断した
- 大規模データベースの構造を理解した
- コース修了後のゴールを明確にした
- 基礎知識の復習は完了しましたか?
- 準備確認クイズは解けましたか?
- データベースのセットアップは理解しましたか?
- 学習の進め方を確認しましたか?
Step 2: サブクエリの基礎では、クエリの中にクエリを入れる「サブクエリ」を学びます。複雑な条件を簡潔に表現できる強力な技術です!
❓ よくある質問
Q1: 基礎コースを完璧に理解していないと応用コースは無理ですか?
完璧である必要はありません!
SELECT、WHERE、JOIN、GROUP BYの基本が理解できていれば大丈夫です。わからないことがあれば、その都度基礎コースに戻って復習しましょう。
Q2: どのくらいの期間で修了できますか?
1日2時間の学習で約1〜1.5ヶ月が目安です。ただし、個人のペースで構いません。理解を深めることが最も重要です!
Q3: 大規模データベースの準備が難しそうです
次のステップで詳しいセットアップ手順を説明します。また、サンプルデータを自動生成するスクリプトも提供しますので、心配いりません!
Q4: 実務経験がなくても大丈夫ですか?
はい、大丈夫です!
このコースは実務未経験者でも理解できるように設計されています。実務で使える知識を、基礎から丁寧に学べます。
Q5: どのデータベースを使いますか?
基本的にはSQLiteを使います。ただし、ウィンドウ関数やインデックスなどの概念は、MySQL、PostgreSQL、SQL Serverなど他のデータベースでも共通です。
Q6: 練習問題は必ず解く必要がありますか?
強く推奨します!
読むだけでは身につきません。実際に手を動かすことで、理解が深まり、実務で使えるスキルになります。
学習メモ
SQL応用・パフォーマンス最適化 - Step 1