データの制限およびソート

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

# 問い合わせで取得する行の制限

## WHERE句を使用した行の制限

SELECT文に**WHERE句**を指定すると、取り出す対象を**指定した条件を満たす行**に制限できる。
なお、SELECT文のWHERE句は、必ずFROM句の後に指定する。

WHERE句を使用したSELECT文

|  |  |
|:--|:--|
| SELECT | 列名 |
| FROM | 表名 |
| WHERE | 条件; |

条件は、比較演算子、列名、定数、値のリスト、および式で構成され、**列別名は指定できない**。
また、WHERE句の条件の指定が文字リテラルの場合は、**大文字・小文字が区別され**、日付リテラルの場合は**日付書式**が区別される。

## BETWEEN演算子を使用した条件の指定

BETWEEN演算子を使用すると、**範囲を指定した条件**を使用できる。

指定方法

- WHERE　列名　BETWEEN　下限値　AND　上限値
- WHERE　列名　NOT　BETWEEN　下限値　AND　上限値

BETWEENを指定した場合は列値が**下限値以上かつ上限値以下**の場合選択され、NOT　BETWEENを指定した場合は、列値が**下限値よりも小さい、または上限値よりも大きい**場合選択される。

## IN演算子を使用した条件の指定

IN演算子を使用すると、**列値と複数の値を比較する条件**を指定できる。
INを指定した場合は列値が**指定した値のいずれかと等しい**場合に選択され、NOT INを指定した場合は列値が**指定した値の全てと等しくない**場合に選択される。

## LIKE演算子を使用した条件の指定

LIKE演算子を使用すると、**指定した文字パターンに一致する行**を取り出すことができる。
LIKEを指定した場合は列値が**文字パターンに一致する**場合に選択され、NOT LIKEを指定した場合は列値が**文字パターンに一致しない**場合に選択される。

LIKE演算子の文字パターンには、以下の**ワイルドカード**（任意の文字と一致する特殊な文字）を含む文字列を指定できる（**組み合わせ可**）。

| ワイルドカード | 説明 |
|:-:|:--|
| % | 0文字以上の任意の文字列と一致する |
| _ | 任意の1文字と一致する（**文字の全角・半角は区別されない**） |

ワイルドカードを含む文字列を指定する場合には、**ESCAPEオプション**を指定して%や_を文字リテラルとして扱うように指定する必要がある。
エスケープ文字には**任意の1バイトの文字**を指定でき、文字パターンに含まれるエスケープ文字の直後のワイルドカードは文字リテラルとして扱われる。

## IS NULL演算子を使用した条件の指定

IS NULLを指定した場合は列に**NULL値が含まれる**場合選択され、IS NOT NULLがを指定した場合は列に**NULL値が含まれない**場合選択される。

列にNULL値が含まれるかどうかは**上記の方法でしか評価できず**、等号や不等号では比較できない。
等号を使用してNULL値との比較をした場合、データは1行も取り出されず**エラーにもならない**。

# 論理演算子による条件の指定

- **AND演算子**は**前後にある条件が両方ともTRUE**の場合TRUEになる。
- **OR演算子**は**前後にある条件のどちらかがTRUE**の場合TRUEになる。
- **NOT演算子**は**後ろに指定した条件がFALSE**の場合TRUEになる。

WHERE句に複数の条件を指定した場合、各条件は**演算子の優先順位**に従って順番に評価される。
ただし、**（）**を使用して優先順位を変更することもできる。

| 優先順位 | 演算子 |
|:-:|:--|
| 1 | 算術演算子(*, /, +, -) |
| 2 | 連結演算子(｜｜) |
| 3 | 比較演算子(=, >, <, >=, <=) |
| 4 | IN演算子,LIKE演算子,IS NULL演算子 |
| 5 | BETWEEN演算子 |
| 6 | 等しくない(<>, !=, ^=) |
| 7 | NOT演算子 |
| 8 | AND演算子 |
| 9 | OR演算子 |

OR演算子を使用した複数の条件は、IN演算子を使用して置き換えられる場合がある。
IN演算子を使用した条件のほうが、より分かりやすい簡潔な指定になるが**実行時のパフォーマンスは変わらない**。

# SELECT文で取り出す行のソート

## ORDER BY句を使用した行のソート

特定の列の値に基づいてソートしたデータを取り出したい場合は、**ORDER BY句**を**SELECT文の最後**に指定します。

ORDER BY句を使用したSELECT文

|  |  |
|:--|:-:|
| SELECT | 列名 |
| FROM | 表名 |
| WHERE | 条件 |
| ORDER BY | 列名; |

ORDER BY句には、列名の他に式や列の位置、列別名を指定できる。
また、列ごとにソートの基準を**ASC（昇順）**、または**DESC（降順）**のいずれかに指定できる（**デフォルトはASC**）

ソートの順序は**データの種類（データ型）**によって異なり、昇順の場合の各データのソート順序は以下のようになる。
ただし、NULL値はいずれの場合も、デフォルトでは**最も大きい値**として扱われる。

昇順のソート順序

| データ型 | 説明 |
|:-:|:--|
| 数値 | 小さい数値から大きい数値 |
| 日付値 | 古い日付から新しい日付 |
| 文字値 | アルファベット順、続いて50音順 |
| NULL値 | 最も大きい値として扱われる |

NULL値のソート順を制御したい場合は、OREDE BY句に**NULLS FIRST（最初）**または**NULLS LAST（最後）**キーワードを指定する。
なお、これらを指定した場合は、昇順・降順にかかわらず、NULL値を含むデータは指定した順に取り出される。

## いろいろなソート

ORDER BY句に指定する列は、SELECT句に指定されていない列でも構わないが、実行結果にソートの基準となった列が表示されないので結果が分かりにくくなる。
その為、通常ではあまり使用しないが**エラーにはならない**。

ORDER BY句では、**複数の列**を指定してデータをソートすることができ、その場合は**左側に指定した列から順番**にソートされる。
まず１つ目に指定した列でソートされ、その列の値が同じ行のグループが２つ目に指定した列でソートされる。
また、**昇順・降順の指定は列ごと**に行える。

## SQL行制限

Oracle 12cで新たに、**SELECT文の結果（結果セット）として戻される行の数を制限する機能**が追加された。

SELECT文の結果として戻される行の数を制限するには、**row_limiting_clause**を記述する。
row_limitng_clauseにはOFFSET句とFETCH句があり、**ORDER BY句を指定する場合はORDER BY句の後ろ**に記述する。

OFFSET句とFETCH句

| 種類 | 説明 |
|:-:|:--|
| OFFSET句 | **スキップする行数**を指定する。<br>OFSET句を省略するとスキップする行数が０になる為、行制限の開始が最初の行になる。 |
| FETCH句 | **返される行数**または**行の割合**を指定する。<br>FETCH句を省略するとOFFSET句に指定されている行数の次から始まるすべての行が返される。 |

OFFSET句の指定

| キーワード | 説明 |
|:-:|:--|
| OFFSET | OFFSET句を開始するキーワード |
| offset |  スキップする行数を**数値**で指定する。<br>問い合わせから返される行数以上の数値を指定した場合や、NULLを指定した場合は、一行も返されない。 |
| ROWまたはROWS | 意味を明確にするためのキーワードで、ROWとROWSは**同じ意味**となる。<br>OFFSET句が指定されている場合は**省略不可**。 |

FETCH句の指定

| キーワード | 説明 |
|:-:|:--|
| FETCH | FETCH句を開始するキーワード。 |
| FIRSTまたはNEXT | 意味を明確にするためのキーワードで、FIRSTとNEXTは**同じ意味**となる。<br>FETCH句が指定されている場合は**省略不可**。 |
| row_countまたはpercent PERCENT | **返される行数**（row_count）または**返される行の割合**（percent PERCENT）を指定する。<br>row_countおよびpercentには**数値**を指定する。<br>percent PERCENTには、選択された行の合計数の内返される行数の割合を指定する。 |
| ROWまたはROWS | 意味を明確にするためのキーワードで、ROWとROWSは**同じ意味**となる。<br>FETCH句が指定されている場合は**省略不可** |
| ONLYまたはWITH TIES | **ONLY**を指定すると、row_countまたはpercent PERCENTに指定された行数が**正確に**返される。<br>**WITH TIES**を指定すると、row_countまたはpercent PERCENTに指定された行数の**最後の行と同じソートキーの行までが返される**。<br>WITH TIESを指定する場合は、**ORDER BY句の指定が必要**で、ORDER BY句が指定されていない場合追加の行は表示されない。 |