プログラム言語では、さまざまな計算や処理を行うために四則演算や比較演算の機能を用意しています。SQLは問合せ言語なので、それほど演算が重要なわけではありませんが、検索条件などでは比較を行うことになります。これらの処理のために用いるのが演算子(Operator)です。
演算子には、「算術演算子」、「連結演算子」、「比較演算子」、「論理演算子」などといったものがあります。まず算術演算子から解説していきましょう。
算術演算子は、数値型のデータに対して演算を行うときに用いる演算子です。算術演算子には次のようなものがあります。
- 加算 +
- 減算 -
- 乗算 *
- 除算 /
- 剰余 %
算術演算子は左辺と右辺の項の演算を行います。項には列名または数値を指定することができます。書式としては次のようになります。
加算演算子
加算演算子(+)は、足し算をするための演算子です。加算演算子を使うと、列の値に数値を加えたり、列同士を足したりすることができます。
ここでは、次の「商品マスタ」を例に考えてみます。
表:商品マスタ
商品番号 | 商品名 | 単価 | 仕入れ値 | 個別包装費 | 数量 |
---|---|---|---|---|---|
1 | LANケーブル | 800 | 560 | 50 | 15 |
2 | CD-Rメディア | 200 | 140 | 10 | 20 |
3 | マウス | 2000 | 1400 | 100 | 6 |
4 | ハードディスク | 12000 | 8400 | 600 | 3 |
5 | CPU | 20000 | 14000 | 1000 | 2 |
SQL文 SELECT 商品名, 仕入れ値 + 20 FROM 商品マスタ;
実行結果
商品名 | 仕入れ値+20 |
---|---|
LANケーブル | 580 |
CD-Rメディア | 160 |
マウス | 1420 |
ハードディスク | 8420 |
CPU | 14020 |
SQL文 SELECT 商品名, 仕入れ値 + 個別包装費 FROM 商品マスタ;
実行結果
商品名 | 仕入れ値+個別包装費 |
---|---|
LANケーブル | 610 |
CD-Rメディア | 150 |
マウス | 1500 |
ハードディスク | 9000 |
CPU | 15000 |
減算演算子
減算演算子(ー)は、引き算をするための演算子です。減算演算子を使うと問合せ結果に対して、列から数値を引いたり、列同士の引き算をしたりすることができます。
列から数値を引く例題は次のようになります。
SQL文
SELECT 商品名, 単価 - 15 FROM 商品マスタ;
実行結果
商品名 | 単価 - 15 |
---|---|
LANケーブル | 785 |
CD-Rメディア | 185 |
マウス | 1985 |
ハードディスク | 11985 |
CPU | 19985 |
表:商品マスタ
商品番号 | 商品名 | 単価 | 仕入れ値 | 個別包装費 | 数量 |
---|---|---|---|---|---|
1 | LANケーブル | 800 | 560 | 50 | 15 |
2 | CD-Rメディア | 200 | 140 | 10 | 20 |
3 | マウス | 2000 | 1400 | 100 | 6 |
4 | ハードディスク | 12000 | 8400 | 600 | 3 |
5 | CPU | 20000 | 14000 | 1000 | 2 |
列同士の引き算の方法は、先ほどの加算と同じ要領になります。
また、「-」は数値の符号を逆転させるのにも使われます。この場合は、符号を逆転させたい列に、「-」を単独で付加します。
SQL文 SELECT 商品名, 個別包装費, - 個別包装費 FROM 商品マスタ;
実行結果
商品名 | 個別包装費 | -個別包装費 |
---|---|---|
LANケーブル | 50 | -50 |
CD-Rメディア | 10 | -10 |
マウス | 100 | -100 |
ハードディスク | 600 | -600 |
CPU | 1000 | -1000 |
同じ「個別包装費」列をお並べて問合せているのですが、前に「-」を入れると、数値の符号が逆転していることがわかります。
乗算演算子
乗算演算子「*」は、掛け算をするための演算子です。列の値に一定の数値を掛けたり、列の値同士の掛け算に使います。
列の値に一定の数値を掛けるときは次のようになります。
SQL文 SELECT 商品名, 単価 * 1.05 FROM 商品マスタ;
実行結果
商品名 | 単価 * 1.05 |
---|---|
LANケーブル | 840 |
CD-Rメディア | 210 |
マウス | 2100 |
ハードディスク | 12600 |
CPU | 21000 |
表:商品マスタ
商品番号 | 商品名 | 単価 | 仕入れ値 | 個別包装費 | 数量 |
---|---|---|---|---|---|
1 | LANケーブル | 800 | 560 | 50 | 15 |
2 | CD-Rメディア | 200 | 140 | 10 | 20 |
3 | マウス | 2000 | 1400 | 100 | 6 |
4 | ハードディスク | 12000 | 8400 | 600 | 3 |
5 | CPU | 20000 | 14000 | 1000 | 2 |
ここでは、「単価」列の値に「1.05」を掛けています。列同士の掛け算もできます。「商品マスタ」表の「単価」列と「数量」列を掛ける場合は、次のようになります。
SQL文
SELECT 商品名, 単価 * 数量 FROM 商品マスタ;
実行結果
商品名 | 単価 * 数量 |
---|---|
LANケーブル | 12000 |
CD-Rメディア | 4000 |
マウス | 12000 |
ハードディスク | 36000 |
CPU | 40000 |
除算演算子
除算演算子(/)は、割り算をするための演算子です。除算演算子を使うと、列の値を一定の数値で割ったり、列同士の割り算ができます。
「商品マスタ表」の「単価」列を「2」で割る場合には、次のように入力します。
SQL文 SELECT 商品名, 単価 / 2 FROM 商品マスタ;
実行結果
商品名 | 単価 / 2 |
---|---|
LANケーブル | 400 |
CD-Rメディア | 100 |
マウス | 1000 |
ハードディスク | 6000 |
CPU | 10000 |
表:商品マスタ
商品番号 | 商品名 | 単価 | 仕入れ値 | 個別包装費 | 数量 |
---|---|---|---|---|---|
1 | LANケーブル | 800 | 560 | 50 | 15 |
2 | CD-Rメディア | 200 | 140 | 10 | 20 |
3 | マウス | 2000 | 1400 | 100 | 6 |
4 | ハードディスク | 12000 | 8400 | 600 | 3 |
5 | CPU | 20000 | 14000 | 1000 | 2 |
列同士の除算は、先ほどの乗算と同じ要領で行えます。
除算演算子で気を付けるのは、割られる側の列の値や、割る側の数値が「0」であってはならないということです。これは単純に数学の問題ですが、「0」で割ると結果が無限大になってしまうために、コンピュータでは扱えなくなってしまいます。
例として Oracle で割る側に「0」を指定して除算すると、次のようなエラーが発生します。
実行結果
エラー行: 1: エラーが発生しました。
ORA-01476: 除数がゼロです。
剰余演算子
剰余演算子(%)は、割り算の結果の余りを求める演算子です。「商品マスタ」表の「数量」列を「2」で割ったときの余りを計算すると次のようになります。
SQL文 SELECT 商品名, 数量, 数量 % 2 FROM 商品マスタ;
実行結果
商品名 | 数量 | 数量 % 2 |
---|---|---|
LANケーブル | 15 | 1 |
CD-Rメディア | 20 | 0 |
マウス | 6 | 0 |
ハードディスク | 3 | 1 |
CPU | 2 | 0 |
「数量」列の値が「20」や「6」といったものは余りがないので「0」が結果となり、「15」や「3」では「1」が余るという結果を出力しています。
なお、ORACLE では%演算子が使えないため、MOD関数を使います。MOD関数については、こちらを参照してください。
https://ichilv.com/sql-mod/
算術演算の優先順位と制御
演算には優先順位があります。この優先順位は通常の数学の計算と同様に、乗算、除算が加算、減算よりも優先されます。加算、減算を乗算、除算よりも先に計算したい場合は、「()」で囲みます。また、剰余演算は、乗算、除算と同じ優先順位です。
優先順位を整理すると次の順番になります。
- ( )で囲んだ演算
- 乗算、除算、剰余
- 加算、減算
「商品マスタ」表で、「仕入れ値」列と「個別包装費」列の値を足した結果に、「数量」列の値を掛けたい場合には、次のように入力します。
SQL文
SELECT 商品名, (仕入れ値 + 個別包装費) * 数量 FROM 商品マスタ;
実行結果
商品名 | ( 仕入れ値 + 個別包装費 ) * 数量 |
---|---|
LANケーブル | 9150 |
CD-Rメディア | 3000 |
マウス | 9000 |
ハードディスク | 27000 |
CPU | 30000 |