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系統の集まりです。略語で語られるので対応だけ押さえます。

系統代表的な命令役割
DDLCREATE / ALTER / DROPテーブルなどの器を定義する
DMLSELECT / INSERT / UPDATE / DELETE中身のデータを出し入れする
DCLGRANT / REVOKEどの操作を誰に許すか決める
TCLBEGIN / 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 に書きます。