Oracle Master 参考書・問題集の嘘

LONERさん
LONERさん

んーでは簡単なとこからいくよーただし整数に限る・・・はウソ!

単一行関数の SUBSTR なんかには数値を入れるところがあります。

SUBSTR(abcde, 1, 2)

abcde の中の1番目の文字から2文字取り出す関数。
オイラの編み出した うまい覚え方は ここでは伝授しないお。

んで、1 と 2 が入っているところは整数だ! と本に書いてあったりするが、これはウソ。

俺が見たところ、有理数 a を整数で処理すべきところに代入した場合、次の値が引数として使われる。
a [|a|] / |a|

|| は絶対値、[] はガウス記号。
要するに、a の絶対値を超えない最大の整数に、a と同じ符号をつけたものだ。

この式で正しいかどうかはともかく、整数でなくてもおkなのである。

ついでに、単一行関数 LPAD 等についても、本には書かれていないことがある。
LPAD(abc, 20, 'あ')

こういうときはどーなるんですか?

えー、やったけどわすれました。
あと、パディング文字に2文字以上入っている場合とか。
予約語をテーブル名にしたテーブルは作れない・・・はウソ

create table "SELECT" (col1 number);

というSQLを実行してみてください。
正常終了します。

ただし、これを SELECT 文 などで扱うときには注意が必要です。


SELECT は予約語なので、
SELECT * FROM SELECT;
なんてやってもエラーです。

SELECT * FROM "SELECT";
とすればおk。

まぁ、そこまでして使いたくないけどな。

実際、どんなテーブルができているのかというと・・・
USER_OBJECTS を覗いてみまーす。

OBJECT_NAME を見てみると・・・・・・SELECT とあります。
"SELECT" ではないです。(二重引用符は含まない)


OBJECT_NAMEの型は VARCHAR2 なので、これでおkなわけです。

そう、VARCHAR2。ってことは?
select という名前のテーブルも同時に作ることができます。
呼び出すときは二重引用符で囲んでくださいね。

では、ABC というテーブルと、abc というテーブルがあった場合、
select * from abc;
ではどちらが呼び出されるのでしょうか。

ABC が呼び出されます。SQL の中の文字は、全て大文字として扱われるようです。
だから、ABC を削除して、abc だけ存在する状態だと、上のSQL はエラーです。
小文字のヤツを使いたければ二重引用符で囲んでください。

実験はしてないですが・・・数字や特殊文字から始まるテーブルもおkってことじゃね?
USING だと動けなくなることがある!

USING は、2つ以上のテーブルをつなげるときに使います。

それはこ~んな場合に起こります。テーブルを3つ考えてください。列の型は全部 number にします。
table1 :列名は col1, col2
table2 :列名は col1, col2, col3
table3 :列名は col2, col3


ハイ、table1 と table2 を col1 で結合します。
table1 と table3 を col2 で結合します。
使うのは USING。

SELECT * FROM table1
JOIN table2 USING(col1)
JOIN table3 USING(col2);

3行目で「列の定義が未確定です。」と出ます。
col2 は全てのテーブルにあるので、どこかわからないんですよね。
でも USING ですから、修飾子はつけられません。
table1.col2 や table3.col2 とすると、「ここでは修飾された列名は使用できません。」というエラーが出ます。

USING は、保守が面倒のようですね。

こういう細かい仕様的なところは、参考書・問題集にはありません。

Oracle の問題集・参考書は、上に載せた3種類しかないと思っているんですが・・・売ってないからね・・・ほかにもあるよ!という方いらっしゃいましたら是非おしえてください。

安くていいのがあればそっちのほうがいいからね。
LONERさんのブログ一覧