オラクル基本の落とし穴 〜ブロンズを笑うものはブロンズに泣くかもしれない〜

雑記帳へ ((゜д゜;))

はじめに
 Bronze(10g)の範囲で「へぇ」と個人的に感じた事項のメモです。 網羅的・体系的な説明は他にサイトがたくさんあると思うのでそちらを参照して下さい。

 ☆SQL編☆
  1. TO_DATE('990101','yymmdd')は現在が21世紀なので2099年1月1日と認識されてしまう。YYではなくRRを指定すると、 現在が2050年未満であれば99年を1999年と認識してくれる。
  2. COUNT(*)は値がNULLの個数も含む。COUNT(列名)はNULLを含まない。また、全てのグループ関数は デフォルトでALLを指定しているため、上記2つの例は重複行も別に数えている。
  3. '〜〜'は日付と文字のリテラル識別だが、q'□〜〜□'でもOK。(□は任意の文字) 「'」自体をリテラルとしたい場合に有効。
     EX: q'[He's my wife]'
  4. グループ関数のネストは2レベルまでしかできない。
  5. DDL文、DCL文が発行されると、その実行前後で自動的にCOMMITが発行される。
    DDL文、DCL文が失敗した場合でもCOMMITが発行されトランザクションは終了する。
  6. DROP TABLE 〜 で索引も削除される。ビューとシノニムは残るが無効。
  7. CREATE TABLE 文でも副問合わせが可能。データのコピーも同時に行ってくれるので便利。
     EX: CREATE TABLE ○×△ AS SELECT 〜〜
    表構造だけコピーしたい場合はSELECT句に「WHERE 1=2」等をつければよい。
  8. ORDER BY では列別名も使用可能だが、GROUP BY では列別名は使用不可。ちなみに、ORDER BY句には式や関数を入れることも可。
  9. FROM句で表別名を指定した場合、SELECT文全体でその別名を使う必要がある。
  10. GROUP BY で指定する列がSELECT句に無くても構わない。 ただし、SELECT句内のグループ関数ではない全ての列がGROUP BY句に含まれる必要がある。 つまりSELECT句で指定できるのは、GROUP BYで集計される列とそうでない列のグループ関数のみ。
  11. 'YYMMDD'では例えば1月は'01'となるが月の部分をfmMMと指定すると '1'と一桁で表示される。fmは前後のゼロや空白を取り除く場合に指定するキーワード。
  12. グループ関数の多くではNULLは除かれる為、含める場合にはAVG(NVL(〜,0))などの工夫が必要。
  13. UNIONで、デフォルトのソート順はSELECT句第一列。UNION ALLの場合デフォルトのソートは無い。
  14. 日付+日付はエラー。日付−日付は日数が返る。日付±数値の場合、数値の単位は日。 よって、一時間後を求めたい場合は日付+1/24
  15. HH12:MI:SS AM とした場合のAMは「午前」という意味ではない。時間が午後だった場合、結果には午後と表示される。 型を指定する場合のAM・PMはどちらも同じ意味で、午前・午後の表示をする、という意味だけ。
  16. ESCAPE '□' とすることでワイルドカードの%や_を文字として扱える。(□は任意の文字)
     EX: LIKE '_んこ\_' ESCAPE '\' →'○んこ_'が条件になります。
  17. Bronzeレベルでのパフォーマンス向上について、
      ・ANSI規格のJOIN等での結合より、WHERE A.XX AND B.XXといったORACLEの結合構文の方が速い。
      ・表名(表別名)の修飾子は、異なる表で列名が同じ場合に必要だが、
       それ以外の場合でも修飾子をつけておくと速くなる。
      ・短い表別名を使うとメモリの消費が減る。
  18. 一意制約・主キー制約を列に定義すると、索引(INDEX)が自動的に作成される。
  19. 索引によって列へのアクセス速度が上がるのは以下の場合である。
      ・列に広範囲の値がある。
      ・NULL値が多い。
      ・WHERE句や結合条件で頻繁に同時に使用される。
      ・表のデータ数が大きく、ほとんどの問合わせで全体の2〜4%しか戻さない場合。
    ※頻繁に更新される表や、索引が付けられた列が式の一部として参照される場合は使わない。 (更新等の負荷が大きくなり逆にパフォーマンスが低下する。)

  20. SQL*Plusのコマンドでよく使うものを挙げておきます。
      (オブジェクトブラウザとかのツールが無いときに重宝。
       他にもたくさんあるのでバッチファイルを作る時等にも便利。)
      @ファイル名 →ファイルの実行。デフォルト拡張子は.sql。
      EDIT(EDと省略可) →エディタを起動しバッファの内容をafiedt.bufという名称で保存。
        また、「EDIT ファイル名」とすればそのファイルをエディタで開く。
      SPOOL ファイル名 [OFF|OUT] (SPOと省略可) →バッファのSQLの問合わせ結果をファイルに保存。
        OFFを指定するとスプールファイルを閉じる。OUTを指定するとプリンタに送信。
      LIST(Lと省略可) →現在のSQLバッファの内容を確認できる。
      SAVE ファイル名 →バッファの内容を保存。拡張子を省略したら.sql。
      GET ファイル名 →バッファに読み込み。
      DESCRIBE 表名 (DESCと省略可) →表構造を教えてくれる。
  21. データディクショナリビューの接頭辞にはそれぞれ以下の意味がある。
      USER- →ユーザの所有するもの。(ユーザのスキーマにあるもの。)
      ALL- →ユーザがアクセスできるもの。
      DBA- →ぜんぶ。
      V$- →パフォーマンス関連。
      EX: ALL_TABLESのビューにはユーザのアクセスできるテーブルの情報が登録されている。

 ―とりあえずここまで―
  
ご意見・ご指摘等ございましたらお願い致します。(雑記帳へ
ホームページへ戻る