SQL は、データベースへの頼み方
データベースに「このデータを出して」「この行を書き換えて」と頼むときに使う言葉が SQL(エス・キュー・エル)です。ほとんどのリレーショナルデータベースで、ほぼ同じ書き方が通じます。
いちばんよく使うのは、データを取り出す SELECT 文です。形は次のとおりです。
SELECT どの列を
FROM どのテーブルから
WHERE どんな条件で;英語の文のように、上から読めば意味が分かるように作られています。最後の ;(セミコロン)は「ここで1つの命令が終わり」という印です。
押して試す
下のボタンを順に押してみてください。SQL と、返ってくる結果と、その意味が切り替わります。データは第2章・第3章で見た customers(取引先)と invoices(請求書)です。
上から順に押してみてください
SELECT *
FROM invoices;「*」は「すべての列」という意味です。請求書の表をそのまま全件取り出します。
| invoice_no請求番号 | customer_id取引先ID | issued_on請求日 | amount金額 | status状態 |
|---|---|---|---|---|
| INV-101 | C001 | 2026-09-05 | 120,000 | 入金済 |
| INV-102 | C002 | 2026-09-12 | 85,000 | 未入金 |
| INV-103 | C001 | 2026-09-20 | 43,000 | 未入金 |
| INV-104 | C003 | 2026-09-28 | 210,000 | 入金済 |
| INV-105 | C004 | 2026-10-03 | 66,000 | 未入金 |
| INV-106 | C002 | 2026-10-08 | 150,000 | 未入金 |
6件が返ってきました(教材用サンプル)
SELECT *
FROM customers;取引先の表を全件取り出します。請求書の表の customer_id は、この表の id を指しています。
| id取引先ID | name取引先名 | region地域 |
|---|---|---|
| C001 | 北山商事 | 福岡 |
| C002 | 南浜工業 | 大阪 |
| C003 | 東雲フーズ | 東京 |
| C004 | 西原物産 | 福岡 |
4件が返ってきました(教材用サンプル)
SELECT invoice_no, customer_id, amount
FROM invoices
WHERE status = '未入金';WHERE で「状態が未入金」の行だけに絞り、SELECT で3つの列だけを選んでいます。
| invoice_no請求番号 | customer_id取引先ID | amount金額 |
|---|---|---|
| INV-102 | C002 | 85,000 |
| INV-103 | C001 | 43,000 |
| INV-105 | C004 | 66,000 |
| INV-106 | C002 | 150,000 |
4件が返ってきました(教材用サンプル)
SELECT invoice_no, amount, status
FROM invoices
ORDER BY amount DESC;ORDER BY で並べ替えます。DESC は大きい順(降順)、書かなければ小さい順(昇順)です。
| invoice_no請求番号 | amount金額 | status状態 |
|---|---|---|
| INV-104 | 210,000 | 入金済 |
| INV-106 | 150,000 | 未入金 |
| INV-101 | 120,000 | 入金済 |
| INV-102 | 85,000 | 未入金 |
| INV-105 | 66,000 | 未入金 |
| INV-103 | 43,000 | 未入金 |
6件が返ってきました(教材用サンプル)
SELECT i.invoice_no, c.name, i.amount
FROM invoices AS i
JOIN customers AS c ON i.customer_id = c.id
WHERE i.status = '未入金';JOIN で2つの表をつなぎます。請求書の customer_id と取引先の id が同じ行どうしを横に並べます。
| invoice_no請求番号 | name取引先名 | amount金額 |
|---|---|---|
| INV-102 | 南浜工業 | 85,000 |
| INV-103 | 北山商事 | 43,000 |
| INV-105 | 西原物産 | 66,000 |
| INV-106 | 南浜工業 | 150,000 |
4件が返ってきました(教材用サンプル)
SELECT c.name, SUM(i.amount) AS unpaid_total
FROM invoices AS i
JOIN customers AS c ON i.customer_id = c.id
WHERE i.status = '未入金'
GROUP BY c.name;GROUP BY で取引先ごとにまとめ、SUM で金額を合計します。表計算ソフトのピボットテーブルに近い動きです。
| name取引先名 | unpaid_total未入金合計 |
|---|---|
| 南浜工業 | 235,000 |
| 北山商事 | 43,000 |
| 西原物産 | 66,000 |
3件が返ってきました(教材用サンプル)
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行だけが変わります。
上の 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 で対象件数を確かめる