[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] 以前使ったシングルクォーテーション重ねと代替引用符を使用しています。