はじめに(学習の全体像)
5月は以下の3つの学習を並行して学習しました。今回のブログではSQLに絞って学習内容を整理していきます。
何もみずにSQL文かいてテーブル操作できたとき、嬉しくて学習のモチベーションが上がっちゃいました。
| 項目 | 期間 | 内容 |
|---|---|---|
| SQL演習 | 5月上旬 | 四大構文+JOIN・サブクエリなど手書き練習 |
| LaravelにてオリジナルWEBアプリ開発 | 5月中旬~下旬(計11日) | 既存WEBアプリを改修し、新機能を実装 |
| 基本情報試験対策 | 5月通じて継続 | 過去問道場で60~120問/日ペース |
個人的に学習を行って抑えておくべきポイントだと感じたものを5つ以下に羅列します。
ちなみに学習に用いたサイトはSQLabです。Cntl+Iで解答をすぐに確認できるのでスピーディに学習できるところがお気に入りです。
リンク:https://sqlab.net/
ポイント1:SQL の記述順序と実行順序は別物
記述順序:
SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY
実行順序(DBが処理する順/読解はこの順番で行う):
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
ポイント2:WHERE句とサブクエリの見極め
ざっくりと、簡単な条件指定はWHERE句。複雑そうなのや、集計関数を使うのはサブクエリやHAVING句で判断する。
WHERE句に関しての2つの重要事項
⚠️ 制限1:エイリアスが使えない
WHERE句では、集約関数や GROUP BY で指定したカラムのエイリアスが使用できません
⚠️ 制限2:集計関数が使えない
WHERE句では集計関数を直接使用できません
ただし、サブクエリ内で集計して、その「結果」(スカラー値)をWHERE句が使うなら問題ありません。
コード例で整理
❌ ダメ:WHERE句が集計関数を直接呼び出し
WHERE COUNT(*) > 5
✅ OK:WHERE句が集計結果を比較(サブクエリを利用)
WHERE salary > (SELECT AVG(...))
✅ OK:HAVING句で集計結果をフィルタリング
HAVING COUNT(*) >= 5
ポイント3:条件指定の際に()の活用有無
AND/OR 使用は括弧を使って明確にすることが必要。
例1:東京または大阪の店舗で、売上が100万以上の案件
SELECT * FROM sales
WHERE (location = '東京' OR location = '大阪')
AND amount >= 1000000;
例2:複数条件の組み合わせ
SELECT * FROM products
WHERE (category = 'A' AND price > 1000)
OR (category = 'B' AND price > 2000);
例3:IN の使用
SELECT * FROM orders WHERE status IN ('pending', 'processing', 'shipped');
ポイント4:GROUP BY のルール
GROUP BY を使うと、SELECT に記述できるカラムは以下の2種類のみです:
- GROUP BY に指定したカラム
- 集約関数(SUM、COUNT、AVG、MAX、MINなど)で囲んだカラム
-- 正解
SELECT department, COUNT(*) as cnt
FROM employees
GROUP BY department;
-- 間違い
SELECT department, employee_id, COUNT(*)
FROM employees
GROUP BY department;
ポイント5:頻出句の整理
DISTINCT vs GROUP BY
DISTINCT:重複排除に特化(シンプル)
GROUP BY:集計関数(COUNT, SUMなど)を使うなら必須
<> 演算子
「~以外」という意味(!= と同じ)
LIKE 演算子
部分一致でも可の条件指定演算子
WHERE 句
絞り込みを行う句(例:男性のみのデータ取得)
INや不等号、NOT INを用いながらサブクエリの活用も可能
重要:「否定の集合」や「複雑な集計条件」ではサブクエリ
WHERE total_page > (
SELECT total_page
FROM books
WHERE name = 'コードと回路'
);
GROUP BY 句
同じカテゴリーを1つの項目にする句(例:発行年毎の書籍数を取得)
HAVING 句
既存カラムと集計関数(SUMやCOUNT)を用いた絞り込みを行う際に用いる句
(例:書籍数が2つ以上のデータを取得)
SELECT name
FROM books
JOIN book_sales
ON books.id = book_sales.book_id
GROUP BY name
HAVING SUM(book_sales.stock) = 0;
ORDER BY 句
昇順(DESC不要)・降順(ORDER BY releease_year DESC)での並び替え指定
LIMIT 句
上位○個のデータのみを取得する
結論
5月時点では基本的なSQL文は何も見ずに書けるようになりました。
ただ、時間が経つと「各句の使い方や意識するべきルール」「記述順序」を忘れがちなので、使用前には特に上記ポイントの見直しが必要です。