CHAPTER 05読む目安 20分SELECT・WHERE・JOIN・GROUP BY

SQLの基本を「読める」ようになる

この章のゴール:SQLを「書く」のではなく「読む」ことを目標に、よく見かける4つの形(絞り込み・並べ替え・結合・集計)の意味を読み取れる。

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 から読むのがコツです。

  1. FROM customers:得意先テーブルから
  2. WHERE pref = '神奈川県':都道府県が神奈川県の行だけに絞って
  3. ORDER BY code:得意先コード順に並べて
  4. SELECT code, name, pref:コード・会社名・都道府県の3列を取り出す
SELECT code, name, pref FROM customers WHERE pref = '神奈川県' ORDER BY code; 1 2 3 4 1 どの表から? 2 どの行だけ?(条件) 3 どう並べる? 4 どの列を取り出す? 「表 → 行 → 並び → 列」の順で読む
図5-1 SELECT文の読む順番。書く順番と読む順番が違うのがSQLの最初の壁ですが、「FROMから読む」と決めてしまえば迷いません。

結果は次のような表になります。SQLの結果は常に「表」の形で返ってくる、というのも覚えておきたい点です。

codenamepref
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;
  1. FROM invoices i:請求書テーブルから(以後 i という略称で呼ぶ)
  2. JOIN customers c ON i.cust = c.code:得意先テーブル(略称 c)を、「請求書の cust と 得意先の code が同じ行どうし」でつなげる
  3. SELECT i.id, c.name, i.amount:請求書番号・会社名・金額を取り出す
idnameamount
1株式会社あおば商事120,000
2ひばり印刷株式会社45,000
3株式会社あおば商事98,000

ON のあとに書かれているのが「つなぐ条件」で、ほとんどの場合、第4章で見た外部キーと主キーの組み合わせがそのまま使われます。テーブルを分けて外部キーで関係づけておいたからこそ、JOINで元の形に戻せるわけです。

ExcelのVLOOKUPとの関係

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;
  1. 請求書と得意先をつなげて(ここまでは形2と同じ)
  2. GROUP BY c.name:会社名が同じ行を1つのグループにまとめ
  3. SUM(i.amount):グループごとに金額を合計し、COUNT(*):行数を数えて
  4. ORDER BY total DESC:合計の大きい順(DESC=降順)に並べる
nametotalcnt
株式会社あおば商事218,0002
ひばり印刷株式会社45,0002

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割は「何をしているか」が読み取れます。次の章では、こうしたお願いを受け取ったサーバーが、どうやってデータを正確に、速く、壊さずに扱っているのかを見ていきます。

この章のまとめ

  1. SQLはデータベースへのお願いの言葉。動詞は SELECT(読む)・INSERT(追加)・UPDATE(書き換え)・DELETE(削除)の4つが基本で、実務の大半はSELECT。
  2. SELECT文は FROM から読む。WHERE で行を絞り、ORDER BY で並べ、SELECT で列を選ぶ。
  3. JOIN は2つの表を主キーと外部キーでつなげる。GROUP BY は同じ値の行をまとめて SUM や COUNT で集計する。
  4. 空欄の条件は IS NULL / IS NOT NULL と書く。

確認クイズ

Q1SELECT文を読むとき、最初に見るとよい部分はどれですか。

Q2JOIN customers c ON i.cust = c.code は何をしていますか。

Q3「入金日が空欄の請求書」を取り出す条件の書き方として正しいものはどれですか。