SQL
SQLとは
SQL(Structured Query Language)は、[[リレーショナルデータベース]] のデータを操作するための言語です。データの取得・追加・更新・削除(CRUD)を宣言的に記述します。
SELECT name, email
FROM users
WHERE created_at >= '2026-01-01'
ORDER BY created_at DESC
LIMIT 10;
SQLが引き受けている2つのこと
1つは共通語であることです。[[PostgreSQL]]・[[MySQL]]・[[SQLite]] や分析用の製品まで、大枠は同じ書き方が通じます(方言の差は残ります)。
もう1つは宣言型であることです。「どう取るか」ではなく「何が欲しいか」を書き、取り出し方はDB内部のオプティマイザが決めます。同じ結果を返すSQLでも速さは何十倍も変わり、書けることと速く動かせることは別の技能です。
初学者向けポイント
- 4大操作:
SELECT(取得)/INSERT(追加)/UPDATE(更新)/DELETE(削除) - [[テーブル結合(JOIN)]] で複数テーブルを組み合わせられるのがリレーショナルDBの真骨頂
4つの顔 — DDL・DML・DCL・TCL
SQLは役割の違う4系統の集まりです。略語で語られるので対応だけ押さえます。
| 系統 | 代表的な命令 | 役割 |
|---|---|---|
| DDL | CREATE / ALTER / DROP | テーブルなどの器を定義する |
| DML | SELECT / INSERT / UPDATE / DELETE | 中身のデータを出し入れする |
| DCL | GRANT / REVOKE | どの操作を誰に許すか決める |
| TCL | BEGIN / COMMIT / ROLLBACK | 変更の確定・取り消しを区切る |
書く順番と実行される順番は違う
FROM / JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
SELECTで付けた別名をWHEREで使えないのは、別名が決まるのが後だからです。ORDER BYでは使えます- 集計前の絞り込みが
WHERE、集計後がHAVING。「合計が1万円を超える顧客だけ」はHAVINGの仕事です LIMITは最後です。10行しか返らなくても、手前で1000万行読んでいることがあります
基本構文で足りなくなったら
- サブクエリ —
SELECTの中にSELECTを入れ子にする。「平均より高い商品」のような条件に使う - CTE(共通テーブル式) —
WITH 名前 AS (...)で途中結果に名前を付け、上から読める手順に分解する - ウィンドウ関数 — 行を集約せず順位や累計を各行へ付ける。
GROUP BYでは書けない集計
次に読むための地図
「いま何をしたいか」で束ねています。上から順に読む必要はありません。
複数の表から組み立てる
分けたデータを1つに戻すのが [[テーブル結合(JOIN)]]。結合条件になる列の設計は [[主キーと外部キー]] を見ます。
書いたSQLが遅いとき
まず [[実行計画とクエリチューニング]] で遅い箇所を測り、多くはそこから [[データベースインデックス]] で解決します。測る前に貼りすぎると、効かない索引が増えて書き込みだけが遅くなります。
安全に書く・まとめて確定する
入力値から文字列としてSQLを組み立てる前に [[SQLインジェクション]]。複数の更新をひとまとまりで確定・取り消しするのが [[トランザクションとACID]] です。
SQLを書く量を減らす
アプリからは [[ORM]] 経由で扱うことが多く、その場合も発行されるSQLを読める前提です。
データベース側の全体像(データモデリング・権限・NoSQL や分析用途への広がり)は、 [[リレーショナルデータベース]] の「次に読むための地図」にまとめてあります。
関連技術とのつながり
- [[リレーショナルデータベース]] — SQLが操作する対象
- [[NoSQL]] — SQLを使わないデータベースの総称(比較対象)
- [[実行計画とクエリチューニング]] — DBが立てるSQLの実行手順書
Q: SQLが「宣言型言語」と呼ばれる理由は?
- [ ] 変数の宣言が必須だから
- [x] 「どう取るか」ではなく「何が欲しいか」を書き、実行計画はDBが考えるから
- [ ] 実行前にコンパイルが必要だから
解説: SQLでは欲しい結果を宣言するだけで、どう取得するか(実行計画)はDBが考えます。
Q: 既存のデータを書き換えるSQLの操作はどれ?
- [ ] SELECT
- [ ] INSERT
- [x] UPDATE
- [ ] DELETE
解説: 4大操作のうちSELECTは取得、INSERTは追加、UPDATEが更新、DELETEは削除です。
Q: INDEXについて記事で触れられている注意点は?
- [x] 貼りすぎると書き込みが遅くなる
- [ ] 一度作ると削除できない
- [ ] 検索がかえって遅くなる
解説: INDEXは検索を高速化する索引ですが、貼りすぎは書き込みを遅くします。
Q: 「合計金額が1万円を超える顧客だけ」を絞り込むとき使う句はどれ?
- [ ] WHERE。集計より先に実行されるため合計値で絞り込める
- [x] HAVING。WHEREは集計前、HAVINGは集計後の絞り込みを担当するため
- [ ] ORDER BY。並べ替えと同時に条件を適用できるため
解説: 実行順は WHERE → GROUP BY → HAVING です。集計結果に対する条件は HAVING に書きます。