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は書いた順番で実行されるわけではありません。実行順序を理解すると、エラーの原因がわかりやすくなります。
- FROM(テーブルを参照)
- WHERE(絞り込み)
- GROUP BY(グループ化)
- HAVING(グループ後の絞り込み)
- SELECT(取得するカラムを決定)
- ORDER BY(並び替え)
- LIMIT(件数制限)
例えば「WHEREの中でSELECTで定義したエイリアスが使えない」のは、WHEREがSELECTより先に実行されるからです。
まとめ
これら5つのポイントを意識するだけで、SQL学習の挫折率は大幅に下がります。大切なのは実際に書いて確認することです。
SQLLearnのレッスンでは、ブラウザ上でSQLを実行しながら学べます。今回紹介したGROUP BY・JOIN・NULLも実際の練習問題で体験できますので、ぜひ試してみてください。
