SQLは、表のデータを検索・追加・更新・削除したり、集計したりするための言語です。構文を一度に暗記するより、「何をしたいか」から命令を選ぶと整理できます。
この記事は基本構文の早見表です。SQLの実装差があるため、関数やLIMITなどの書き方は利用するDBMSでも確認してください。集計の条件判断を例題で練習したい方は、最後の無料noteへ進めます。
1.取得・追加・更新・削除を分ける
| 目的 | 命令 |
|---|---|
| 取得する | SELECT |
| 行を追加する | INSERT |
| 値を更新する | UPDATE |
| 行を削除する | DELETE |
SELECT * FROM 家計簿;
INSERT INTO 家計簿 (日付, 費目, メモ, 出金額)
VALUES (CURRENT_DATE, '食費', 'パン', 260);
UPDATE 家計簿 SET 出金額 = 300 WHERE id = 1;
DELETE FROM 家計簿 WHERE id = 1;
例では家計簿という表に、id・日付・費目・メモ・出金額があるものとします。*はすべての列です。INSERTでは列名を明示すると、値の対応が分かりやすくなります。UPDATEやDELETEのWHEREを省略すると、通常は表全体が対象になります。
2.WHEREで対象の行を絞る
| 条件 | 意味 |
|---|---|
| A AND B | 両方の条件を満たす |
| A OR B | どちらかの条件を満たす |
| =、<>、<、<=、>、>= | 等しい・等しくない・大小の比較 |
| IS NULL / IS NOT NULL | NULLかどうかを調べる |
| LIKE '%1月%' | 1月を含む文字列 |
| LIKE '1月_' | 1月の後に任意の1文字が続く |
| BETWEEN 1000 AND 30000 | 1000以上30000以下(両端を含む) |
| IN ('食費', '交通費') | 指定した値のいずれかに一致 |
| NOT IN ('食費', '交通費') | 指定した値のいずれにも一致しない |
NULLは「= NULL」で判定せずIS NULLを使います。NOT INにNULLが混ざる場合など、条件の結果が真・偽だけでなく不明になる点にも注意してください。ANDとORを組み合わせるときは、括弧で意図を明示しましょう。
SELECT * FROM 家計簿
WHERE (費目 = '食費' OR 費目 = '交通費')
AND 出金額 >= 1000;
ANYは比較対象のいずれか、ALLはすべてとの比較が成立するかを調べます。副問合せの例は、出金額 <= ANY (SELECT 出金額 FROM 別表) の形です。比較演算子は<=や>=を使い、=<や=>とは書きません。NULLや空の結果集合の扱いも確認してください。
3.重複・並べ方・取得件数を調整する
SELECT DISTINCT 費目 FROM 家計簿;
SELECT * FROM 家計簿
ORDER BY 出金額 DESC, id ASC
LIMIT 3 OFFSET 2;
DISTINCTは結果の重複を除きます。ORDER BYのASCは昇順、DESCは降順で、方向を省略したときの基本はASCです。ORDER BYそのものを省略すると、結果の並び順は保証されません。例のLIMIT 3 OFFSET 2は、先頭2行を飛ばして最大3行を取得する書き方です。DBMSにより件数制限の構文は異なります。
| 集合演算 | 意味 |
|---|---|
| UNION | 結果を合わせ、重複を除く(UNION ALLは重複を残す) |
| EXCEPT | 最初の結果から次の結果にある行を除く |
| INTERSECT | 両方にある行を取り出す |
集合演算では、列の数と対応する列の型をそろえます。
4.式・関数・CASEで結果を作る
数値計算には+・−・*・/を使います。日付の計算や文字列連結の演算子は、型やDBMSによって異なります。次はPostgreSQLを想定したCASEと文字列連結の例です。
SELECT ユーザー名,
CASE
WHEN 年齢 < 20 THEN '20歳未満'
WHEN 年齢 <= 65 THEN '20〜65歳'
ELSE '66歳以上'
END AS 分類
FROM ユーザー;
SELECT CAST(出金額 AS VARCHAR(20)) || '円' AS 出金額表示
FROM 家計簿;
| 関数・式 | 役割 |
|---|---|
| LENGTH | 文字列の長さ |
| TRIM | 両端の空白などを取り除く |
| REPLACE | 文字列の一部を置換 |
| SUBSTRING | 文字列の一部を取り出す |
| ROUND / TRUNC | 丸める / 切り捨てる |
| POWER | べき乗 |
| CURRENT_DATE | 現在の日付 |
| CAST | 型の変換 |
ROUNDやTRUNCの桁指定、文字列長の単位、日付演算の構文は実装を確認してください。たとえばTRUNC(数値, 1)は、小数第1位まで残して、それ以降を切り捨てる形です。REPLACEは文字列の部分置換なので、「その文字列と完全一致する行だけを更新する」命令とは異なります。
5.集計とグループ化をつなげる

SELECT 費目, SUM(出金額) AS 合計
FROM 家計簿
WHERE 出金額 >= 1000
GROUP BY 費目
HAVING SUM(出金額) >= 3000;
SUMは合計、AVGは平均、MAX/MINは最大/最小、COUNTは件数です。COUNT(*)は行数、COUNT(列)はその列がNULLでない行数を数えます。WHEREは集計前の行、HAVINGは集計後のグループを絞ります。
6.副問合せとJOINで表を組み合わせる
SELECT * FROM 家計簿
WHERE 出金額 > (SELECT AVG(出金額) FROM 家計簿);
SELECT k.日付, f.名前 AS 費目, k.メモ
FROM 家計簿 AS k
JOIN 費目 AS f ON k.費目ID = f.ID;
最初の例は、全体の平均を副問合せで求め、その平均より大きい出金を取得します。後の例では、費目IDを持つ家計簿と、ID・名前を持つ費目表を対応付けます。ONには結合する条件を書きます。
理解を確かめる確認問題
ORDER BY 出金額 と、ORDER BY 出金額 DESC は同じ並びになるでしょうか。
解答・解説を見る
通常は異なります。方向を省略したORDER BYの基本はASC(昇順)、DESCは降順です。
まとめ:対象の行と集計後の条件を区別する
命令の役割を選び、対象の行、集計する単位、結果の並べ方を順に確認しましょう。特にWHEREとHAVINGは、同じデータで結果を比較すると理解が深まります。

コメント