スポンサーリンク

【応用情報技術者試験】SQL構文

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 NULLNULLかどうかを調べる
LIKE '%1月%'1月を含む文字列
LIKE '1月_'1月の後に任意の1文字が続く
BETWEEN 1000 AND 300001000以上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.集計とグループ化をつなげる

WHEREで行を選び、GROUP BYでまとめ、HAVINGで集計後のグループを選ぶ
WHEREで行を選び、GROUP BYでまとめ、HAVINGで集計後のグループを選ぶ
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は、同じデータで結果を比較すると理解が深まります。

参考:PostgreSQL:SELECT

参考:PostgreSQL:ORDER BY

参考:PostgreSQL:ANY・ALL・NULLを含む比較

コメント