Oracle SQL 演算子
演算子とは、SELECT文等の中でデータ項目にある種の操作を行い、異なる値を結果として返させるものです。
- データ項目に計算を加える
- 文字列の項目同士の連結
おすすめ書籍
- 図解入門よくわかる最新Oracleデータベースの基本と仕組み[第4版] (How‐nual Visual Guide Book)
- Oracleの基本 ~データベース入門から設計/運用の初歩まで
- [改訂第4版]SQLポケットリファレンス
算術演算子
演算子には、算術演算子、文字列結合演算子、集合演算子があります。算術演算子はいわゆる四則演算のためのものでプログラム言語で使用されている演算子と同様で、単項演算子と二項演算子に分けられます。単項演算子は"-","+"のみでデータ項目の直前につけてその値を反転もしくは同じ値を返す働きをします。二項演算子はいわゆるA+B、A-Bという2つのデータ項目の四則演算を行うものです。演算子の優先順位は以下の表の様になります。
| 演算子 | 操作 | 優先順位 |
|---|---|---|
| 単項演算子 +、- | 同一、反転 | 1 |
| 二項演算子 *、/ | 乗算、除算 | 2 |
| 二項演算子 +、- | 加算、減算 | 3 |
式の中で同じ優先順位のものは左から右に評価されます。また、式の中で括弧”()”を使用することで括弧の中が先に評価されます。以下に、算術演算子の働きをリテラル値を使った例を示します。例からもわかるように、データ項目がNULLの場合は演算結果がNULLになります。この点は注意が必要だと思います。
SQL> SELECT
2 1 + 2 AS T1
3 ,1 - 2 AS T2
4 ,10 * 20 AS T3
5 ,10 / 20 AS T4
6 ,(1 + 2) * 2 AS T5
7 ,-(1 + 2) * 2 AS T6
8 ,1 + NULL AS T7
9 ,10 * NULL AS T8
10 ,-NULL AS T9
11 FROM DUAL;
T1 T2 T3 T4 T5 T6 T7 T8 T9
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
3 -1 200 .5 6 -6
上の例は、リテラル値を使いましたので、今度はテーブルの列に対しての演算子の例を示します。最初に元となるテーブルを表示します。
SQL> SELECT * FROM TM_商品;
商品コード 商品名 商品区分 仕入単価 売上単価
---------- ---------------------------------------- -------------------- ---------- ----------
1 PC-9001 デスクトップパソコン 65000 98000
2 PC-9002 デスクトップパソコン 95000 120000
3 PC-9003 デスクトップパソコン 150000 190000
4 NOTE-1010 ノートパソコン 125000 188000
5 NOTE-1020 ノートパソコン 145000 200000
6 NOTE-1030 ノートパソコン 155000 220000
7 PRT-3001 プリンタ 45000 88000
8 PRT-4001 プリンタ 115000 180000
9 CRT-1001 ディスプレイ 45000 78000
10 CRT-2001 ディスプレイ 55000 98000
11 HUB-A001 ネットワーク 20000 40000
12 HUB-B001 ネットワーク 40000 60000
12行が選択されました。
TM_商品の売上単価を1.05倍し、その値が10,000円より大きいものを検索するSQL文を示しています。
SQL> SELECT 商品コード,売上単価,売上単価 * 1.05 FROM TM_商品
2 WHERE 売上単価 * 1.05 > 100000;
商品コード 売上単価 売上単価*1.05
---------- ---------- -------------
1 98000 102900
2 120000 126000
3 190000 199500
4 188000 197400
5 200000 210000
6 220000 231000
8 180000 189000
10 98000 102900
8行が選択されました。
演算子はSELECT文のみではなくUPDATE文であっても以下の様に使用可能です。
SQL> UPDATE TM_商品 2 SET 売上単価 = 売上単価 * 1.05 3 WHERE 売上単価 * 1.05 > 100000; 8行が更新されました。
文字列結合演算子
連結演算子は以下の様に文字列カラムを連結するための演算子です。実線縦バーを2個で連結演算子を示します。C言語で言うところの論理演算子のORと同じものです。演算子で結合された結果は文字データを返します。
SQL> SELECT '商品コード=' || 商品コード , '商品名(' || 商品名 || ')' FROM TM_商品
2 ORDER BY 商品コード;
'商品コード='||商品コード '商品名('||商品名||')'
--------------------------------------------------- ------------------------------------------------
商品コード=1 商品名(PC-9001)
商品コード=2 商品名(PC-9002)
商品コード=3 商品名(PC-9003)
商品コード=4 商品名(NOTE-1010)
商品コード=5 商品名(NOTE-1020)
商品コード=6 商品名(NOTE-1030)
商品コード=7 商品名(PRT-3001)
商品コード=8 商品名(PRT-4001)
商品コード=9 商品名(CRT-1001)
商品コード=10 商品名(CRT-2001)
商品コード=11 商品名(HUB-A001)
商品コード=12 商品名(HUB-B001)
12行が選択されました。
NULLである項目をNULLでは無いリテラル文字列と連結すると結果はNULLにはならず、NULLの項目を空文字''として連結されます。以下に例を示します。
SQL> UPDATE TM_商品 SET 商品名 = NULL
2 WHERE 商品コード=12;
1行が更新されました。
SQL> SELECT '商品コード=' || 商品コード , '商品名(' || 商品名 || ')' FROM TM_商品
2 WHERE 商品コード=12;
'商品コード='||商品コード '商品名('||商品名||')'
--------------------------------------------------- ------------------------------------------------
商品コード=12 商品名()
しかし、Oracleの説明では以下の様にNULLの可能性がある場合にはNVL関数を使用して明示的に空文字としたほうが良い様です。
SQL> SELECT '商品コード=' || 商品コード , '商品名(' || NVL(商品名,'') || ')' FROM TM_商品
2 WHERE 商品コード=12;
'商品コード='||商品コード '商品名('||NVL(商品名,'')||')'
--------------------------------------------------- ------------------------------------------------
商品コード=12 商品名()
尚、NULL同士のカラムを連結すると結果はNULLを返します。以下のテストではNULL結合がNULLであることを確認しています。
SQL> SELECT NVL(NULL || NULL ,'IS NULL') FROM DUAL; NVL(NUL ------- IS NULL