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

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

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

論理演算子の優先順位

  • NOT > AND > OR

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

WHERE句

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

 例。普通のSQL文です。。

[f:id:kk_Ataka:20091106011618p:image]

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

[f:id:kk_Ataka:20091106011755p:image]

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

[f:id:kk_Ataka:20091106011756p:image]

 使えます!

BETWEEN ‘○’ AND ‘△’

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

[f:id:kk_Ataka:20091106010119p:image]

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

[f:id:kk_Ataka:20091106010120p:image]

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

[f:id:kk_Ataka:20091106010121p:image]

[2]

name (NOT) IN(‘AA’, ‘BB’)

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

[f:id:kk_Ataka:20091116003449j:image]

 こうなります。

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

[f:id:kk_Ataka:20091116003450j:image]

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となっています。

[f:id:kk_Ataka:20091116001633j:image]

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

[f:id:kk_Ataka:20091116001634j:image]

 逆に、timsta IS NOT NULLでは…。

[f:id:kk_Ataka:20091116001636j:image]

 では、timsta = NULLだと…。

[f:id:kk_Ataka:20091116001635j:image]

 なぜ=NULLがダメなのかはhttp://www.geocities.jp/mickindex/database/idx_database.html:title>NULLにまつわる諸問題にとても詳しく書かれています。一回読んだだけじゃふーん…? くらいにしかならなかったけど><

ORDER BY

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

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

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

ソート時のNULLの扱い

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

[f:id:kk_Ataka:20091116003451j:image]

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

[f:id:kk_Ataka:20091116003452j:image]

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

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

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

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