【SilverSQL】第1章～第4章

# リレーショナルデータベースとOracleデータベース
### リレーショナルモデル
* 表形式のデータ構造を用いてデータを管理する仕組み。

### 階層型データベース
* 下位データ(子)は、ただ1つの上位のデータと(親)と関連付けられる。

### ネットワーク型データベース
* 下位データ(子)が、複数の上位のデータと(親)と関連付けられる。

### SQLコマンド
<table>
  <caption>SQLコマンド</caption>
  <thead>
    <tr>
      <th>分類</th>
      <th>コマンド</th>
      <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>データ検索</td>
    <td>SELECT</td>
    <td>表に格納された行の参照</td>
  </tr>
  <tr>
    <td>データ操作言語</td>
    <td>INSERT</td>
    <td>表への行の追加</td>
  </tr>
  <tr>
    <td></td>
    <td>UPDATE</td>
    <td>表に格納された行の更新</td>
  </tr>
  <tr>
    <td></td>
    <td>DELETE</td>
    <td>表に格納された行の削除</td>
  </tr>
  <tr>
    <td></td>
    <td>MERGE</td>
    <td>取得した行を表に更新または追加</td>
  </tr>
  <tr>
    <td>データ定義言語</td>
    <td>CREATE</td>
    <td>オブジェクトの作成</td>
  </tr>
  <tr>
    <td></td>
    <td>DROP</td>
    <td>オブジェクトの削除</td>
  </tr>
  <tr>
    <td></td>
    <td>ALTER</td>
    <td>オブジェクトの定義変更</td>
  </tr>
  <tr>
    <td></td>
    <td>TRUNCATE</td>
    <td>表に格納されたすべての行を一括削除</td>
  </tr>
  <tr>
    <td></td>
    <td>GRANT</td>
    <td>権限付与</td>
  </tr>
  <tr>
    <td></td>
    <td>REVOKE</td>
    <td>権限の取り消し</td>
  </tr>
  <tr>
    <td>トラザクション制御</td>
    <td>COMMIT</td>
    <td>トラザクションの確定</td>
  </tr>
  <tr>
    <td></td>
    <td>ROLLBACK</td>
    <td>トラザクションの取り消し</td>
  </tr>
</table>

### SQL*Plusコマンド
<table>
  <caption>SQL*Plusコマンド</caption>
  <thead>
    <tr>
      <th>コマンド</th>
      <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>DEFINE</td>
    <td>置換変数を設定または確認</td>
  </tr>
  <tr>
    <td>DESCRIBE</td>
    <td>指定した表などのオブジェクトの定義を確認</td>
  </tr>
  <tr>
    <td>EXIT</td>
    <td>SQL*Plusを終了</td>
  </tr>
  <tr>
    <td>SET</td>
    <td>SQL*Plusシステム変数を設定</td>
  </tr>
  <tr>
    <td>SHOW</td>
    <td>SQL*Plusシステム変数の値または現行のSQL*Plus環境を表示</td>
  </tr>
  <tr>
    <td>SHOW PARAMETER</td>
    <td>初期化パラメータの設定値を表示</td>
  </tr>
  <tr>
    <td>UNDEFINE</td>
    <td>置換変数を削除</td>
  </tr>
</table>

* DESCRIBE 表名;または、DESC 表名;
指定した表の「列の名前」「列でNULL値が許可されるかどうか」「列のデータ型・精度」の情報が表示。

# SELECT文の基礎とデータの扱い
### SELECT
* SELECT句に指定された算術式に列別名を指定することはできるが、算術式の中で列別名を使用することはできない。
* 算術式はSELECT句だけではなく、FROM句を除く任意の句で使用できます。
* SELECT文では「射影(投影)」、「選択」、「結合」の3つの機能を使用して表からデータを取得。

　射影(投影)：表から特定の列を取得します。
　選択：表から特定の行を取得します
　結合：複数の表のデータを関連付けて取得します

### 列別名を二重引用符「"」で囲むケース
* スペース（空白文字）を含む
* 「＄」「_」「＃」以外の記号を含む
* 大文字/小文字を区別する
* 最初の文字が数字または記号
* Oracleの予約語

### 連結演算子　||
文字リテラルは、一重引用符「'」で囲む

```
SELECT ename || 'さんの職種は' || job || 'です' FROM emp;
```

### 代用引用メカニズム
* 初めの囲み文字:「q'」と任意の文字
* 終わりの囲み文字:任意の文字と「'」
* 引用符デリミタとして英文字を使用する場合、大文字と小文字は区別されるため、どちらか1つに統一しなければならない。
```
SELECT q'XI'm fine.x' FROM dual;
```

* 文字リテラルの一部に一重引用符(')を使用する場合は、代替引用符q演算子を使用するか、一重引用符を2つ続けて記述します。下記のSQL文はエラー。
```
SELECT 'It's Monday today.' FROM dual;
```

```正しい例
SELECT employee_name || '''s salary is ' || salary FROM employees;
```

### 日付値の特徴
* 日付値は世紀、年、月、日、時、分、秒を表す内部的な数値形式で格納されている。
* 日付値のデフォルトの表示書式は言語環境により異なるが、変更することができる。
* 日付値に対して数値（日数）の加算、減算を行える。また日付値-日付値で2つの日付値間の日数を求める事もできる。ただし、日付値+日付値の演算はできません。

英語環境で、日付の表示書式のデフォルトは「DD-MON-RR」になるので、「29-FEB-12」が返される。

# データの選択（検索）およびソート

### パターン文字列で使用できる特殊文字
<table>
  <caption>パターン文字列で使用できる特殊文字</caption>
  <thead>
    <tr>
      <th>特殊文字</th>
      <th>パターンにマッチする条件</th>
    </tr>
  </thead>
  <tr>
    <td>%（パーセント）</td>
    <td>任意の文字列（空文字を含む）</td>
  </tr>
  <tr>
    <td>_（アンダースコア）</td>
    <td>任意の1文字</td>
  </tr>
</table>

引用符内で特別な意味を持つ文字（ワイルドカードなど）を、通常文字として扱うにはエスケープをおこなう必要がある。
```
WHERE prod_name LIKE '%LED\_%' ESCAPE '\'
```

### 行の並べ替え
NULL値はデフォルトで最も大きい値として扱われます。そのため、降順でソートを行うとソート項目がNULL値である行が必ず先頭に表示されることになります。
ORDER BY句では、昇順、降順にかかわらず、NULL値が含まれる行を先頭に表示するか最後に表示するかを指定することができる。
* NULLS FIRST：NULL値が含まれる行を先頭に表示
* NULLS LAST ：NULL値が含まれる行を最後に表示

```sql
SELECT
 employee_id, 
 employee_name, 
 salary 
FROM
 employees 
ORDER BY salary DESC NULLS LAST;
```

### 置換変数
* &<変数名>または、&&<変数名>
* 置換変数には「&置換変数」と「&&置換変数」の2種類があり、「&置換変数」はSQL文実行後に変数の値が破棄されますが、「&&置換変数」はセッションを切断もしくはUNDEFINEコマンドで破棄するまで値が保持される。

### その他

```sql:例
SELECT
 employee_id,
 employee_name, 
 salary 
FROM 
 employees
ORDER BY salary DESC NULLS LAST
FETCH FIRST 15 PERCENT ROWS ONLY;
```
FETCH句は返される行数、または行の割合を指定して、SELECT文の結果として返される行数を制限します。
FETCH { FIRST | NEXT }
　{ 返される行数 | 返される行の割合 PERCENT }
　{ ROW | ROWS }
　{ ONLY | WITH TIES }

* FIRST, NEXT : 意味を明確にするためのキーワードです。両者に区別はありませんが、FETCH句を指定する場合は省略できない。
* ROW, ROWS : 意味を明確にするためのキーワードです。両者に区別はありませんが、FETCH句を指定する場合は省略できない。
* ONLY : 返される行数、または行の割合に指定したとおりの行数が返す。
* WITH TIES : 最後にフェッチ(取得)された行と同じソートキーの値を持つ全ての行が返されます。ソートキーとはORDER BY句に指定した列のことなので、WITH TIESを指定する場合は、ORDER BY句を指定する必要がある。