【SilverSQL】第5章～第16章

# 変換ファンクションおよび条件式の使用
### データ型の変換

#### TO_DATE
文字リテラルを日付値に変換する

* 日付値に対して、「数値/24」を加算したり減算した場合は、数値を「時間数」として加算したり減算したりする。
設問の「12/24」であれば、12時間として演算する。
* 引数に時刻が指定されていない場合は午前0時0分0秒に設定される。
以上より、

```:例
TO_DATE('12-01-01') + 12/24
```

```:結果
"12-01-01の正午"
```

#### TO_CHAR
数値型データを文字型データに変換する

```
TO_CHAR(n [, 'format' ])
```
* 数値nを文字列に変換
* 数値書式formatを省略すると、nの有効桁数を保持するために十分な長さの文字列に変換
* 数値書式formatを指定すると、指定された書式に基づき文字列に変換

```:例
SQL> SELECT TO_CHAR(12345.67, '999,999.999') FROM dual;
```
```:結果
12,345.670
```

![kkkkk48937.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846917/4168e4d7-66b0-4fd4-9b91-e96b09fd08b7.jpeg)


#### 有効桁数が不足した場合
実際の数値データよりも数値要素の桁数が足りない場合、「#」で表示

```:例(整数部の桁数が不足)
SQL> SELECT TO_CHAR(12345.67, '9,999.999') FROM dual;
```
```:結果
#########
```
```sql:例
SELECT TO_CHAR(SYSDATE) - '99-04-01' FROM dual;
```
```:結果
文字列同士の演算はできませんので、エラーとなります。
```

#### TO_NUMBER
文字型データを数値型データに変換する

```
TO_NUMBER(str [, 'format' ])
```

* 文字列strを数値書式formatに基づき数値に変換

```:例
SQL> SELECT TO_NUMBER('$19,456', '$99G999') FROM dual;
```
```:結果
19456
```

![kkkkk48936.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846917/6b84f621-4769-42c9-a223-efdc0e8e2ca4.jpeg)

#### 暗黙的なデータ型変換
暗黙的なデータ変換とは、データ型の変換が意味を持つ場合に、Oracle Databaseが自動的に行う変換。以下のような場合に変換が行われる。
* 数値を指定すべきところに文字列が指定された場合：文字列を数値に変換
* 日付リテラルが指定された場合：デフォルトの日付の表示書式にしたがって日付値に変換
* 文字列を指定すべきところに数値が指定された場合：数値を文字列に変換
* 文字列を指定すべきところに日付値が指定された場合：日付値を文字列に変換

#### NVL
NULLを異なる値に置き換える

```
NVL(in, replace)
```

* inがNULLの場合、値をreplaceに置き換える。
* inがNULLでない場合、置き換えは実行せず、inを戻す。
* inのデータ型と、replaceのデータに型が異なる場合、replaceをinのデータ型に暗黙的に変換。

#### COALESCE
複数の値のうち、最初に見つかった非NULL値を戻す

```
COALESCE(in1, in2, ...., inN)
```

* in1からinNの中で最初に見つかったNULLではない値を戻す
* in1からinNのすべてがNULLの場合、NULLを戻す
* in1からinNは同じデータ型である必要がある

#### DECODE
第1引数に指定された式の値と、第2引数以降に指定された条件を順に判定し、値が合致した条件に対応する戻り値を返します。

* DECODE関数は、第1引数に指定された式の値と、第2引数以降に指定された条件を順に判定し、値が合致した条件に対応する戻り値を返す。
* 式の値がどの条件にも合致しない場合は、デフォルトの戻り値が返されますが、デフォルトの戻り値が指定されていない場合はNULL値を返します。
* DECODE関数の条件に、WHERE句の条件に指定するような比較演算子を使用した条件を記述することはできません。
* 条件が複数指定された場合の戻り値のデータ型は、第3引数で指定された戻り値のデータ型が採用される。したがってそれぞれの戻り値は、第3引数の戻り値のデータ型と同じデータ型の値を指定するか、暗黙的なデータ変換で第3引数の戻り値のデータ型と同じデータ型となるような値を指定しなければならない。

```sql
DECODE(式, 条件1, 戻り値1 [, 条件2, 戻り値2 …] [, デフォルトの戻り値])
```
```sql:例
SELECT 
 department_id, 
 employee_name,
 DECODE(salary, 200000,
 DECODE(department_id, 1, salary * 0.15, '0'),'0') AS "昇給"
FROM
 employees;
```

# 集合演算

* 各SELECTリストの列数とデータ型を一致させる
* 各SELECTリストの列名は異なってよい
* ORDER BY句は、文の最後にのみ指定できる
* UNION ALL以外の集合演算では戻されるデータがソートされる


# データ変更とトランザクション

<table>
  <caption>トランザクションのACID特性</caption>
  <thead>
    <tr>
      <th>特性</th>
      <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>原子性(Atomicity)</td>
    <td>
    仮にトランザクションが失敗したとしても、「データが決して中途半疑な状態にはならず、処理がすべて（"ALL"）実行されたか、まったく実行されない（NOTHING"）かのいずれかである」という特性
    </td>
  </tr>
  <tr>
    <td>一貫性(Consistency)</td>
    <td>
    「トランザクション実行前の時点で、データベースがデータの整合性を保持している状態であれば、トランザクションの実行後もデータの整合性を維持し続ける」という特性。一質性を実現するには、単にDBMSを使うだけでは不十分で、アプリケーションが正しく作られている必要がある
    </td>
  </tr>
  <tr>
    <td>隔離性(Isolation)</td>
    <td>
    「同時に実行されたトランザクション同士が、相互に干渉しない、開能された状態である」という特性。Oracle は「読取り一貫性やロックによる同時変更の防止」によって、トランザクションの隔離性を実現している
    </td>
  </tr>
  <tr>
    <td>持統性(Durability)</td>
    <td>
    「コミットされたトランザクションが適切に保存され、簡単に失われることがない」という特性。Oracleはインスタンスリカバリ機能やメディアリカバリ機能によって、トランザクションの持続性を実現している。この特性は「永続性」または「耐久性」と呼ばれることもある
    </td>
  </tr>
</table>