SQL入門 第6章補足

6-1 数値データを取り扱う

数値データの取扱とNULL値が入る場合の演算について


★教科書訂正

■行で特定の列の値が空白 の場合・・・ (空白が入っている状態ではなく、何も入っていない状態)

上記の例1でsal+commの結果が、空白 (NULL)になる場合と・・・

 

SELECT ENAME,SAL,COMM,SAL + COMM FROM EMP
WHERE JOB = ’SALESMAN’ AND COMM > .25 * SAL
ORDER BY SAL + COMM;

この例では3つの演算を行っています。

NULL

・ある列の値がの場合NULL値を含むといいます。
・NULL値にどんな演算を行っても結果はNULLになります。
・列によってはNULL値が入ることを許可していない場合もあります。→DESCコマンドで確認できます。


★NULL値が含まれていても計算したい!

NVL関数を使用すると、NULL値を他の値に置き換えて演算を行うことができます。

★関数とは
引数(カッコの中身・パラメータともいう)として与えられた値に対してある一定の演算処理を行い、その結果を返す機能です。四捨五入、べき乗など、さまざまな種類の関数が用意されています。

基本構文

NVL(値1,値2)

値1がNULLである場合は値2を返し、値1がNULLでない場合は値1をそのまま返す。

例1
SELECT ENAME,JOB,SAL + COMM
FROM EMP;

このSQLではSALまたはCOMMにNULL値が入っている場合、SAL+COMMの値が表示されません。

例2
SELECT ENAME,JOB,NVL(SAL,0)NVL(COMM,0)
FROM EMP;

NVL(SAL,0)・・・SALがNULLであれば0に置き換えて計算する。NULLでなければそのまま。
NVL(COMM,0)・・・COMMがNULLであれば0に置き換えて計算する。NULLでなければそのまま。

・SALまたはCOMMがNULLである場合、NVL関数によってNULL値を0に置き換えて計算するので、SAL+COMMが表示されます。
・NVLによる置き換えは、計算のために一時的に行われるものであり、データベースの値を置き換えるものではありません

 

6-2 数値データに関する関数

数値型データの加工、編集を行う場合の代表的な関数について

 

★教科書訂正

この単元では・・・割り算の あまり(MOD)、四捨五入・・・・

 

★関数とは(復習)
引数(カッコの中身・パラメータともいう)として与えられた値に対してある一定の演算処理を行い、その結果を返す機能です。四捨五入、べき乗など、さまざまな種類の関数が用意されています。

@MOD関数

基本構文

MOD(値1,値2)

・割り算のあまりを求める関数です。
・値1を値2で割ったあまりを求めます。
・値1,値2には数値、列名を記述できます。列名を記述する場合、扱えるのは数値データのみです。

(例)
SELECT MOD(7,5) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果)
MOD(7,5)
-----------
       2

AROUND関数

基本構文

ROUND(値1,値2)

四捨五入を行う関数です。
・値1を小数点以下 [値2] 桁に四捨五入した値を戻します。値2を省略した場合、値2 = 0となり小数点以下が四捨五入されます。
・値1,値2には数値、列名を記述できます。列名を記述する場合、扱えるのは数値データのみです。

(例1)
SELECT ROUND(123.4567,3) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果1)
ROUND(123.4567,3)
-----------------------
          123.457

★ROUND(123.4567,3)とした場合、小数点以下第4位を四捨五入し、小数点以下第3位まで表示することに注意!(小数点以下第3位を四捨五入するのではない。

(例2)
SELECT ROUND(123.4567,−2) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果2)
ROUND(123.4567,−2)
-------------------------
                100

★値2にマイナスの値を指定すると、小数点以下ではなく十の位や百の位などで四捨五入をおこなうことができます。

 

BTRUNC関数

基本構文

TRUNC(値1,値2)

・小数点以下を切り捨てる関数です。
・値1を小数点[値2]桁に切り捨てた値を戻します。値2を省略した場合、値2 = 0となり小数点以下が切り捨てられます。
・値1,値2には数値、列名を記述できます。列名を記述する場合、扱えるのは数値データのみです。

(例1)
SELECT TRUNC(12.345,2) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果1)
TRUNC(12.345,2)
--------------------
          12.34

(例2)
SELECT TRUNC(12.345) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果2)
TRUNC(12.345)
-----------------
          12

★TRUNC(12.345,2)とした場合、小数点以下第3位を切り捨て、小数点以下第2位まで表示することに注意!(小数点以下第2位を切り捨てるのではない。


(例3)
SELECT TRUNC(123.45,−2) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果3)
TRUNC(123.45,−2)
----------------------
             100

★値2にマイナスの値を指定すると、小数点以下ではなく十の位や百の位などで切り捨てをおこなうことができます。

 

CPOWER関数

基本構文

POWER(値1,値2)

べき乗を求める関数です。
・値1の[値2]乗を求めます。
・値1,値2には数値、列名を記述できます。列名を記述する場合、扱えるのは数値データのみです。

(例)
SELECT POWER(2,3) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果)
POWER(2,3)
--------------
         8

 

DSQRT関数

基本構文

SQRT(値1)

平方根(ルート)を求める関数です。
・値1の平方根を求めます。
・値1には数値、列名を記述できます。列名を記述する場合、扱えるのは数値データのみです。

(例)
SELECT SQRT(2) FROM DUAL;  (DUAL表については疑似表DUALを参照)

(結果)
    SQRT(2)
---------------
 1.41421356   

 

★疑似表DUALについて

データベースとは無関係に画面上で演算結果を確かめてみたいときに使う擬似的な表です。
演算結果を1行だけ返してくれます

DUAL表を使わず、実在する表を使うこともできますが、表のデータ件数分演算結果が表示されてしまいます。DUAL表を使えば1行だけ返してくれます。

 

6-3 日付データを取り扱う

日付データの取扱と演算について


★教科書訂正

■日付データを’YY-MM-DD’以外の書式 変換する・・・

JのMIはMinute( )、DのMM・・・

 

★日付の演算について

・算術演算子+、−を使用して日付データの計算をすることができます。

@日付+数値  日付に数値分(日数)経過した日付
A日付−数値  日付に数値分(日数)遡(さかのぼ)った日付
B日付−日付  日付間の日数

※日付+日付  無意味なのでエラーとなります。

例 入社してから何日経過したかを表示する。

SELECT ENAME,HIREDATE,SYSDATE−HIREDATE 通算勤務日数
FROM EMP
WHERE DEPTNO = 20;

結果

ENAME    HIREDATE   通算勤務日数
----------  --------   ------------
SMITH     80-12-17   7477.58249
JONES     81-04-02   7371.58249
SCOTT     87-04-19   5163.58249
ADAMS     87-05-23   5129.58249
FORD      81-12-03   7126.58249

★TO_CHAR関数について

・日付データ、数値データを文字列として扱えるように変換する関数です。
・日付データを’YY-MM-DD’(年−月−日)以外の書式に変換するときに使用します。

基本構文

TO_CHAR(変換元データ,変換書式)

(例)

SELECT TO_CHAR(SYSDATE,’YYYY/MM/DDTH DAY’)
FROM DUAL;

結果

TO_CHAR(SYSDATE,'YYY
--------------------
2001/06/13th 水曜日

変換元データを変換形式に従って変換し表示します。変換書式の中で変換で使用するための書式以外の文字列を入れた場合はその文字列がそのまま出力される。(例ではthと/)

 

変換書式で使用する形式

@DD

ADY

曜日(日〜土)

BDAY

曜日(日曜日〜土曜日)

CD

週の何日目か(1〜7)

DMM

EMON

月(JAN〜DEC)大文字・小文字区別あり

FMONTH

月(1月〜12月)

GYY

西暦年の下2けた

HYYYY

西暦年

IRR

西暦年下2けた(50以上:1900年代・49以下2000年代)

JHH:MI:SS

12時間表記 時:分:秒

KHH24:MI:SS

24時間表記 時:分:秒

LFM

埋め込みモード 先行する0を省く

 

6-4 日付データを取り扱う

日付データの加工・編集について

基本構文

※以下のどの関数も、引数「日付データ」には直接日付を記述するか、または列名(日付型)を記述する。

ADD_MONTHS(日付データ,数値)

日付データから「数値」ヶ月後の日付を表示(数値に負数を指定した場合は「数値」ヶ月前の日付)

LAST_DAY(日付データ)

日付データの月の最後の日付

NEXT_DAY(日付データ,’○曜日’)

日付データより後の「○曜日」(○に曜日を指定)の日付

MONTHS_BETWEEN(日付データ,日付データ)

日付データから日付データまでの月数

SYSDATE

現在の日時

 

6-5 文字列データを取り扱う

文字列の連結について

「 || 」(パイプ)を使用して列と列のデータ、列のデータと文字列などを連結し、一つの列として表示することができます。

(例)

SELECT ENAME || ’様’ FROM EMP;

ENAME||’様’
------------
SMITH様
ALLEN様
WARD様
JONES様
MARTIN様
  :
  :

 

6-6 文字列データに関する関数

文字列データの加工・編集に使う関数について

基本構文

※以下のどの関数も、引数「文字データ」には直接文字列を記述するか、または列名(文字型)を記述する。

INITCAP(文字データ)

文字列の先頭の文字を大文字に、残りを小文字にする。

UPPER(文字データ)

文字列をすべて大文字にする。

LOWER(文字データ)

文字列をすべて小文字にする。

SUBSTR(文字データ,値1,値2)

文字列の「値1」文字目から「値2」文字分取り出す。

LENGTH(文字データ)

文字列の長さ(文字数)を表示。

※LENGTHの罠

VARCHAR2(10)での「smith」(半角)は5文字。
CHAR(10)での「smith」(半角)は10文字・・・固定長であるため、文字数は常に同じ。

VARCHAR2(10)での「オラクル」(全角)は4文字だが、
CHAR(10)での「オラクル」(全角)は6文字・・・4文字+空き(2バイト=2文字)。

オラクルマスターの試験でも出題されます!

 

6-7 数値、文字列、日付データに関する関数

数値、文字列、日付データの変換・加工・編集に使う関数について

変換関数

★TO_CHAR

日付→文字

数値→文字

詳しくは 6−3 ★TO_CHARについて を参照してください

★TO_DATE

文字→日付

INSERT、UPDATEなどで日付データの時分秒を指定する場合などに使用します。

(例)

EMP表にHIRONORIさんのデータを追加する。入社日は2001年6月3日午前9時(24時間表記)とする。

INSERT INTO EMP(EMPNO,ENAME,HIREDATE,DEPTNO)
VALUES (7799,’HIRONORI’,
TO_DATE(’010603090000’,’
RRMMDDHH24MMSS’),20);

※日付書式RRについて

西暦下2けたが入力された場合、オラクル内部で2000年代として扱うか1900年代で扱うかを自動判別する。49以下は2000年代、50以上は1900年代。
上のSQLでは01を2001年として扱う。

※数値書式について(COBOLと混同しないようにしよう。)

9の数が有効桁数。先行するゼロは空白になる。
0の数が有効桁数。先行するゼロはゼロが表示される。
値の前に$記号が付加される。
指定した位置に小数点をつける。
指定した位置にローカル通貨記号をつける。(日本では「¥」)
指定した位置にカンマをつける。
指定した位置にピリオドをつける。

(例)

EMP表のENAME,SALを表示する。ただしSAL列に次の数値書式を設定し、表示する。
’$9,990.00’

SELECT ENAME,TO_CHAR(SAL,’$9,990.00’)
FROM EMP;

結果

ENAME    TO_CHAR(SA
---------- ----------
SMITH      $800.00
ALLEN     $1,600.00
WARD      $1,250.00
JONES     $2,975.00
MARTIN     $1,250.00
  :         :


6-8 その他の関数

数値、文字列、日付データの型に関わらず使える関数について

変換関数

GREATEST(値1,値2 [,値3・・・])

パラメータで指定した値のなかで最も大きいもの。
値には列を指定することも可能。

LEAST(値1,値2 [,値3・・・])

パラメータで指定した値のなかで最も小さいもの。
値には列を指定することも可能。