第4章/全8章 ・ 目安 7分

SQLで取り出す

絞り込み・並べ替え・つなぐ・集計

SQL は、データベースへの頼み方

データベースに「このデータを出して」「この行を書き換えて」と頼むときに使う言葉が SQL(エス・キュー・エル)です。ほとんどのリレーショナルデータベースで、ほぼ同じ書き方が通じます。

いちばんよく使うのは、データを取り出す SELECT 文です。形は次のとおりです。

SELECT どの列を
FROM   どのテーブルから
WHERE  どんな条件で;

英語の文のように、上から読めば意味が分かるように作られています。最後の ;(セミコロン)は「ここで1つの命令が終わり」という印です。

押して試す

下のボタンを順に押してみてください。SQL と、返ってくる結果と、その意味が切り替わります。データは第2章・第3章で見た customers(取引先)と invoices(請求書)です。

上から順に押してみてください

SELECT *
FROM invoices;

「*」は「すべての列」という意味です。請求書の表をそのまま全件取り出します。

invoice_no請求番号customer_id取引先IDissued_on請求日amount金額status状態
INV-101C0012026-09-05120,000入金済
INV-102C0022026-09-1285,000未入金
INV-103C0012026-09-2043,000未入金
INV-104C0032026-09-28210,000入金済
INV-105C0042026-10-0366,000未入金
INV-106C0022026-10-08150,000未入金

6件が返ってきました(教材用サンプル)

1. 全部見る:SELECT * FROM

* は「すべての列」です。まず表の中身を眺めたいときに使います。ただし、本物の業務システムでは何百万行もあるので、実際には条件を付けて件数を絞ります。

2. 絞り込む:WHERE

WHERE status = '未入金' で、状態が「未入金」の行だけが残ります。文字は '(シングルクォート)で囲みます。条件は amount >= 100000(10万円以上)のような比較や、AND(かつ)・OR(または)での組み合わせもできます。表計算ソフトの「フィルター」と同じ役目です。

3. 並べ替える:ORDER BY

ORDER BY amount DESC で金額の大きい順になります。並べ替えを指定しないと、返ってくる順番は保証されません。「いつもこの順で出てくるから」と頼らず、順番が大事なときは必ず書きます。

4. 表をつなぐ:JOIN

第3章で表を分けたので、請求書の表には取引先の名前がありません。そこで JOIN を使い、customer_id と id が同じ行どうしを横につなぎます。表計算ソフトでいえば、VLOOKUP で別シートから名前を引いてくる動きに近いものです。

invoices AS i の i は、長い表の名前を短く呼ぶための「あだ名」です。i.amount は「請求書の表の amount 列」という意味になります。

5. 集計する:GROUP BY と SUM

GROUP BY c.name で取引先ごとに行をまとめ、SUM(i.amount) でまとめた行の金額を合計します。ほかに件数を数える COUNT、平均の AVG、最大・最小の MAX・MIN があります。

結果を検算してみましょう。南浜工業の未入金は INV-102 の 85,000 円と INV-106 の 150,000 円で、合計 235,000 円です。結果の表と一致しているはずです。SQL の結果は、このように小さく確かめる習慣を付けておくと安心です。

書き換える SQL は、重みが違う

ここまでの SELECT は「見るだけ」で、データは何も変わりません。一方、次の3つはデータそのものを変えます。

  • INSERT:行を追加する(新しい請求書を登録する)
  • UPDATE:行の値を書き換える(入金済にする)
  • DELETE:行を消す
UPDATE invoices
SET    status = '入金済'
WHERE  invoice_no = 'INV-102';

これは「INV-102 を入金済にする」SQL です。正しく書けば1行だけが変わります。

WHERE を書き忘れると、全部の行が変わる

上の SQL から WHERE の行が抜けると、UPDATE invoices SET status = '入金済'; となり、請求書6件すべてが「入金済」になります。DELETE なら全件が消えます。データベースは、書かれたとおりに迷わず実行します。

そのため実務では、書き換える前に同じ条件で SELECT を実行し、対象が何件かを先に確かめます。たとえば SELECT * FROM invoices WHERE invoice_no = 'INV-102'; で1件だけ返ってくることを見てから、UPDATE に進みます。

この章のポイント
  • SELECT 列 FROM 表 WHERE 条件 が基本の形
  • ORDER BY で並べ替え、JOIN で表をつなぎ、GROUP BY と SUM で集計する
  • INSERT・UPDATE・DELETE はデータを変える。先に SELECT で対象件数を確かめる