SQLは「データベースへのお願いの言葉」
クライアントがサーバーにお願いをするとき、使う言葉が決まっています。それがSQL(エスキューエル)です。プログラミング言語の一種ですが、「こうしてほしい」という結果を英語に近い形で書くだけなので、読むだけなら難しくありません。
この章の目標は、SQLを書くことではなく読むことです。システム部門が見せてくれたSQLや、帳票の裏側で動いているSQLを見て「何をしているか」が分かれば十分です。
SQLの文は、最初の単語(動詞)で何をしたいかが決まります。基本は4つです。
| 動詞 | 意味 | みなと文具での例 |
|---|---|---|
SELECT | 取り出す(読む) | 神奈川県の得意先を一覧にする |
INSERT | 行を追加する | 新しい得意先を登録する |
UPDATE | 行を書き換える | 請求書に入金日を入れる |
DELETE | 行を削除する | 誤って登録した請求書を消す |
実務で目にするSQLの大半は SELECT です。この章も SELECT に絞って、よく見かける4つの形を順に読んでいきます。使うのは第4章で定義した customers(得意先)と invoices(請求書)の2つのテーブルです。
形1:絞り込んで並べる(WHERE・ORDER BY)
SELECT code, name, pref
FROM customers
WHERE pref = '神奈川県'
ORDER BY code;
SQLは上から順ではなく、FROM から読むのがコツです。
FROM customers:得意先テーブルからWHERE pref = '神奈川県':都道府県が神奈川県の行だけに絞ってORDER BY code:得意先コード順に並べてSELECT code, name, pref:コード・会社名・都道府県の3列を取り出す
結果は次のような表になります。SQLの結果は常に「表」の形で返ってくる、というのも覚えておきたい点です。
| code | name | pref |
|---|---|---|
| C002 | ひばり印刷株式会社 | 神奈川県 |
形2:2つの表をつなげる(JOIN)
請求書テーブルには得意先コードしかなく、会社名はありません。会社名つきの請求書一覧を作るには、2つの表を結合(JOIN)します。
SELECT i.id, c.name, i.amount
FROM invoices i
JOIN customers c ON i.cust = c.code
ORDER BY i.id;
FROM invoices i:請求書テーブルから(以後iという略称で呼ぶ)JOIN customers c ON i.cust = c.code:得意先テーブル(略称c)を、「請求書の cust と 得意先の code が同じ行どうし」でつなげるSELECT i.id, c.name, i.amount:請求書番号・会社名・金額を取り出す
| id | name | amount |
|---|---|---|
| 1 | 株式会社あおば商事 | 120,000 |
| 2 | ひばり印刷株式会社 | 45,000 |
| 3 | 株式会社あおば商事 | 98,000 |
ON のあとに書かれているのが「つなぐ条件」で、ほとんどの場合、第4章で見た外部キーと主キーの組み合わせがそのまま使われます。テーブルを分けて外部キーで関係づけておいたからこそ、JOINで元の形に戻せるわけです。
JOINは、ExcelのVLOOKUP(コードをもとに別の表から値を引いてくる)を、表全体に対して一度に行うものだと考えると分かりやすいです。VLOOKUPと違い、1つのコードに複数の行が対応していても、すべての組み合わせがきちんと出てきます。
形3:集計する(GROUP BY)
「得意先ごとの請求金額の合計」を出したいときは、グループに分けてまとめます。
SELECT c.name, SUM(i.amount) AS total, COUNT(*) AS cnt
FROM invoices i
JOIN customers c ON i.cust = c.code
GROUP BY c.name
ORDER BY total DESC;
- 請求書と得意先をつなげて(ここまでは形2と同じ)
GROUP BY c.name:会社名が同じ行を1つのグループにまとめSUM(i.amount):グループごとに金額を合計し、COUNT(*):行数を数えてORDER BY total DESC:合計の大きい順(DESC=降順)に並べる
| name | total | cnt |
|---|---|---|
| 株式会社あおば商事 | 218,000 | 2 |
| ひばり印刷株式会社 | 45,000 | 2 |
AS total は「結果の列に total という名前をつける」という意味です。Excelのピボットテーブルで行ラベルに会社名、値に金額の合計を置くのと同じことを、SQLではこの5行で表します。
形4:空欄を条件にする(IS NULL)
最後に、第4章のNULLを使った実務的な例です。「まだ入金されていない請求書」を一覧にします。
SELECT id, cust, amount, issued_on
FROM invoices
WHERE paid_on IS NULL
ORDER BY issued_on;
NULLは「値がない」状態なので、paid_on = NULL とは書けず、IS NULL という専用の言い方をします。逆に入金済みなら IS NOT NULL です。売掛金の残高確認で使う「未入金一覧」は、裏側ではこういうSQLで作られています。
SQLを読むときの合言葉
- FROMから読む。「表 → 行(WHERE)→ グループ(GROUP BY)→ 並び(ORDER BY)→ 列(SELECT)」の順。
- JOINは「どの表と、どの列でつなぐか」だけを見る。ONの右と左は、たいてい主キーと外部キー。
- 結果は必ず表の形で返る。だから結果をさらに別のSQLの材料にもできる。
この3つを押さえれば、実務で目にするSQLの8割は「何をしているか」が読み取れます。次の章では、こうしたお願いを受け取ったサーバーが、どうやってデータを正確に、速く、壊さずに扱っているのかを見ていきます。
この章のまとめ
- SQLはデータベースへのお願いの言葉。動詞は SELECT(読む)・INSERT(追加)・UPDATE(書き換え)・DELETE(削除)の4つが基本で、実務の大半はSELECT。
- SELECT文は FROM から読む。WHERE で行を絞り、ORDER BY で並べ、SELECT で列を選ぶ。
- JOIN は2つの表を主キーと外部キーでつなげる。GROUP BY は同じ値の行をまとめて SUM や COUNT で集計する。
- 空欄の条件は IS NULL / IS NOT NULL と書く。
確認クイズ
Q1SELECT文を読むとき、最初に見るとよい部分はどれですか。
Q2JOIN customers c ON i.cust = c.code は何をしていますか。
Q3「入金日が空欄の請求書」を取り出す条件の書き方として正しいものはどれですか。