本記事では、数値操作において非常に便利なMOD関数とPOWER関数について、初心者向けに徹底解説します。scottスキーマを活用し、基本的な使い方から実践的な応用例まで幅広く取り上げます。また、読み手が直感的に理解できるよう、SQLの結果例やポイント解説も交えました。
本記事ではSCOTTサンプルスキーマを使用した例で解説します。
SCOTTサンプルスキーマは以下を実行することでインポートおよび使用が可能です。
$ sqlplus / as sysdba
SQL> @?/rdbms/admin/utlsampl.sql
$ sqlplus scott/tiger
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
MOD関数: 剰余を簡単に求める関数
MOD関数は、数値を割った際の余りを求めるための関数です。簡単な演算に見えますが、データの分類や条件判定で頻繁に使用されます。
基本構文
MOD(被除数, 除数)
- 被除数: 割られる数
- 除数: 割る数
例:MOD(10, 3)は1を返します(10を3で割った余りが1)。
実践例: 給与を基準にした分類
次の例では、従業員の給与(SAL)を500で割った余りを計算します。給与が500の倍数である従業員を確認するのにも役立ちます。
SELECT EMPNO, ENAME, SAL,
MOD(SAL, 500) AS SAL_MOD
FROM EMP;
結果:
SQL> SELECT EMPNO, ENAME, SAL,
2 MOD(SAL, 500) AS SAL_MOD
3 FROM EMP;
EMPNO ENAME SAL SAL_MOD
---------- ---------- ---------- ----------
7369 SMITH 800 300
7499 ALLEN 1600 100
7521 WARD 1250 250
7566 JONES 2975 475
7654 MARTIN 1250 250
7698 BLAKE 2850 350
7782 CLARK 2450 450
7788 SCOTT 3000 0
7839 KING 5000 0
7844 TURNER 1500 0
7876 ADAMS 1100 100
7900 JAMES 950 450
7902 FORD 3000 0
7934 MILLER 1300 300
14 rows selected.
解説:
- SAL_MOD列には給与を500で割った余りが表示されます。
- 余りが0の行は給与が500の倍数であることを意味します。
応用例1: 偶数と奇数の判定
MOD関数を用いることで、数値が偶数か奇数かを簡単に判定できます。
偶数:EVEN NUMBER 奇数:ODD NUMBER
SELECT EMPNO, ENAME, SAL,
CASE
WHEN MOD(SAL, 2) = 0 THEN 'EVEN NUMBER'
ELSE 'ODD NUMBER'
END AS SAL_TYPE
FROM EMP;
SQL> SELECT EMPNO, ENAME, SAL,
2 CASE
3 WHEN MOD(SAL, 2) = 0 THEN 'EVEN NUMBER'
4 ELSE 'ODD NUMBER'
5 END AS SAL_TYPE
6 FROM EMP;
EMPNO ENAME SAL SAL_TYPE
---------- ---------- ---------- -----------
7369 SMITH 800 EVEN NUMBER
7499 ALLEN 1600 EVEN NUMBER
7521 WARD 1250 EVEN NUMBER
7566 JONES 2975 ODD NUMBER
7654 MARTIN 1250 EVEN NUMBER
7698 BLAKE 2850 EVEN NUMBER
7782 CLARK 2450 EVEN NUMBER
7788 SCOTT 3000 EVEN NUMBER
7839 KING 5000 EVEN NUMBER
7844 TURNER 1500 EVEN NUMBER
7876 ADAMS 1100 EVEN NUMBER
7900 JAMES 950 EVEN NUMBER
7902 FORD 3000 EVEN NUMBER
7934 MILLER 1300 EVEN NUMBER
14 rows selected.
応用例2: グループ分け
従業員番号(EMPNO)を使って、3つのグループに分けます。
SELECT EMPNO, ENAME,
MOD(EMPNO, 3) AS GROUP_NO
FROM EMP;
SQL> SELECT EMPNO, ENAME,
2 MOD(EMPNO, 3) AS GROUP_NO
3 FROM EMP;
EMPNO ENAME GROUP_NO
---------- ---------- ----------
7369 SMITH 1
7499 ALLEN 2
7521 WARD 0
7566 JONES 0
7654 MARTIN 1
7698 BLAKE 0
7782 CLARK 0
7788 SCOTT 0
7839 KING 0
7844 TURNER 2
7876 ADAMS 1
7900 JAMES 1
7902 FORD 0
7934 MILLER 2
14 rows selected.
解説:
MOD(EMPNO, 3)の結果が0、1、2のいずれかに分類されます。- これにより、データの均等分割が可能になります。
POWER関数: 累乗を簡単に計算する関数
POWER関数は、指定した数値を指数で累乗します。指数計算に便利で、数学的な処理が求められるシナリオで頻繁に使用されます。
基本構文
POWER(数値, 指数)
- 数値: 基数(累乗される数)
- 指数: 累乗の回数
例:POWER(2, 3)は8(2を3乗した結果)を返します。
実践例: 給与の累乗を計算
次の例では、従業員の給与を2乗(平方)と3乗(立方)に計算します。
SELECT EMPNO, ENAME, SAL,
POWER(SAL, 2) AS SAL_SQUARE,
POWER(SAL, 3) AS SAL_CUBE
FROM EMP;
結果:
SQL> col sal_cube for 999999999999999999
SQL> SELECT EMPNO, ENAME, SAL,
2 POWER(SAL, 2) AS SAL_SQUARE,
3 POWER(SAL, 3) AS SAL_CUBE
4 FROM EMP;
EMPNO ENAME SAL SAL_SQUARE SAL_CUBE
---------- ---------- ---------- ---------- -------------------
7369 SMITH 800 640000 512000000
7499 ALLEN 1600 2560000 4096000000
7521 WARD 1250 1562500 1953125000
7566 JONES 2975 8850625 26330609375
7654 MARTIN 1250 1562500 1953125000
7698 BLAKE 2850 8122500 23149125000
7782 CLARK 2450 6002500 14706125000
7788 SCOTT 3000 9000000 27000000000
7839 KING 5000 25000000 125000000000
7844 TURNER 1500 2250000 3375000000
7876 ADAMS 1100 1210000 1331000000
7900 JAMES 950 902500 857375000
7902 FORD 3000 9000000 27000000000
7934 MILLER 1300 1690000 2197000000
14 rows selected.
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
応用例: 名前の文字数に基づくスコア計算
従業員名の文字数(LENGTH関数)を平方してスコア化します。
SELECT ENAME, LENGTH(ENAME) AS NAME_LENGTH,
POWER(LENGTH(ENAME), 2) AS NAME_SCORE
FROM EMP;
SQL> SELECT ENAME, LENGTH(ENAME) AS NAME_LENGTH,
2 POWER(LENGTH(ENAME), 2) AS NAME_SCORE
3 FROM EMP;
ENAME NAME_LENGTH NAME_SCORE
---------- ----------- ----------
SMITH 5 25
ALLEN 5 25
WARD 4 16
JONES 5 25
MARTIN 6 36
BLAKE 5 25
CLARK 5 25
SCOTT 5 25
KING 4 16
TURNER 6 36
ADAMS 5 25
JAMES 5 25
FORD 4 16
MILLER 6 36
14 rows selected.
MOD関数とPOWER関数を組み合わせた高度な応用
給与の3乗を計算し、その結果を特定の値で割った余りを求めます。これにより、複雑なデータ解析が可能です。
SELECT EMPNO, ENAME, SAL,
MOD(POWER(SAL, 3), 7) AS RESULT
FROM EMP;
SQL> SELECT EMPNO, ENAME, SAL,
2 MOD(POWER(SAL, 3), 7) AS RESULT
3 FROM EMP;
EMPNO ENAME SAL RESULT
---------- ---------- ---------- ----------
7369 SMITH 800 1
7499 ALLEN 1600 1
7521 WARD 1250 1
7566 JONES 2975 0
7654 MARTIN 1250 1
7698 BLAKE 2850 1
7782 CLARK 2450 0
7788 SCOTT 3000 1
7839 KING 5000 1
7844 TURNER 1500 1
7876 ADAMS 1100 1
7900 JAMES 950 6
7902 FORD 3000 1
7934 MILLER 1300 6
14 rows selected.
注意点
- MOD関数では、除数に0を指定するとエラーが発生します(ゼロ除算エラー)。
- POWER関数で非常に大きな指数を扱うと、結果が大きくなり過ぎてオーバーフローする可能性があります。
演習問題
以下の問題に挑戦し、理解を深めましょう。
問題1:
給与(SAL)が偶数か奇数かを判定するSQLを作成してください。
回答
回答を表示(ここをクリック)
SQL> SELECT
2 ENAME,
3 SAL,
4 CASE
5 WHEN MOD(SAL, 2) = 0 THEN 'EVEN NUMBER'
6 ELSE 'ODD NUMBER'
7 END AS SAL_TYPE
8 FROM
9 SCOTT.EMP;
ENAME SAL SAL_TYPE
---------- ---------- -----------
SMITH 800 EVEN NUMBER
ALLEN 1600 EVEN NUMBER
WARD 1250 EVEN NUMBER
JONES 2975 ODD NUMBER
MARTIN 1250 EVEN NUMBER
BLAKE 2850 EVEN NUMBER
CLARK 2450 EVEN NUMBER
SCOTT 3000 EVEN NUMBER
KING 5000 EVEN NUMBER
TURNER 1500 EVEN NUMBER
ADAMS 1100 EVEN NUMBER
JAMES 950 EVEN NUMBER
FORD 3000 EVEN NUMBER
MILLER 1300 EVEN NUMBER
14 rows selected.
問題2:
従業員番号(EMPNO)の3乗を計算し、10で割った余りを求めるSQLを作成してください。
回答
回答を表示(ここをクリック)
SQL> SELECT
2 EMPNO,
3 MOD(POWER(EMPNO, 3), 10) AS RESULT
4 FROM
5 SCOTT.EMP;
EMPNO RESULT
---------- ----------
7369 9
7499 9
7521 1
7566 6
7654 4
7698 2
7782 8
7788 2
7839 9
7844 4
7876 6
7900 0
7902 8
7934 4
14 rows selected.
問題3:
従業員名の文字数の3乗を計算し、その結果を5で割った余りを求めるSQLを作成してください。
回答
回答を表示(ここをクリック)
SQL> SELECT
2 ENAME,
3 MOD(POWER(LENGTH(ENAME), 3), 5) AS RESULT
4 FROM
5 SCOTT.EMP;
ENAME RESULT
---------- ----------
SMITH 0
ALLEN 0
WARD 4
JONES 0
MARTIN 1
BLAKE 0
CLARK 0
SCOTT 0
KING 4
TURNER 1
ADAMS 0
JAMES 0
FORD 4
MILLER 1
14 rows selected.
まとめ
- MOD関数は剰余計算を簡単に行い、データ分類や条件判定に役立ちます。
- POWER関数は累乗計算を効率的に実現し、数学的な処理や分析に活用できます。
- 両関数を組み合わせることで、複雑な数値演算が可能になり、分析の幅が広がります。
scottスキーマを使った例を参考に、実際にSQLを実行してみてください!関数を使いこなすことで、SQLスキルをさらに向上させることができます。
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント