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. まとめ

POINT — たった1文の形 SELECT 列 FROM 表 WHERE 条件 ORDER BY 列 —— この並びを覚えれば、あとは中身を差し替えるだけ。SQL の8割はこの1文の応用です。