SQL入門 — 「何が欲しいか」を書くだけ
SQL は「どうやって取り出すか(手順)」ではなく、「どんなデータが欲しいか(結果)」を書く言語です。表から 列を選び(SELECT)、行を絞り(WHERE)、並べ替え(ORDER BY)、別の表とつなぐ(JOIN)。トグルを切り替えて、結果の表がその場で変わる様子を見てください。
1. SELECT — 欲しい「列」だけ選ぶ(射影)
まずは表から必要な列だけ取り出します。これを射影(projection)と呼びます。名簿には4つの列がありますが、知りたいのが「名前と点数」だけなら、その2列だけを選べばいい。SQL では SELECT 名前, 点数 と欲しい列名を並べるだけです。
列を選ぶと結果の表が変わる
左=元の名簿(全列)、右=選んだ列だけの結果。チェックを切り替えると右の表が即座に組み替わります。
POINT — 宣言的(declarative)とは
「どのファイルを開き、どうループして…」という手順は一切書かない。欲しい結果の形だけを宣言すれば、実際の取り出し方はデータベースが考えてくれる。だから同じ結果を得る書き方は1通りに近く、読みやすい。
2. WHERE — 欲しい「行」だけ残す(選択)
次に、条件に合う行だけを残します。これを選択(selection)と呼びます。WHERE 学年 = 2 と書けば、学年が2の行だけが結果に残ります。条件を複数つなぐときは AND で結びます。下のデモは、データベースが表を上から順に走査し、条件に合う行を集めていく様子です(この走査手順もあなたは書きません — 条件を宣言するだけ)。
条件に合う行をスキャンして集める
青い帯=いま調べている行、✓=条件に合った行(右の結果セットへ)、✗=条件に外れた行。条件を足すと結果がその場で絞られます。
注意 — WHERE を書かないと全行
WHERE を省くと「すべての行」が対象になる。UPDATE や DELETE で WHERE を付け忘れると、全行を書き換え・全行を削除してしまう。条件は「絞り込み」であり、無指定は「絞らない=全部」を意味する。
3. ORDER BY — 結果を並べ替える
取り出した行には決まった順番がありません。ORDER BY 点数 DESC と書けば点数の大きい順に、ASC なら小さい順に並びます。基準の列と向きを宣言するだけで、並べ替えのアルゴリズムはデータベース任せです。
基準を変えると行が滑って並び替わる
基準の列(黄色)と向きを切り替えると、行がアニメーションで新しい位置へ移動します。
FROM 名簿 → WHERE 条件 → SELECT 列 → ORDER BY 並べ替え
書く順番(SELECT が先頭)と、データベースが実際に処理する順番は違う。まず表を用意し(FROM)、行を絞り(WHERE)、列を選び(SELECT)、最後に並べる(ORDER BY)。
4. JOIN — 2つの表をキーでつなぐ
データは複数の表に分かれて保管されます(詳しくは次章「正規化」で)。JOIN は、共通のキーを手がかりに2つの表を横につなげます。「生徒」表の 部活ID と「部活」表の 部活ID が一致する行どうしを組み合わせ、名前と部活名が並んだ1つの表にします。
キーが一致する行どうしを結合する
左の生徒行から部活IDが一致する部活行へ線が伸び、下に結合結果ができます。INNER=両方にある行だけ、LEFT=左(生徒)は全部残し相手がなければ NULL。伊藤(部活ID=C9)は部活表に無いので INNER では消え、LEFT では NULL で残ります。
一歩先へ — 宣言的だから最適化できる
「何が欲しいか」だけを書くから、データベースは同じ結果を返す限り、取り出し方を自由に選べる。索引を使うか全走査か、JOIN をどの順で処理するか — この判断を担うのがクエリオプティマイザ(第7章)。手順を書かない不便さの裏返しが、勝手に速くしてくれる自由度なのです。
5. まとめ
- SELECT(射影):欲しい列を選ぶ。
*は全列。 - WHERE(選択):条件に合う行だけ残す。
AND/ORで条件を組む。 - ORDER BY:結果を並べ替える。
ASC(昇順)/DESC(降順)。 - JOIN:共通キーで2つの表をつなぐ。
INNER/LEFTで残り方が変わる。 - 共通するのは「手順ではなく結果を宣言する」という発想。取り出し方はデータベースに任せる。
POINT — たった1文の形
SELECT 列 FROM 表 WHERE 条件 ORDER BY 列 —— この並びを覚えれば、あとは中身を差し替えるだけ。SQL の8割はこの1文の応用です。