単一行関数

現在勉強しているオラクルマスターブロンズ（SQL）についてまとめたものです。
自分のアウトプット用なので見やすさなどは期待しないでください。

# SQL関数の概要と単一行関数の基本

**SQL関数（SQLファンクション）**とは、Oracleデータベースにあらかじめ組み込まれている関数で、大きく**単一行関数**と**グループ関数**に分類される。

単一行関数は１件の入力データごとに処理を行い、**入力データごとに結果を1つ戻す**関数。

グループ関数は複数件の入力データをグループ化して、**累計処理を行った結果を1つだけ戻す**関数。

単一行関数は**任意のレベルにネスト**（関数の引数に別の関数を指定すること）できる。
関数をネストした場合、内側の関数から順番に処理されて、その戻り値が外側の関数の引数になる。

# 文字関数

文字関数は、引数として文字値を受け入れ、文字または数値を戻す関数で、**大文字・小文字変換関数**と**文字操作関数**に分類できる。

## 大文字・小文字変換関数

大文字・小文字変換関数は、引数として受け入れた文字列の大文字・小文字を変換する。

**UPPER関数**は、引数として受け入れた文字列を**全て大文字に変換**して戻す関数。

条件の中ではデータの大文字・小文字は区別されるため、どちらで登録されているかわからない場合や、行によってバラバラだった場合、指定が困難になる。
このような時に、UPPER関数を使用して列の値を全て大文字に変換した上で、大文字の文字列と比較すれば目的のデータを取り出せる。

**LOWER関数**は、引数として受け入れた文字列を**すべて小文字に変換**して返す関数。

**INITCAP関数**は、引数として受け入れた文字列に含まれる**単語の先頭文字を大文字に、２文字目以降を小文字に変換して戻す**関数。
単語の区切りはスペースまたは英数字以外の文字で指定する。

## 文字操作関数

文字操作関数は、引数として受け入れた文字列に対して各種の操作を行う。

**CONCAT関数**は、引数として受け入れた**２つの文字列を結合**して戻す関数。
３つ以上の文字列を結合することはできない。

**SUBSTR関数**は、引数として受け入れた文字列の**m番目の文字からn文字分の文字列を返す（部分文字列を返す）**関数。
nを省略した場合、m文字目から末尾の文字までを戻す。
なお、mに**負の値**を指定すると、**文字列の後ろから数えてm文字目**からn文字分の文字列が戻される。

**LENGTH関数**は、引数として受け入れた文字列の**文字数を戻す**関数で、**全角の文字や記号も１文字**としてカウントされる。

**INSERT関数**は、**指定した文字パターンが現れる位置を戻す**関数。
引数として受け入れた文字列１のm文字目から文字列２を検索し、n番目に一致した文字列の位置（先頭からの文字数）を戻す。
mおよびnが省略された場合のデフォルト数は１で、文字列の最後まで文字列２がない場合は０を戻す。

**LPAD関数、RPAD関数**は、引数として受け入れた文字列が**n文字になるように、埋め込み文字を埋め込んで戻す**関数で、LPAD関数では文字列の**左側**に、RPAD関数では**右側**に埋め込まれる。

**TRIM関数**は、引数として受け入れた文字列の**前後にある削除文字（任意の１文字）を取り除いて戻す**関数で、削除文字が省略された場合は、**半角スペースが取り除かれる**。

削除位置の指定

| 引数 | 説明 |
|:-:|:--|
| LEADING | 文字列の先頭にある削除文字を削除する |
| TRAILING | 文字列の末尾にある削除文字を削除する |
| BOTH | 文字列の先頭及び末尾にある削除文字を削除する（デフォルト） |

**REPLACE関数**は、引数として受け入れた文字列の内、**変更前文字列を変更後文字列に置き換えた文字列を戻す**関数で、変更後文字列が省略された場合は、文字列から変更前文字列を削除した文字列を戻す。

# 数値関数

数値関数は、引数として数値を受け入れ、数値を戻す関数。

## 主な数値関数

**ROUND関数**は、引数に指定された数値を**小数点n桁に四捨五入して戻す**関数で、引数nが省略された場合は整数値に四捨五入する。
また、引数nに負の値が指定された場合は、数値に応じて一の位から四捨五入される。

**TRUNC関数**は、引数に指定された数値を**小数点nけたに切り捨てて戻す**関数で、引数nが省略された場合は整数値になるように切り捨てる。
ROUND関数と同じように負の値も指定できる。

**MOD関数**は、**引数nを引数mで割った余り**を戻す関数。

# 日付関数

日付関数は、日付値を引数として受け入れ、日付または数値を戻す関数。

## 日付値の基礎知識

Oracleデータベースが扱う日付値には、以下の特徴がある。

- 日付値は**世紀、年、月、日、時、分、秒**を表す**内部的な数値書式**で格納される。
- 日付値には**デフォルトの表示書式**がある。
- **英語環境**のデフォルトの表示書式は**DD-MON-RR**（日-月-年）
- **日本語環境**のデフォルトの表示書式は**RR-MM-DD**（年-月-日）
- 日付値に対して加算・減算などを行うことができる。

## 日付値の計算

SQL文で日付値に対して実行できる、主な加算・減算処理は以下の通り。

- 日付値＋数値および日付値-数値
- 日付値＋数値/24および日付値-数値/24
- 日付値-日付値

なお、**日付値に対して除算や乗算は実行できず、日付値同士を加算することもできない**。

日付値に数値を加算すると、指定した数値が**日数として加算**される。
減算の場合も同様で、これらの計算結果は**日付値**になる。

日付値に数値/24を加算すると、指定した数値が**時間数として加算**される。
減算の場合も同様で、これらの計算結果も**日付値**になる。

日付値から日付値を減算すると、指定した2つの日付値の間に経過した**日数**が戻される（１日以下の値は小数として戻される）。

## 日付関数

**SYSDATE関数**は、**現在の日付（日時）**を戻す関数。

**MONTHS_BETWEEN関数**は、引数として受け入れた**2つの日付間の月数を戻す**関数で、日付１が日付２よりも前の日付の場合は、負の数値を戻す。

**ADD_MONTHS関数**は、引数に**指定した日付のnヶ月後の日付を戻す**関数で、引数nに負の値を指定するとnヶ月前の日付が戻される。

引数の日付に月の最終日を指定すると、戻される値も２番目の引数で指定した月数後の月の最終日になる。

**NEXT_DAY関数**は、**引数に指定された日付の翌日以降に、指定された曜日になる最初の日付を戻す**関数。

**LAST_DAY関数**は、**引数に指定された日付を含む月の、最終日の日付を戻す**関数。

**ROUND関数**は、数値関数と同じように引数として日付を受け入れることもでき、**引数に指定された日付値を四捨五入して戻す**。
どの単位で四捨五入するかは書式で指定する。

指定できる主な書式

| 書式 | 説明 |
|:-:|:--|
| YEAR | 指定した日付が６月３０日以前の場合は当年の１月１日午前0時を、７月１日以降の場合は翌年の１月１日午前0時を戻す。 |
| MONTH | 指定した日付が１５日以前の場合は当月の１日午前0時を、１６日以降の場合は翌月の１日午前0時を戻す。 |
| DD | 指定した日付が正午より前の場合は当日の午前0時を、正午以降の場合は翌日の午前0時日付を戻す（デフォルト）。 |

**TRUNC関数**も数値関数と同じように引数として日付を受け入れることもでき、**引数に指定された日付値を切り捨てて戻す**。
どの単位で四捨五入するかは書式で指定する。

指定できる主な書式

| 書式 | 説明 |
|:-:|:--|
| YEAR | 当年の１月１日午前0時を戻す。 |
| MONTH | 当月の１日午前0時を戻す。 |
| DD | 当日の午前0時を戻す（デフォルト）。 |