Step 1:基礎の復習とコース概要

🎯 Step 1: 基礎の復習とコース概要

応用コースへようこそ!まずは準備を整えましょう

📋 このステップで学ぶこと
  • SQL基礎コースの重要ポイント復習
  • 応用コースで学ぶ内容の全体像
  • 実務でのSQL活用レベル診断
  • 練習用の大規模データベース準備

🎓 1. SQL基礎コースの重要ポイント復習

これまで学んだことを振り返りましょう

SQL応用コースに進む前に、基礎コースで学んだ重要なポイントを復習しましょう。これらがしっかり理解できていれば、応用コースもスムーズに進められます!

基礎コースでは、データベースを操作するための「基本的な道具」を学びました。これは料理でいえば、包丁の使い方やフライパンの扱い方を覚えた段階です。応用コースでは、これらの道具を組み合わせて、より複雑で美味しい料理を作る方法を学んでいきます。

💡 基礎コースで学んだ5つの柱
  • SELECT文 – データの取得(データベースから必要な情報を取り出す)
  • 集計とグループ化 – データの分析(合計や平均などを計算する)
  • テーブル結合 – 複数テーブルの連携(別々の表を組み合わせる)
  • データ操作 – INSERT/UPDATE/DELETE(データの追加・変更・削除)
  • 実践プロジェクト – 総合的な活用(学んだことを組み合わせて使う)

1-1. SELECT文の基礎

SELECT文は、データベースから情報を取り出すための最も基本的な命令です。「データベースに質問する」ようなイメージで考えると分かりやすいでしょう。

■ すべてのデータを取得する

まずは最もシンプルな形から見ていきましょう。「productsテーブルのすべてのデータを見せて」という質問をSQLで書くとこうなります。

※横にスクロールできます

SELECT * FROM products;
命令の意味:
  • SELECT → 「選び出して」という命令。データを取り出す合図です
  • * → 「すべての列」を意味する記号。アスタリスクと読みます
  • FROM products → 「productsテーブルから」という指定
  • ; → 命令の終わりを示す記号(文の終わりのピリオドのようなもの)

■ 特定の列だけを選んで取得する

すべての列ではなく、必要な列だけを取り出したい場合は、*の代わりに列名を指定します。これは「商品名と価格だけ教えて」と質問するようなものです。

※横にスクロールできます

SELECT product_name, price FROM products;
命令の意味:
  • product_name, price → 取得したい列名をカンマで区切って指定
なぜこの命令を使うのか:
  • 必要な情報だけを取り出すことで、データが見やすくなる
  • 大量のデータがある場合、処理が速くなる
  • 実務では必要な列だけを指定するのが基本です

■ 条件を指定してデータを絞り込む(WHERE句)

「すべての商品」ではなく「価格が1000円以上の商品だけ」のように、条件をつけて絞り込むことができます。これがWHERE句です。

※横にスクロールできます

SELECT * FROM products WHERE price >= 1000;
命令の意味:
  • WHERE → 「〜という条件で」という絞り込みの合図
  • price >= 1000 → 「priceが1000以上」という条件
使える比較演算子:
  • = → 等しい(例: category = '食品'
  • != または <> → 等しくない
  • > → より大きい
  • < → より小さい
  • >= → 以上
  • <= → 以下

■ データを並び替える(ORDER BY句)

取得したデータを特定の順番で並び替えることができます。価格の高い順や、日付の新しい順など、見やすい順序に整理できます。

※横にスクロールできます

SELECT * FROM products ORDER BY price DESC;
命令の意味:
  • ORDER BY price → 「priceの順番で並び替えて」という指定
  • DESC → 「降順(大きい順・新しい順)」を意味する。Descendingの略
  • ASC → 「昇順(小さい順・古い順)」を意味する。Ascendingの略(省略するとこちらがデフォルト)

■ 取得件数を制限する(LIMIT句)

「上位10件だけ」のように、取得するデータの件数を制限できます。ランキングを作るときや、大量のデータから一部だけ確認したいときに便利です。

※横にスクロールできます

SELECT * FROM products ORDER BY price DESC LIMIT 10;
命令の意味:
  • LIMIT 10 → 「10件だけ取得して」という制限
なぜこの命令を使うのか:
  • 大量のデータがある場合、すべて表示すると時間がかかる
  • 「トップ10」「ワースト5」などのランキングを作成できる
  • データの中身をサッと確認したいときに便利

■ SELECT文の完成形サンプル

これまで学んだ要素を組み合わせると、より実用的なクエリが書けます。「価格が1000円以上の商品を、価格の高い順に10件表示する」というクエリを見てみましょう。

※横にスクロールできます

-- 基本のSELECT(すべてのデータ) SELECT * FROM products; -- 特定の列を選択 SELECT product_name, price FROM products; -- WHERE句で条件指定 SELECT * FROM products WHERE price >= 1000; -- ORDER BYで並び替え SELECT * FROM products ORDER BY price DESC; -- LIMITで件数制限 SELECT * FROM products ORDER BY price DESC LIMIT 10; -- すべてを組み合わせた例 SELECT product_name, price FROM products WHERE price >= 1000 ORDER BY price DESC LIMIT 10;
📌 SELECT文を書く順番のルール

SELECT文の各句は、必ず以下の順番で書く必要があります:

  1. SELECT → どの列を取得するか
  2. FROM → どのテーブルから
  3. WHERE → どんな条件で(省略可)
  4. ORDER BY → どんな順番で(省略可)
  5. LIMIT → 何件まで(省略可)

1-2. 集計関数とGROUP BY

集計関数は、複数のデータをまとめて計算する機能です。「何件あるか」「合計はいくらか」「平均はいくらか」といった質問に答えるために使います。

■ 件数を数える(COUNT関数)

COUNT関数は、条件に合うデータが何件あるかを数えます。「注文は全部で何件?」という質問に答えるイメージです。

※横にスクロールできます

SELECT COUNT(*) FROM orders;
命令の意味:
  • COUNT(*) → 「行数を数えて」という命令
  • * → すべての行を対象にする(NULLも含めて数える)
COUNTの使い分け:
  • COUNT(*) → 全行数を数える(最も一般的)
  • COUNT(列名) → その列がNULLでない行を数える
  • COUNT(DISTINCT 列名) → 重複を除いた種類数を数える

■ 合計・平均・最大・最小を求める

数値データに対して、さまざまな計算ができます。売上の合計や、価格の平均などを求めるのに使います。

※横にスクロールできます

SELECT SUM(amount) as total_sales, AVG(amount) as avg_sales, MAX(amount) as max_sales, MIN(amount) as min_sales FROM orders;
各関数の意味:
  • SUM(amount) → amountの合計値を計算する
  • AVG(amount) → amountの平均値を計算する
  • MAX(amount) → amountの最大値を取得する
  • MIN(amount) → amountの最小値を取得する
  • as total_sales → 計算結果に「total_sales」という名前をつける(別名)
なぜ別名(as)をつけるのか:
  • 計算結果の列名が分かりやすくなる
  • 後で結果を利用するときに参照しやすい
  • レポートの見出しとして使える
実行結果のイメージ:
total_sales avg_sales max_sales min_sales
12,500,000 2,500 150,000 100

■ カテゴリ別に集計する(GROUP BY句)

「全体の合計」ではなく「カテゴリごとの合計」のように、グループに分けて集計したい場合はGROUP BY句を使います。

例えば、お店の売上を考えてみましょう。「全体の売上合計」を知りたいこともあれば、「食品の売上」「衣類の売上」「電化製品の売上」のように、カテゴリ別に知りたいこともありますよね。GROUP BYはまさにそのような「分類ごとの集計」を実現します。

※横にスクロールできます

SELECT category, COUNT(*) as product_count, AVG(price) as avg_price FROM products GROUP BY category;
命令の意味:
  • GROUP BY category → 「categoryが同じものをグループにまとめて」という指定
  • グループごとにCOUNTやAVGが計算される
GROUP BYのルール:
  • 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 → グループ化した「後」にグループを絞り込む

※横にスクロールできます

SELECT category, COUNT(*) as product_count FROM products GROUP BY category HAVING COUNT(*) >= 5;
命令の意味:
  • HAVING COUNT(*) >= 5 → 「件数が5以上のグループだけ表示して」という条件
WHEREとHAVINGの使い分け:
  • WHERE: 集計する前の絞り込み(例: 価格が100円以上の商品だけを集計対象にする)
  • HAVING: 集計した後の絞り込み(例: 商品数が5個以上のカテゴリだけ表示する)
📌 WHEREとHAVINGの違いを料理で例えると

WHERE: 料理を作る前に、傷んだ野菜を取り除く(個々の材料を選別)
HAVING: 料理を作った後に、量が少ない皿は出さない(完成した料理を選別)

1-3. テーブル結合(JOIN)

実際のデータベースでは、情報が複数のテーブルに分かれて保存されています。JOINは、これらの分かれた情報を組み合わせて、一つの結果として取得する機能です。

例えば、「注文テーブル」には顧客ID(customer_id)が記録されていますが、顧客の名前は「顧客テーブル」にあります。これらを組み合わせて「誰が何を注文したか」を知りたいときにJOINを使います。

なぜテーブルを分けるのか?

同じ情報を何度も書くと、データの無駄や矛盾が発生しやすくなります。例えば、顧客の住所が変わったとき、1箇所だけ変更すれば済むようにテーブルを分けておくのがデータベース設計の基本です。

■ INNER JOIN(内部結合)

INNER JOINは、両方のテーブルに一致するデータがある場合のみ結果に含めます。「注文した顧客」だけを表示したい場合に使います。

まず、クエリを分解して説明します。

Step 1: 取得したい列を指定する

※横にスクロールできます

SELECT customers.customer_name, -- 顧客テーブルの顧客名 orders.order_date, -- 注文テーブルの注文日 orders.amount -- 注文テーブルの金額
ポイント:

複数のテーブルを結合するときは、テーブル名.列名の形式で書くと、どのテーブルの列かが明確になります。両方のテーブルに同じ名前の列がある場合は、必ずこの形式で書く必要があります。

Step 2: 基準となるテーブルを指定する

※横にスクロールできます

FROM orders
ポイント:

最初に書くテーブルを「基準テーブル」と考えます。ここでは「注文」を中心に見ていきます。「どのテーブルを中心に考えるか」によって、FROMに書くテーブルを決めます。

Step 3: 結合するテーブルと条件を指定する

※横にスクロールできます

INNER JOIN customers ON orders.customer_id = customers.customer_id;
命令の意味:
  • INNER JOIN customers → 「customersテーブルを結合して」という指定
  • ON orders.customer_id = customers.customer_id → 「customer_idが一致する行同士を結合して」という条件

完成形のクエリ:

※横にスクロールできます

SELECT customers.customer_name, orders.order_date, orders.amount FROM orders INNER JOIN customers ON orders.customer_id = customers.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になります。

「注文がない顧客も含めて、全顧客の注文状況を見たい」という場合に使います。

※横にスクロールできます

SELECT customers.customer_name, COUNT(orders.order_id) as order_count FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customers.customer_id, customers.customer_name;
INNER JOINとLEFT JOINの違い:
  • INNER JOIN: 両方に存在するデータのみ表示(注文がある顧客だけ)
  • LEFT JOIN: 左側のデータはすべて表示(注文がない顧客も含む)
LEFT JOINの実行結果イメージ:
customer_name order_count
山田太郎 5
佐藤花子 3
鈴木一郎 0

※ 鈴木一郎さんは注文がないが、LEFT JOINなので表示される(INNER JOINだと表示されない)

■ 3つのテーブルを結合する

JOINは連続して書くことで、3つ以上のテーブルを結合できます。例えば「顧客名」「商品名」「注文数量」を一度に取得したい場合などです。

※横にスクロールできます

SELECT customers.customer_name, products.product_name, orders.quantity FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id INNER JOIN products ON orders.product_id = products.product_id;
結合の流れ:
  1. まず orders と customers を customer_id で結合
  2. その結果に products を product_id で結合
  3. 最終的に3つのテーブルの情報が1つにまとまる
📌 JOINを使うときのコツ
  • 結合条件(ONの後)には、両方のテーブルにある「共通のキー」を指定する
  • テーブル名.列名の形式で、どのテーブルの列か明確にする
  • 結合の順番は、データの論理的な関係を考えて決める
  • 迷ったらINNER JOINから始めて、必要に応じてLEFT JOINに変更する

1-4. データ操作(INSERT/UPDATE/DELETE)

データベースは「読むだけ」ではなく、データを追加・変更・削除することもできます。これらの操作をまとめて「データ操作」と呼びます。

■ データの挿入(INSERT)

新しいデータをテーブルに追加する命令です。新商品を登録したり、新しい顧客を追加したりするときに使います。

※横にスクロールできます

INSERT INTO products (product_name, price, stock) VALUES ('新商品', 2000, 100);
命令の意味:
  • INSERT INTO products → 「productsテーブルに挿入して」という命令
  • (product_name, price, stock) → 値を入れる列名を指定
  • VALUES ('新商品', 2000, 100) → 実際に入れる値(列の順番と一致させる)

■ データの更新(UPDATE)

既存のデータを変更する命令です。価格を変更したり、在庫数を更新したりするときに使います。

※横にスクロールできます

UPDATE products SET price = 1800 WHERE product_id = 101;
命令の意味:
  • UPDATE products → 「productsテーブルを更新して」という命令
  • SET price = 1800 → 「priceを1800に変更して」という指定
  • WHERE product_id = 101 → 「product_idが101の行だけ」という条件
⚠️ 重要な注意点

WHERE句を忘れると、すべての行が更新されてしまいます!必ず条件を指定して、更新対象を限定しましょう。実行前に必ずSELECT文で対象データを確認する習慣をつけましょう。

■ データの削除(DELETE)

既存のデータを削除する命令です。不要なデータを消したり、古いレコードを削除したりするときに使います。

※横にスクロールできます

DELETE FROM products WHERE product_id = 999;
命令の意味:
  • 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つのクエリで簡潔に表現できます!

※横にスクロールできます(サブクエリの先取り例)

-- 平均価格より高い商品を探す SELECT product_name, price FROM products WHERE price > ( SELECT AVG(price) FROM products );
学ぶ内容:
  • WHERE句、FROM句、SELECT句でのサブクエリ
  • 相関サブクエリとEXISTS
  • サブクエリの最適化テクニック

2-2. Part 3: ウィンドウ関数編(Step 6-9)

📊 ウィンドウ関数とは?

データ分析で超強力なツールです!ランキング、累積合計、移動平均などが簡単に計算できます。Excelでいう「連番を振る」「累計を計算する」といった操作をSQLで実現できます。

※横にスクロールできます(ウィンドウ関数の先取り例)

-- カテゴリ別の価格ランキング SELECT product_name, category, price, RANK() OVER (PARTITION BY category ORDER BY price DESC) as price_rank FROM products;
学ぶ内容:
  • 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サイトデータベース

架空のECサイト「SmartShop」のデータベースを使います。実際のオンラインショップのようなデータ構造で、実務に近い経験ができます。

  • 顧客: 10,000人
  • 商品: 1,000点
  • 注文: 50,000件
  • レビュー: 15,000件

4-2. テーブル構造

このデータベースは5つのテーブルで構成されています。それぞれのテーブルがどのような情報を持っているか見ていきましょう。

■ 顧客テーブル(customers)

お客様の情報を保存するテーブルです。名前、連絡先、累計注文数などを管理します。

※横にスクロールできます

CREATE TABLE customers ( customer_id INTEGER PRIMARY KEY, -- 顧客ID(主キー) customer_name TEXT NOT NULL, -- 顧客名(必須) email TEXT UNIQUE, -- メールアドレス(重複不可) prefecture TEXT, -- 都道府県 city TEXT, -- 市区町村 registration_date DATE, -- 登録日 last_order_date DATE, -- 最終注文日 total_orders INTEGER DEFAULT 0, -- 累計注文数 total_amount INTEGER DEFAULT 0 -- 累計購入金額 );

■ 商品テーブル(products)

販売している商品の情報を保存するテーブルです。価格、在庫、評価などを管理します。

※横にスクロールできます

CREATE TABLE products ( product_id INTEGER PRIMARY KEY, -- 商品ID(主キー) product_name TEXT NOT NULL, -- 商品名(必須) category TEXT, -- カテゴリ subcategory TEXT, -- サブカテゴリ price INTEGER, -- 販売価格 cost INTEGER, -- 原価 stock INTEGER DEFAULT 0, -- 在庫数 rating REAL, -- 平均評価(1.0〜5.0) review_count INTEGER DEFAULT 0, -- レビュー数 release_date DATE -- 発売日 );

■ 注文テーブル(orders)

注文の基本情報を保存するテーブルです。誰がいつ注文したか、支払い方法などを管理します。

※横にスクロールできます

CREATE TABLE orders ( order_id INTEGER PRIMARY KEY, -- 注文ID(主キー) customer_id INTEGER, -- 顧客ID(外部キー) order_date DATE, -- 注文日 total_amount INTEGER, -- 注文合計金額 status TEXT, -- 状態(配送中、完了など) payment_method TEXT, -- 支払い方法 shipping_prefecture TEXT, -- 配送先都道府県 FOREIGN KEY (customer_id) REFERENCES customers(customer_id) );

■ 注文明細テーブル(order_details)

1つの注文に含まれる商品の詳細を保存するテーブルです。何をいくつ買ったかを管理します。

※横にスクロールできます

CREATE TABLE order_details ( detail_id INTEGER PRIMARY KEY, -- 明細ID(主キー) order_id INTEGER, -- 注文ID(外部キー) product_id INTEGER, -- 商品ID(外部キー) quantity INTEGER, -- 数量 unit_price INTEGER, -- 購入時の単価 subtotal INTEGER, -- 小計(単価×数量) FOREIGN KEY (order_id) REFERENCES orders(order_id), FOREIGN KEY (product_id) REFERENCES products(product_id) );

■ レビューテーブル(reviews)

商品に対するお客様のレビューを保存するテーブルです。評価やコメントを管理します。

※横にスクロールできます

CREATE TABLE reviews ( review_id INTEGER PRIMARY KEY, -- レビューID(主キー) product_id INTEGER, -- 商品ID(外部キー) customer_id INTEGER, -- 顧客ID(外部キー) rating INTEGER CHECK(rating BETWEEN 1 AND 5), -- 評価(1〜5) comment TEXT, -- コメント review_date DATE, -- レビュー日 helpful_count INTEGER DEFAULT 0, -- 「参考になった」の数 FOREIGN KEY (product_id) REFERENCES products(product_id), FOREIGN KEY (customer_id) REFERENCES customers(customer_id) );

4-3. データベースのセットアップ方法

💡 準備の手順
  1. DB Browser for SQLiteを起動
    • まだインストールしていない方は、基礎コースを参照してください
  2. 新しいデータベースを作成
    • ファイル名: smartshop_advanced.db
  3. テーブルを作成
    • 上記のCREATE TABLE文を実行
  4. サンプルデータを投入
    • 次のステップで詳しく説明します

4-4. 基礎コースとの違い

項目 基礎コース 応用コース
顧客数 約100人 10,000人
商品数 約50点 1,000点
注文数 約500件 50,000件
テーブル数 3テーブル 5テーブル
データサイズ 約1MB 約50MB
⚠️ 注意点

大規模データを扱うため、クエリの実行時間が長くなる場合があります。これは正常な動作です。実務でも同様の状況に直面するため、良い練習になります!

🎯 5. 応用コースで目指すゴール

このコース修了後、あなたができるようになること

✨ 技術面でのゴール
  • サブクエリを使いこなし、複雑な条件を簡潔に表現できる
  • ウィンドウ関数で高度なデータ分析ができる
  • インデックスを適切に設計し、クエリを高速化できる
  • 実行計画を読み、パフォーマンスの問題を特定できる
  • 遅いクエリを診断し、最適化できる
  • 大規模データを扱う実務レベルのSQL技術が身につく
💼 実務面でのゴール
  • 実際のビジネスデータを分析できる
  • 売上レポートやダッシュボードを作成できる
  • データベースのパフォーマンス問題を解決できる
  • チームメンバーに技術的なアドバイスができる
  • データエンジニア・データアナリストへの道が開ける

学習の進め方

💡 効果的な学習のコツ
  1. 手を動かす
    • 必ず自分でコードを書いて実行しましょう
    • コピー&ペーストだけでは身につきません
  2. 理解してから進む
    • わからないことがあれば、前のステップに戻りましょう
    • 焦らず、じっくり理解を深めましょう
  3. 練習問題に挑戦
    • 各ステップの練習問題は必ず解きましょう
    • 解けなくても大丈夫、解答例を参考に学びましょう
  4. 応用してみる
    • 学んだことを自分のアイデアで試してみましょう
    • 創造的に使うことで、理解が深まります

📝 準備確認クイズ

次のステップに進む前に、基礎知識を確認しましょう!

クイズ 1基本

基本的なSELECT

productsテーブルから、priceが1000円以上の商品を価格の高い順に10件取得するクエリを書いてください。

※横にスクロールできます

SELECT * FROM products WHERE price >= 1000 ORDER BY price DESC LIMIT 10;

解説:

  • WHERE price >= 1000 で1000円以上に絞り込み
  • ORDER BY price DESC で価格の高い順に並び替え
  • LIMIT 10 で10件に制限

クイズ 2基本

集計関数

ordersテーブルから、注文の総件数、合計金額、平均金額を取得するクエリを書いてください。

※横にスクロールできます

SELECT COUNT(*) as total_orders, SUM(total_amount) as total_sales, AVG(total_amount) as avg_order_amount FROM orders;

解説:

  • COUNT(*) で注文の総件数を計算
  • SUM(total_amount) で合計金額を計算
  • AVG(total_amount) で平均金額を計算
  • as で分かりやすい列名をつけています

クイズ 3応用

GROUP BY

productsテーブルから、カテゴリ別の商品数と平均価格を取得し、商品数が多い順に並べてください。

※横にスクロールできます

SELECT category, COUNT(*) as product_count, AVG(price) as avg_price FROM products GROUP BY category ORDER BY product_count DESC;

解説:

  • GROUP BY category でカテゴリ別にグループ化
  • COUNT(*) で各カテゴリの商品数を計算
  • AVG(price) で各カテゴリの平均価格を計算
  • ORDER BY product_count DESC で商品数の多い順に並び替え

クイズ 4応用

INNER JOIN

ordersテーブルとcustomersテーブルを結合して、顧客名、注文日、金額を取得してください。

※横にスクロールできます

SELECT customers.customer_name, orders.order_date, orders.total_amount FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id;

解説:

  • INNER JOIN customers で顧客テーブルを結合
  • ON orders.customer_id = customers.customer_id で結合条件を指定
  • テーブル名.列名 の形式で、どのテーブルの列かを明確に

クイズ 5チャレンジ

複合クエリ

顧客ごとの注文件数と合計金額を取得し、注文件数が5件以上の顧客だけを表示してください。

※横にスクロールできます

SELECT customers.customer_name, COUNT(orders.order_id) as order_count, SUM(orders.total_amount) as total_spent FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id GROUP BY customers.customer_id, customers.customer_name HAVING COUNT(orders.order_id) >= 5 ORDER BY total_spent DESC;

解説:

  • 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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE