DB関係の記事を読んだメモ

Oracleをベースに書いている記事だけど、要点だけメモ。

http://itpro.nikkeibp.co.jp/article/COLUMN/20061205/255978/?ST=middleware

Where句その優先順位は高い方から,NOT,AND,ORの順になる
where A or B and Cは、B and Cしてから orされる。
A or Bを優先したい場合は、where (A or B) and C


VARCHAR2型は可変長
VARCHAR2型には,「データを更新するとデータの格納状態が悪化する可能性が高い」という欠点がある。
更新後の文字列が更新前の文字列よりも長い場合,更新前に使っていたディスク領域に文字列を格納することができない。
同じデータ・ブロック*に空きがあればそこを利用するが,それでも格納できない場合,ほかのデータ・ブロックにデータを格納する。
これはディスクI/Oを増加することになり,パフォーマンスの低下を招く。
文字列の長さがある程度そろう場合や,更新の可能性があって,かつ,最大文字数が決めやすい場合には固定長のCHAR型が適する。
例えば住所などは変更が発生しやすく最大文字数が決めやすいのでCHAR型にすべきだろう。
一方,格納する文字列の長さがばらばらだったり,参照することがメインで更新が少ない場合には,可変長のVARCHAR2型が適する。営業日報の自由報告欄などが,その典型的な例である。


CHAR型とVARCHAR2型を比較する場合,CHAR型に自動的に挿入される空白文字が正しい判定を妨げている。
正しく比較するには,CHAR型の空白文字を取り除いて比較する必要がある。
空白文字を取り除くには,TRIM 関数*を使えばよい。TRIM関数の引数にCHAR型のデータを指定し,その戻り値とVARCHAR2型を比較する。


NULL値は,数値や文字と比較することができないため,ソート対象から外され,ソート結果の最後に並べられる
例えば文字列長さを返すLENGTH関数*の引数がNULL値であった場合,その戻り値は0ではなく,NULLになる。


合計値計算や最大値,最小値の関数ではNULL値があってもなくても結果は変わらないが,平均値(AVG)とレコード数の算出(COUNT)の場合はNULLの有無で結果が変わる。