現在勉強しているオラクルマスターブロンズ(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句では、複数の列を指定してデータをソートすることができ、その場合は左側に指定した列から順番にソートされる。
まず1つ目に指定した列でソートされ、その列の値が同じ行のグループが2つ目に指定した列でソートされる。
また、昇順・降順の指定は列ごとに行える。
SQL行制限
Oracle 12cで新たに、SELECT文の結果(結果セット)として戻される行の数を制限する機能が追加された。
SELECT文の結果として戻される行の数を制限するには、row_limiting_clauseを記述する。
row_limitng_clauseにはOFFSET句とFETCH句があり、ORDER BY句を指定する場合はORDER BY句の後ろに記述する。
OFFSET句とFETCH句
種類 | 説明 |
---|---|
OFFSET句 |
スキップする行数を指定する。 OFSET句を省略するとスキップする行数が0になる為、行制限の開始が最初の行になる。 |
FETCH句 |
返される行数または行の割合を指定する。 FETCH句を省略するとOFFSET句に指定されている行数の次から始まるすべての行が返される。 |
OFFSET句の指定
キーワード | 説明 |
---|---|
OFFSET | OFFSET句を開始するキーワード |
offset | スキップする行数を数値で指定する。 問い合わせから返される行数以上の数値を指定した場合や、NULLを指定した場合は、一行も返されない。 |
ROWまたはROWS | 意味を明確にするためのキーワードで、ROWとROWSは同じ意味となる。 OFFSET句が指定されている場合は省略不可。 |
FETCH句の指定
キーワード | 説明 |
---|---|
FETCH | FETCH句を開始するキーワード。 |
FIRSTまたはNEXT | 意味を明確にするためのキーワードで、FIRSTとNEXTは同じ意味となる。 FETCH句が指定されている場合は省略不可。 |
row_countまたはpercent PERCENT |
返される行数(row_count)または返される行の割合(percent PERCENT)を指定する。 row_countおよびpercentには数値を指定する。 percent PERCENTには、選択された行の合計数の内返される行数の割合を指定する。 |
ROWまたはROWS | 意味を明確にするためのキーワードで、ROWとROWSは同じ意味となる。 FETCH句が指定されている場合は省略不可 |
ONLYまたはWITH TIES |
ONLYを指定すると、row_countまたはpercent PERCENTに指定された行数が正確に返される。 WITH TIESを指定すると、row_countまたはpercent PERCENTに指定された行数の最後の行と同じソートキーの行までが返される。 WITH TIESを指定する場合は、ORDER BY句の指定が必要で、ORDER BY句が指定されていない場合追加の行は表示されない。 |