目次
はじめに
データベースを扱うときに欠かせないのが SQL関数 です。
SQLの関数を理解しておくと、データの変換・加工・集計がぐっと楽になります。
たとえば「売上データを月ごとに集計したい」「文字列の一部だけを取り出したい」といった処理も、関数を使えば一発で解決可能です。
本記事では、SQLの代表的な関数 を「単一行関数」と「集計関数」に分けて紹介します。
さらに GROUP BY・HAVING・UNION など、実務で必ず出てくる組み合わせも解説します。
単一行関数とは?
単一行関数は 各行に対して個別に適用される関数 のことです。
つまり、1行ごとに変換や加工を行い、その結果を返します。
たとえば:
- 日付のフォーマットを統一する
- 文字列をつなげて新しい情報を作る
- 数値を四捨五入・切り捨てする
といった場面で使われます。
単一行関数の代表例
関数名 | 説明 | 使用例 |
---|---|---|
CONCAT | 文字列を結合する | CONCAT('山田', '太郎') → '山田太郎' |
SUBSTRING | 文字列の一部を取り出す | SUBSTRING('abcdef', 2, 3) → 'bcd' |
ROUND | 数値を四捨五入する | ROUND(123.456, 2) → 123.46 |
TRUNC | 数値を切り捨てる | TRUNC(123.456, 2) → 123.45 |
MOD | 割り算の余りを返す | MOD(10, 3) → 1 |
DATE_FORMAT | 日付を任意のフォーマットに変換 | DATE_FORMAT(NOW(), '%Y-%m') → '2025-08' |
DATEPART | 日付の一部(年・月・日など)を抽出 | DATEPART(YEAR, '2025-08-25') → 2025 |
TO_CHAR | 日付や数値を文字列に変換 | TO_CHAR(SYSDATE, 'YYYY-MM-DD') |
TO_NUMBER | 文字列を数値に変換 | TO_NUMBER('123') → 123 |
NVL | NULLを別の値に置き換える | NVL(NULL, 0) → 0 |
集計関数とは?
集計関数は 複数行のデータをまとめて計算するための関数 です。
膨大なデータの中から「合計」「平均」「件数」を出すときに必須となります。
集計関数の代表例
関数名 | 説明 | 使用例 |
---|---|---|
SUM | 合計を計算する | SUM(price) |
AVG | 平均を計算する | AVG(salary) |
COUNT | 行数を数える | COUNT(*) |
MAX | 最大値を求める | MAX(score) |
MIN | 最小値を求める | MIN(age) |
例:社員テーブルから平均給与を出す
SELECT AVG(salary)
FROM employees;
このように1行ではなく、テーブル全体や条件にマッチしたデータをまとめて処理できるのが特徴です。
GROUP BY句と集計関数の組み合わせ
単に集計するだけでなく、「部署ごとの平均給与」や「商品ごとの売上合計」を出したいときに便利なのが GROUP BY句 です。
使用例
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
👉 部署ごとに平均給与が計算されます。
HAVING句との組み合わせ
HAVING
句は グループ化した後に条件をつける ための構文です。
例:平均給与が30万円以上の部署だけ表示
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) >= 300000;
集合演算子(UNION / MINUS / INTERSECT)
SQLには複数の結果セットを結合・比較するための集合演算子があります。
演算子 | 説明 | 使用例 |
---|---|---|
UNION | 複数のSELECT文の結果を結合(重複は除外) | SELECT name FROM A UNION SELECT name FROM B |
MINUS | 最初のSELECT文の結果から、次のSELECT文に含まれるものを除外 | SELECT name FROM A MINUS SELECT name FROM B |
INTERSECT | 両方のSELECT文に共通する結果を返す | SELECT name FROM A INTERSECT SELECT name FROM B |
これを理解しておくと「差分チェック」や「共通データの抽出」が簡単にできます。
実務での活用シーン
関数の知識は、実際の業務データ分析で大きな力を発揮します。
- 売上分析:月ごとの売上合計(
SUM
+GROUP BY
) - マーケティング分析:ユーザー登録日を月単位に変換(
DATE_FORMAT
) - 在庫管理:数量がNULLのデータを0に置き換え(
NVL
) - 顧客名表示:姓と名を結合してフルネームに(
CONCAT
)
初心者向け:SQL関数の学習おすすめ順序
SQLにはたくさんの関数がありますが、初心者が一度にすべて覚えるのは大変です。効率よく身につけるためには学習の順序を意識することが重要です。
以下におすすめのステップを紹介します。
ステップ1:単一行関数で「データを加工する」ことに慣れる
まずは 文字列や数値を操作する関数 を学びましょう。
身近で直感的に理解できるため、SQLに慣れる入り口として最適です。
CONCAT
(文字列をつなげる)SUBSTRING
(一部を取り出す)ROUND
/TRUNC
(数値を丸める)MOD
(余りを求める)DATE_FORMAT
/TO_CHAR
(日付フォーマット)
👉 この段階で「SQLを使えば生データを整形できる」ことを実感できます。
ステップ2:集計関数で「データをまとめる」感覚をつかむ
次に、集計関数 を学びます。
売上データやアクセスログなどをまとめるときに必ず必要になる知識です。
SUM
(合計)AVG
(平均)COUNT
(件数)MIN
/MAX
(最小・最大値)
👉 ここで「SQLは分析にも強い」と理解できるはずです。
ステップ3:GROUP BYとHAVINGで「グループごとの集計」
集計関数に慣れたら、次は GROUP BY句 を覚えましょう。
部署ごとの給与、商品ごとの売上など「条件で区切ってまとめる」ことが可能になります。
GROUP BY
(グループ化)HAVING
(集計結果に条件をつける)
👉 これを理解すると一気に実務レベルに近づきます。
ステップ4:集合演算子で「結果セットを組み合わせる」
最後に学ぶべきは UNION / MINUS / INTERSECT などの集合演算子です。
これは実務でデータを比較したり、複数テーブルを横断的に分析するときに活躍します。
UNION
(複数の結果をまとめる)MINUS
(差分をとる/Oracle)INTERSECT
(共通部分をとる)
👉 このステップに到達すると、「SQLでできることの幅が一気に広がった」と感じるはずです。
学習順序まとめ(表)
学習ステップ | 学ぶ対象 | 目的 |
---|---|---|
1 | 単一行関数(CONCAT, ROUND, DATE_FORMATなど) | データを加工できるようになる |
2 | 集計関数(SUM, AVG, COUNTなど) | データをまとめて数値化する |
3 | GROUP BY + HAVING | グループごとの分析ができる |
4 | 集合演算子(UNION, MINUS, INTERSECT) | 複数の結果セットを組み合わせる |
SQL(データベース)をしっかり学びたい方はコチラ

初心者がつまずきやすいエラーと対処法
SQLを学び始めたばかりの人がよく経験するエラーや戸惑いを整理しました。実際の例と解決方法を見ておきましょう。
1. NULL
に関するつまずき
よくあるエラー/誤解
SELECT price + discount FROM products;
👉 discount
が NULL
の場合、計算結果が NULLになってしまう。
解決方法
SELECT price + NVL(discount, 0) FROM products; -- Oracle
SELECT price + IFNULL(discount, 0) FROM products; -- MySQL
SELECT price + COALESCE(discount, 0) FROM products; -- PostgreSQL
👉 NULL
は「空っぽ」ではなく「不明な値」。対策として NULL処理関数 を必ず使うのが鉄則。
2. 文字列結合がうまくいかない
SELECT first_name + last_name FROM employees;
👉 SQLでは +
で文字列は結合できないためエラー。
解決方法
- MySQLなら
CONCAT(first_name, last_name)
- Oracle / PostgreSQLなら
first_name || last_name
👉 DBによって「文字列結合の書き方」が違うのは初学者の大きな混乱ポイント。
3. GROUP BYでのエラー
よくあるエラー例
SELECT department, salary
FROM employees
GROUP BY department;
👉 salary
が集計関数でくくられていないためエラー。
解決方法
SELECT department, AVG(salary)
FROM employees
GROUP BY department;
👉 GROUP BYを使うときは、集計関数以外の列はすべてGROUP BYに含める必要がある。
4. HAVING
とWHERE
の違いがわからない
WHERE
:行レベルの条件HAVING
:グループ化した後の条件
間違い例
SELECT department, AVG(salary)
FROM employees
HAVING salary > 300000;
👉 エラーになる。salary
は集計前の値だから。
正しい例
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 300000;
5. 集合演算子の違い
- MySQLでは
MINUS
が使えない - PostgreSQL / MySQLは
EXCEPT
- Oracleは
MINUS
👉 「SQL標準だと思ったらDBごとに違っていた!」という混乱が起きやすい。
こちらもAIではSQLが頻出なのでしっかりと学べます。

初心者が気をつけるべきポイント
- NULLは必ず意識する(IFNULL / NVL / COALESCE を活用)
- 文字列結合の方法はDBごとに違う
- GROUP BYでは集計関数を忘れない
- WHEREとHAVINGの違いを理解する
- 集合演算子はDBごとの違いを把握する
補足
- 最初は身近なデータ加工から → 「文字列をつなげる」「日付を整形する」など簡単なものから始める。
- 次に集計で手ごたえを感じる → 「売上の合計」「平均点」を出してみる。
- グループ化で実務レベルへ → 「部署ごと」「商品ごと」の分析に挑戦。
- 最後に集合演算で応用力を磨く → 「共通ユーザー」「差分データ」の抽出をマスター。
💡 この流れで学べば、SQLの関数を「単なる暗記」ではなく「使いこなせるスキル」として身につけられます。
まとめ
- 単一行関数 はデータを加工するために使う(文字列操作・日付処理・数値計算など)。
- 集計関数 はデータをまとめて計算するために使う(合計・平均・件数など)。
- GROUP BY + HAVING でグループごとの集計や条件指定ができる。
- UNION / MINUS / INTERSECT で結果セット同士を操作できる。
SQL関数を使いこなせば、データベースから欲しい情報を自由自在に引き出すことができます。
初心者の方も、まずはここで紹介した代表的な関数から実際に手を動かしてみるのがおすすめです。
おまけ:DBごとの関数の違い比較(MySQL / Oracle / PostgreSQL)
SQLは共通ルールがある一方で、関数の名前や使い方はDBによって異なるため注意が必要です。
機能 | MySQL | Oracle | PostgreSQL |
---|---|---|---|
文字列結合 | CONCAT('A','B') | `’A’ | |
部分文字列 | SUBSTRING('abc',2,2) | SUBSTR('abc',2,2) | SUBSTRING('abc' FROM 2 FOR 2) |
四捨五入 | ROUND(123.456,2) | ROUND(123.456,2) | ROUND(123.456,2) |
切り捨て | TRUNCATE(123.456,2) | TRUNC(123.456,2) | TRUNC(123.456,2) |
割り算の余り | MOD(10,3) | MOD(10,3) | MOD(10,3) |
日付フォーマット | DATE_FORMAT(NOW(),'%Y-%m') | TO_CHAR(SYSDATE,'YYYY-MM') | TO_CHAR(NOW(),'YYYY-MM') |
日付の一部取得 | YEAR(NOW()) | EXTRACT(YEAR FROM SYSDATE) または TO_CHAR | EXTRACT(YEAR FROM NOW()) |
NULL処理 | IFNULL(col,0) | NVL(col,0) | COALESCE(col,0) |
集合演算 | UNION / INTERSECT / EXCEPT ※MINUS なし | UNION / MINUS / INTERSECT | UNION / INTERSECT / EXCEPT |
ハマりやすいポイント解説
1. NULL処理の関数が違う
- MySQL:
IFNULL
- Oracle:
NVL
- PostgreSQL:
COALESCE
👉 どれも「NULLを別の値に置き換える」役割ですが、関数名が異なるため移行時にエラーが出やすいです。
特に IFNULL
はMySQL特有なので注意。
2. 文字列結合の書き方
- MySQLは
CONCAT('A','B')
が主流。 - OracleやPostgreSQLでは
'A' || 'B'
でシンプルに書けます。
👉 CONCAT
を使い慣れているMySQLユーザーは、他DBで「関数がない?」と戸惑いやすいです。
3. 集合演算の違い
- MySQL:
EXCEPT
はあるが、MINUS
はサポートされていない。 - Oracle:
MINUS
を使うのが基本。 - PostgreSQL:
EXCEPT
を使用。
👉 差集合を扱うときは「MINUS」か「EXCEPT」かをDBごとに意識しないと結果が出ません。
4. 日付処理の違い
- MySQLは
DATE_FORMAT
で柔軟にフォーマット可能。 - OracleやPostgreSQLは
TO_CHAR
を使ってフォーマット。
👉 「年だけ取りたい」ときも、MySQLは YEAR(NOW())
ですが、Oracle/PostgreSQLでは EXTRACT(YEAR FROM …)
を使うのが基本です。
まとめると
- MySQL出身の人は
IFNULL
とDATE_FORMAT
に慣れているので、そのままOracleやPostgreSQLで使うとエラーになりがち。 - Oracle出身の人は
MINUS
を多用しますが、MySQLやPostgreSQLに移行するときはEXCEPT
を覚える必要があります。 - PostgreSQL出身の人は標準SQLに近いので比較的移行が楽ですが、細かい違い(特に文字列結合や日付関数)でつまずくことがあります。
ここもガッツリプログラミングなので、しっかりと学べます。
