トップ > SQL入門 > 2章
2章 計算式

算術演算子


本章は計算式について書いていきたいと思います。

SQL文で算術演算子を使用して計算することができます。
使用できる演算子は、足し算(+),引き算(-),掛け算(*),割り算(/)です。

  SQL> SELECT salary,salary + 500000 FROM employees;

      SALARY SALARY+500000
  ---------- -------------
    10000000      10500000
     8000000       8500000
     5000000       5500000
     6000000       6500000
     5500000       6000000
     6500000       7000000
     6200000       6700000
     6400000       6900000
  …

  20 rows selected.
  

実行結果の列見出しの部分は、SELECT句で指定した通り表示されるので、
計算式の列見出しは「SALARY+500000」となります。

では、次の例です。次は演算子を組合わせてみます。

  SQL> SELECT salary, salary + 500000 * 1.2 FROM employees;

      SALARY SALARY+500000*1.2
  ---------- -----------------
    10000000          10600000
     8000000           8600000
     5000000           5600000
     6000000           6600000
     5500000           6100000
     6500000           7100000
     6200000           6800000
     6400000           7000000
     6700000           7300000
     6400000           7000000
     5400000           6000000
  …
  20 rows selected.
  

「salary + 500000 * 1.2」は算数の計算式の優先順位と同じように、
掛け算(*)から先に実施されます。
500000*1.2を実行した結果を、SALARYの値に足し算します。

では、SALARY+500000した後で、1.2倍したい場合は?
これも算数の計算式の通りです。カッコ()で優先順位を変更することができます。

  SQL> SELECT salary, (salary + 500000) * 1.2 FROM employees;

      SALARY (SALARY+500000)*1.2
  ---------- -------------------
    10000000            12600000
     8000000            10200000
     5000000             6600000
     6000000             7800000
     5500000             7200000
     6500000             8400000
     6200000             8040000
     6400000             8280000
     6700000             8640000
     6400000             8280000
     5400000             7080000
  …

  20 rows selected.
  

給料に係数をかけて、ボーナスを計算したいという場合は、
このように計算式を使用することができます。
次は数値以外のデータに計算式を使用してみます。

  SQL> select first_name,hire_date,hire_date + 10 from employees;

  FIRST_NAME                     HIRE_DATE HIRE_DATE
  ------------------------------ --------- ---------
  Suzuki                         07-OCT-92 17-OCT-92
  Sato                           11-OCT-92 21-OCT-92
  Yamamoto                       11-MAR-95 21-MAR-95
  Watanabe                       01-APR-98 11-APR-98
  Watanabe                       14-MAY-98 24-MAY-98
  Kataoka                        01-OCT-00 11-OCT-00
  Harada                         01-OCT-00 11-OCT-00
  Koda                           01-OCT-00 11-OCT-00
  Saito                          01-OCT-00 11-OCT-00
  Akagi                          01-MAR-01 11-MAR-01
  Sato                           01-APR-97 11-APR-97
  …

  20 rows selected.
  

HIRE_DATE+10を行いました。結果は上記の通り、10日がプラスされます。
次に現在の日付からHIRE_DATE列を引いて、入社以降どのくらいの日数が
経過したのか確認します。
現在の日付を表示したい場合はSYSDATE関数を使用します。

  SQL> SELECT first_name,sysdate - hire_date FROM employees;

  FIRST_NAME                     SYSDATE-HIRE_DATE
  ------------------------------ -----------------
  Suzuki                                8030.66953
  Sato                                  8026.66953
  Yamamoto                              7145.66953
  Watanabe                              6028.66953
  Watanabe                              5985.66953
  Kataoka                               5114.66953
  Harada                                5114.66953
  Koda                                  5114.66953
  Saito                                 5114.66953
  Akagi                                 4963.66953
  Sato                                  6393.66953
  …

  20 rows selected.
  

結果は日数が表示されます。年数で表示したければ、

  SQL> SELECT first_name,(sysdate - hire_date)/365 FROM employees;

  FIRST_NAME                     (SYSDATE-HIRE_DATE)/365
  ------------------------------ -----------------------
  Suzuki                                      22.0018365
  Sato                                        21.9908776
  Yamamoto                                     19.577179
  Watanabe                                     16.516905
  Watanabe                                    16.3990968
  Kataoka                                     14.0127954
  Harada                                      14.0127954
  Koda                                        14.0127954
  Saito                                       14.0127954
  Akagi                                       13.5990968
  Sato                                         17.516905
  …

  20 rows selected.
  

小数点の桁数が多く見づらいですが、上記の出力のように年数で表示させることもできます。
小数点を消す場合は?と思うと思いますが、その場合はOracleの関数を使用します。
この関数については第8章でお話ししていきたいと思います。

次に文字データに対して計算式を使用してみます。

  SQL> SELECT first_name,first_name + 'is Hire' FROM employees;
  SELECT first_name,first_name + 'is Hire' FROM employees
                    *
  ERROR at line 1:
  ORA-01722: invalid number
  

一見できそうに見えますが、エラーになってしまいました。
文字データには計算式は使用できません。では上記の様な操作を行いたい場合は
どうするのでしょうか。

その場合は、連結演算子(||)を使用します。連結演算子を使用すると、
列名と列名をくっつけて表示したり、列名と文字列をくっつけて表示することができます。

  SQL> SELECT first_name || last_name , first_name || ' is Hire'
    2> FROM employees;

  FIRST_NAME||LAST_NAME           FIRST_NAME||'ISHIRE'
  ------------------------------- -----------------------
  SuzukiHiroshi                   Suzuki is Hire
  SatoTakashi                     Sato is Hire
  YamamotoKeiko                   Yamamoto is Hire
  Watanabeyoko                    Watanabe is Hire
  WatanabeSawa                    Watanabe is Hire
  KataokaTomonori                 Kataoka is Hire
  HaradaOsamu                     Harada is Hire
  KodaRiku                        Koda is Hire
  SaitoRyota                      Saito is Hire
  AkagiYumi                       Akagi is Hire
  SatoSou                         Sato is Hire
  …

  20 rows selected.
  

少し分かりづらいSQL文でしたが、「first_name || last_name」で2列をくっつけて表示し、
「first_name || ' is Hire'」で列と文字列をくっつけて表示したので、
実行結果は2列で表示されます。

では、次の例文も見ていきましょう。

  SQL> SELECT first_name || ' IS ' || last_name FROM employees;

  FIRST_NAME||'IS'||LAST_NAME
  -------------------------------
  Suzuki IS Hiroshi
  Sato IS Takashi
  Yamamoto IS Keiko
  Watanabe IS yoko
  Watanabe IS Sawa
  Kataoka IS Tomonori
  Harada IS Osamu
  Koda IS Riku
  Saito IS Ryota
  Akagi IS Yumi
  Sato IS Sou
  …

  20 rows selected.
  

このように複数の連結演算子を使用して、1列目 + 文字列 + 2列目として1列で表示しています。 以下の結果とは違います。以下の結果は3列で表示されます。

  SQL> SELECT first_name , ' IS ' , last_name FROM employees;

  FIRST_NAME                     'IS' LAST_NAME
  ------------------------------ ---- ------------------------------
  Suzuki                          IS  Hiroshi
  Sato                            IS  Takashi
  Yamamoto                        IS  Keiko
  Watanabe                        IS  yoko
  Watanabe                        IS  Sawa
  Kataoka                         IS  Tomonori
  Harada                          IS  Osamu
  Koda                            IS  Riku
  Saito                           IS  Ryota
  Akagi                           IS  Yumi
  Sato                            IS  Sou
  …

  20 rows selected.
  

いかがでしたでしょうか。応用部分も入ってきたので少し分かりづらくなってきましたが、
理解しづらい部分は再度復習して、少しずつ自分のものにしていければよいと思います。