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