← ブログ一覧に戻る
SQL初心者がつまずく5つのポイントと解決策
更新:

SQL初心者がつまずく5つのポイントと解決策

はじめに

SQLの学習を始めると、最初のうちは順調に進むのに、ある時点から急に「わからない」と感じることがあります。実はつまずくポイントはだいたい決まっています。

この記事では、SQL初心者が共通してつまずく5つのポイントとその解決策を解説します。

つまずきポイント①: WHERE と HAVING の違い

「どちらも絞り込みなのに何が違うの?」という疑問は非常によくあります。

答え:実行タイミングが違います。

  • WHERE → グループ化するに絞り込む
  • HAVING → グループ化したに絞り込む

例えば「部署ごとの人数が3人以上の部署を取得する」場合は、まずGROUP BYで集計してからHAVINGで絞る必要があります。

-- ✅ 正しい書き方
SELECT department, COUNT(*) AS cnt
FROM employees
GROUP BY department
HAVING COUNT(*) >= 3;

-- ❌ WHEREでは集計後の条件は書けない
SELECT department, COUNT(*) AS cnt
FROM employees
WHERE COUNT(*) >= 3  -- エラーになる
GROUP BY department;

つまずきポイント②: JOINの種類と使い分け

INNER JOIN、LEFT JOIN、RIGHT JOIN…種類が多くて混乱しがちです。

シンプルに覚えるコツ:

  • INNER JOIN → 両方のテーブルにデータがある行だけ取得
  • LEFT JOIN → 左テーブルは全件取得。右テーブルにデータがなければNULLになる

実務ではLEFT JOINを使う場面が最も多いです。「ユーザー全員を取得して、注文があればその情報も表示する」というケースがまさにLEFT JOINです。

つまずきポイント③: NULLの扱い

NULLは「値がない」状態で、通常の比較演算子が使えません。

-- ❌ これはNULLを検索できない
SELECT * FROM users WHERE email = NULL;

-- ✅ IS NULL を使う
SELECT * FROM users WHERE email IS NULL;

-- ✅ NULLを別の値に置き換えるにはCOALESCE
SELECT name, COALESCE(email, '未登録') AS email
FROM users;

NULLが絡む集計では、COUNT(*)とCOUNT(カラム名)の結果が異なる点にも注意が必要です。COUNT(*)は全行を数えますが、COUNT(カラム名)はNULLを除いた行数を返します。

つまずきポイント④: GROUP BY に指定するカラム

「GROUP BYを使ったらエラーになった」という経験はありませんか?

ルール:SELECTに書くカラムは、GROUP BYに含めるか集計関数で包む必要がある

-- ❌ nameがGROUP BYにも集計関数にも含まれていない
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;

-- ✅ 正しい書き方
SELECT department, COUNT(*)
FROM employees
GROUP BY department;

つまずきポイント⑤: SQLの実行順序

SQLは書いた順番で実行されるわけではありません。実行順序を理解すると、エラーの原因がわかりやすくなります。

  1. FROM(テーブルを参照)
  2. WHERE(絞り込み)
  3. GROUP BY(グループ化)
  4. HAVING(グループ後の絞り込み)
  5. SELECT(取得するカラムを決定)
  6. ORDER BY(並び替え)
  7. LIMIT(件数制限)

例えば「WHEREの中でSELECTで定義したエイリアスが使えない」のは、WHEREがSELECTより先に実行されるからです。

まとめ

これら5つのポイントを意識するだけで、SQL学習の挫折率は大幅に下がります。大切なのは実際に書いて確認することです。

SQLLearnのレッスンでは、ブラウザ上でSQLを実行しながら学べます。今回紹介したGROUP BY・JOIN・NULLも実際の練習問題で体験できますので、ぜひ試してみてください。