SQLの代表的な関数を徹底解説|初心者でもわかる使い方と実例

7 min 62 views
SQL関数

データベースを扱うときに欠かせないのが 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
NVLNULLを別の値に置き換える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句 です。

使用例

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;

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にはたくさんの関数がありますが、初心者が一度にすべて覚えるのは大変です。効率よく身につけるためには学習の順序を意識することが重要です。

以下におすすめのステップを紹介します。

ステップ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など)データをまとめて数値化する
3GROUP BY + HAVINGグループごとの分析ができる
4集合演算子(UNION, MINUS, INTERSECT)複数の結果セットを組み合わせる

SQL(データベース)をしっかり学びたい方はコチラ

SQLを学び始めたばかりの人がよく経験するエラーや戸惑いを整理しました。実際の例と解決方法を見ておきましょう。

1. NULLに関するつまずき

よくあるエラー/誤解

SELECT price + discount FROM products;

👉 discountNULL の場合、計算結果が 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. HAVINGWHEREの違いがわからない

  • 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が頻出なのでしっかりと学べます。

  1. NULLは必ず意識する(IFNULL / NVL / COALESCE を活用)
  2. 文字列結合の方法はDBごとに違う
  3. GROUP BYでは集計関数を忘れない
  4. WHEREとHAVINGの違いを理解する
  5. 集合演算子はDBごとの違いを把握する
  • 最初は身近なデータ加工から → 「文字列をつなげる」「日付を整形する」など簡単なものから始める。
  • 次に集計で手ごたえを感じる → 「売上の合計」「平均点」を出してみる。
  • グループ化で実務レベルへ → 「部署ごと」「商品ごと」の分析に挑戦。
  • 最後に集合演算で応用力を磨く → 「共通ユーザー」「差分データ」の抽出をマスター。

💡 この流れで学べば、SQLの関数を「単なる暗記」ではなく「使いこなせるスキル」として身につけられます。

  • 単一行関数 はデータを加工するために使う(文字列操作・日付処理・数値計算など)。
  • 集計関数 はデータをまとめて計算するために使う(合計・平均・件数など)。
  • GROUP BY + HAVING でグループごとの集計や条件指定ができる。
  • UNION / MINUS / INTERSECT で結果セット同士を操作できる。

SQL関数を使いこなせば、データベースから欲しい情報を自由自在に引き出すことができます。

初心者の方も、まずはここで紹介した代表的な関数から実際に手を動かしてみるのがおすすめです。

SQLは共通ルールがある一方で、関数の名前や使い方はDBによって異なるため注意が必要です。

機能MySQLOraclePostgreSQL
文字列結合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_CHAREXTRACT(YEAR FROM NOW())
NULL処理IFNULL(col,0)NVL(col,0)COALESCE(col,0)
集合演算UNION / INTERSECT / EXCEPTMINUSなしUNION / MINUS / INTERSECTUNION / INTERSECT / EXCEPT

ハマりやすいポイント解説

1. NULL処理の関数が違う

  • MySQLIFNULL
  • OracleNVL
  • PostgreSQLCOALESCE

👉 どれも「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出身の人IFNULLDATE_FORMAT に慣れているので、そのままOracleやPostgreSQLで使うとエラーになりがち。
  • Oracle出身の人MINUS を多用しますが、MySQLやPostgreSQLに移行するときは EXCEPT を覚える必要があります。
  • PostgreSQL出身の人は標準SQLに近いので比較的移行が楽ですが、細かい違い(特に文字列結合や日付関数)でつまずくことがあります。

ここもガッツリプログラミングなので、しっかりと学べます。

関連記事