2018年以降の記事はGitHub Pagesに移行しました

OracleにおけるWHERE句、BETWEEN句、IN句、LIKE句、ORDER BY句のまとめ

 まずは基本的な句のまとめから。

論理演算子の優先順位

  • NOT > AND > OR

 本当はもっと演算子の優先順位はあるけど、とりあえず引っかかったところだけ。ANDの方がORよりも早いです。

WHERE句

  • 文字、日付は'(シングルクォーテーション)で囲む
  • 文字列の大文字小文字は区別される
  • 日付データのデフォルト値はDD-MON-RR
  • WHERE句では列別名は使えない!
    • ただし、ORDER BY句では使用できる!*1

 例。普通のSQL文です。。

 id列をXYZと名前付けてこいつをWHERE句で使おうとすると…。

 エラーになります。しかし、name列をXYZと名前付けてORDER BY句で使おうとすると…。

 使えます!

BETWEEN '○' AND '△'

 ○〜△で合致するものを探す。こんなテーブルで…

 nameが1から9で合致するものを探す。

 1から2で合致するもの。

*2

name (NOT) IN('AA', 'BB')

 AA、BBいずれかに合致すれば取得します。下図の場合はname列の中からY's IかY's II*3に合致する値を探してくるので、

 こうなります。
 一方、NOTは合致しないものを取得します。Y's IとY's II以外の値を取得します。

name LIKE '%AA%'

 (任意の文字列)AA(任意の文字列)に合致するものを探します。他には_(アンダーバー)があります。
 NAME = '%AA%'のように=で比較してしまうと完全なる%AA%この文字列と合致するものを探します。

name LIKE '%A\_A%' ESCAPE '\'

 (任意の文字列)A_A(任意の文字列)を探したい時にname LIKE '%A_A%'としてしまうと、_はワイルドカードと判断されてしまうのでエスケープ。

name >= 'SQL'

 指定文字よりも文字コードが前のものに合致(?)。SQLは満たすとして、○SQK、○SP、○S、×SQM、×SR、×Tとなります。

name IS (NOT) NULL

 name = NULLではUNKNOWNが返ってくるのでNULLは取得できません。また、値が設定されていないカラムはNULLとされるので、検索するにはIS NULLしかありません。=で比較してしまうと結果は不定となってしまうようです。
 例。id1から5までのtimstaが値なし、つまりNULLとなっています。

 timsta IS NULLでNULLの行を選択すると…。

 逆に、timsta IS NOT NULLでは…。

 では、timsta = NULLだと…。

 なぜ=NULLがダメなのかはリレーショナル・データベースの世界>NULLにまつわる諸問題にとても詳しく書かれています。一回読んだだけじゃふーん…? くらいにしかならなかったけど><

ORDER BY

 SELECT文の最後に記述。ASC(昇順)、DESC(降順)でソート可能。デフォルトはASC。

 ちなみに、1, 2, 3…とかa, b, c…が昇順のはず。昇順と降順が全然覚えられなかった僕です。が!

 階段を1階、2階…と昇るように昇順! これで忘れない!

ソート時のNULLの扱い

 NULLはどうやら∞と見なされるようなので、昇順では1, 2…∞となり最後。降順では∞…2, 1となり最初ということに。

 一応 NULLS [ FIRST | LAST ] というものがあって指定は可能です。

 みたいな感じで。こうすると昇順でもNULLは最初に来るようにできます。

*1:これなんでなんだろう? 処理の順番とか優先順位的なものがあるのかな?

*2:何か、文字列でBETWEEN使ってるシーンをどこかで見た事ある気がするんだけど幻覚かなぁ。

*3:以前使ったシングルクォーテーション重ねと代替引用符を使用しています。