【試験対策】Oracle Silver SQL見直しポイント

本稿ではOracle認定試験の1つであるORACLE MASTER Silver SQL 2019で必要とされる知識のうち,見直すべきポイントをまとめます。

目次

インプット時の引っかかり

列別名を「""」で囲むケース
  • 「$」「_」「#」以外の記号を含む場合
  • スペースを含む場合
  • 大文字・小文字を区別する場合
  • 最初の文字が数字または記号の場合
  • Oracleの予約後の場合
列別名が使える箇所

ORDER BY句のみ

CHAR(n)でnの最大値

2000(n省略時は1)

VARCHAR2(n)でnの最大値

4000(n省略は不可)

DATEとTIMESTAMPの違い
  • DATE:小数秒を含まない
  • TIMESTAMP:小数秒を含む
DATEとTIMESTAMPの書式モデルを指定する初期化パラメータ
  • DATE:NLS_DATE_FORMAT
  • TIMESTAMP:NLS_TIMESTAMP_FORMAT
日付リテラルの精度

DATE 'YYYY-MM-DD' のように指定し,日付までを持って時間指定は00:00:00 となる。

空文字をINSERTするとどうなるか

NULLとして扱われる

NULLとの演算でNULLにならない例

NULLとNULL以外の文字列連結

BFILEは表領域上に格納されるのか

違う。外部ファイルとして扱われ,DB上にはパス情報が格納される。

DESCRIBEコマンドでは各列に定義されている制約は出力されるか

出力されない

DESCRIBEコマンドでは各列のデータ型と精度は出力されるか

出力される

出力されるのは,列の「名前」「NULL?」「型」と覚えましょう。Null?はNull許容かどうかを表します。

DUAL表の列名とその型
  • 列名:DUMMY
  • 型:VARCHAR2
Oracleの文字リテラルを結合する方法

||を利用する。+は利用できない。

SET VERIFYが使えるのはSQL*PLUSとSQL Developerのどちらか

両方とも使える。コマンドラインなのでSQL*PLUSしか使えないと思いきやGUIのSQL Developerでも使える。

SUBSTR(8, 10)はどのような意味か

8文字目から10文字を抜き出す。「8文字目から10文字目」ではないため注意。

INSTR('ABABABAB', 'A', 3, 1)はどのような意味か

'ABABABAB'のうち3文字目から数えて1回目に'A'が出現する位置を返す。

MONTH_BETWEEN(dt1, dt2)はどのような意味か

dt2からdt1までの期間を月単位の数値で戻す。dt1からdt2までではないため注意。DATEの引き算は日単位なのにMONTH_BETWEENは月単位である点にも注意。

DATE + DATEは何を返すか

そもそもDATEの加算はできない。

NVL(pct, 0)とは

pctがNULLの場合は0を返す

NVL2(pct, 10, 0)とは

pctがNULLでない場合は10,NULLの場合は0を返す

NULLIF(A,B)とは

AとBが等しい場合はNULLを返し,等しくない場合はAを返す

WHERE SYSDATE > '2024-01-01'; は正常に動作するか

動作する。比較対象が文字リテラルなので暗黙的な型変換となる。

WHERE SYSDATE > TO_CHAR(SYSDATE, 'YYYY-MM-DD'); は正常に動作するか

動作しない。比較対象が関数の出力なので暗黙的な型変換は起きない。

'10-MAR-2025'は'DD-MON-RR' に該当するか

該当する。RRは4桁でもよい。

pctがNUMBERのときNVL(pct, 'Not exists')はどうなるか

'Not exists'をpctの型,つまりNUMBERに暗黙的に型変換しようとしてエラーになる

pctがNUMBERのときNVL2(pct, pct, 'Not exists')はどうなるか

'Not exists'を2番目の引数の型,つまりNUMBERに暗黙的に型変換しようとしてエラーになる

COUNT(*)とCOUNT(<列名>)の違いは何か
  • COUNT(*):NULLも含める
  • COUNT(<列名>):NULLは含めない
COUNT(DISTINCT *)は何を表すか

エラーが出力される。DISTINCTと*は併用できない。

表に別名をつけたとき,表接頭辞に別名ではなく実際の表名を指定するとエラーになるか

エラーになる

UNIONなどの集合演算で列の型が異なるときに暗黙の型変換は行われるか

行われない

集合演算においてNULL値は無視されるか,無視されないか

無視されない(普通NULLは通常の値とは異なる扱いをされるが例外的に無視されない)

cにデフォルト値を設定した上でINSERT INTO t (a, b, c) VALUES (1, 2); はエラーになるか

エラーになる。列数と値数は揃える必要があり,デフォルトを利用するときもINSERT INTO t (a, b, c) VALUES (1, 2, default); のように明示する必要がある。

マルチテーブルINSERTではリモート表にINSERTできるか

できない

ON句を使わなくてもMERGEできるか

できない。結合ではUSINGやNATURAL JOINを使って結合することができたが,MERGEではUSINGしたとしてもONは必要になる。

MERGE INTO target t
USING source s
ON (t.id = s.id)
WHEN MATCHED THEN
    UPDATE SET t.value = s.value
WHEN NOT MATCHED THEN
    INSERT (id, value)
    VALUES (s.id, s.value);
SQL*PLUSでEXITするとトランザクションはどうなるか

正常にCOMMITされる。

一意性制約を定義すると索引は自動的に作成されるか

作成される

シーケンスをキャッシュしていた場合,インスタンス障害が起きるとどうなるか

キャッシュが消失し,未割り当てのシーケンス値が失われる。キャッシュはシーケンスから一気に割り当てる番号を取ってきて保管しているイメージ。

誰でもパブリックシノニムは作成できるのか

作成できない。CREATE PUBLIC SYNONYMシステム権限が必要。

オブジェクト名では大文字と小文字は区別されるか

「''」で囲うと区別されず,「""」で囲うと区別される。

一意制約をかけた列にNULLは挿入可能か

挿入可能。一意制約のチェック対象外となる。

ALTER TABLE <表名> MOVE TABLESPACE <表領域名>; の弊害は何か

索引が全て作り直しになること

ゴミ箱に入っているTABLEを復元させるコマンド
FLASHBACK TABLE <表名> TO BEFORE DROP;
CREATE TABLE AS SELECTでコピーされる制約は何か

NOT NULL制約のみ

一時表へのDML実行時にUNDOは生成されるか

生成される。軽減されるのはREDO。一時表領域に格納したデータ変更にはREDOが生成されない。

一時表でON COMMIT DELETE ROWSとON COMMIT PRESERVE RROWSの違いを説明せよ
  • ON COMMIT DELETE ROWS:トランザクション終了時に自動的にデータが削除される
  • ON COMMIT PRESERVE RROWS:セッション終了時に自動的にデータが削除される
プライベート一時表のメタデータはどこに格納されるか

セッションのメモリ。永続化されないので,データディクショナリには格納されない。実際のデータはディスク上の一時表領域に格納されるが,あくまでも一時的なデータの保管場所である点に注意する。

ALTER TABLE READ ONLYではDROPもTRUNCATEも禁止されるか

DROPは禁止されず,TRUNCATEは禁止される。DROPはメタデータの削除という扱いに近く,DML操作とみなされないので禁止されないと覚えてしまう。

TRUNCATEとDROPで索引のデータは削除されるが索引定義が保持されるのはどちらか

TRUNCATE。DROPはメタデータ削除なので索引定義は保持されない。

TRUNCATEとDROPでFLASHBACKできる可能性があるのはどちらか

DROP。DROP TABLEによる削除された表はゴミ箱に保管されるため。

TRUNCATEとDROPで索引もあわせて削除されるのはどちらか

DROP

TRUNCATEとDROPでビューが無効化されるのはどちらか

DROP。SELECT権限が消えるのでビューが無効化されると理解する。

未使用化した列はDESCRIBEコマンドで表示されるか

表示されない

外部表には全てのDMLが適用できるか

適用できない。読み取り専用。一時表と混同するな。

外部表のメタデータはデータベースの外部に格納されるか

データディクショナリ,つまり内部に格納される。

外部表の作成時にLinux等のpathを指定することができるか

できない。ディレクトリオブジェクトを作成し,そのオブジェクトを指定する必要がある。

WITH CHECK OPTIONとは

ビュー定義のSELECT文のWHERE句を満たさないような変更を弾くためのオプション。あくまでも変更後のデータが満たすかどうかをチェックするだけなので,DELETEは可能である点に注意する。

INSTEAD OFトリガーとは

DMLを実行できないビューに対し,代わりに実行するDMLを定義するもの。

ユーザとロールにはGRANTオプションを利用してオブジェクト権限を付与できるか

通常のロールには付与できない。PUBLICロールとユーザには付与できる。

WITH ADMIN OPTIONとWITH GRANT OPTIONの違いは何か
  • WITH ADMIN OPTION:システム権限を付与できる権限。付与元の権限削除は付与先の権限に波及しない。
  • WITH GRANT OPTION:オブジェクト権限を付与できる権限。付与元の権限削除が与先の権限に波及する。
TIMEZONE WITH LOCAL TIME ZONEにはタイムゾーンにかかわる情報は含まれるか

含まれない。データベースのタイムゾーンに正規化して格納される。

アウトプット時の引っかかり

列別名はWHERE,GROUP BY,HAVINGで利用できるか

利用できない。列別名でGROUP BYできないのは直感に反するので十分注意する。ORDER BYでは使える。

OracleのDEFAULTで他の列を使いたい場合,どうすればよいか

他の列はそのままDEFAULTには使えないため,BEFORE INSERT等のトリガーを利用する。

外部キー制約の定義時に索引は自動的に作成されるか

作成されない

存在しない表に対してビューは定義できるか

FORCEを使えば定義できる

自分が作成した表に索引を作成するために必要な権限は何か

特になし。デフォルトで作成できる。テーブル作成にはCREATE TABLEシステム権限と表を格納する表領域に対する領域割当て権限が必要となる点に注意。

CURRENT_DATEのタイムゾーン基準はセッションとデータベースのどちらか

セッション

CURRENT_TIMESTAMPのタイムゾーン基準はセッションとデータベースのどちらか

セッション

LOCALTIMESTAMPのタイムゾーン基準はセッションとデータベースのどちらか

セッション

SYSDATEのタイムゾーン基準はセッションとデータベースのどちらか

データベース

SYSTIMESTAMPのタイムゾーン基準はセッションとデータベースのどちらか

データベース

RDBの列を何と呼ぶか

attribute(属性)

ORDER BY empnameという条件は小文字と大文字のどちらで認識されるか

大文字。小文字を扱いたければ「""」を利用する。

SELECT employee_name emp#name FROM empはエラーになるか

ならない。「_」「#」「$」は語頭でない限りオブジェクト名として利用できる。

列別名を「' '」で囲うと何が起きるか

エラーになる

SELECT文の中で文字列として空白を扱いたい場合どうすればよいか

「' '」で囲って文字リテラルとして扱う。「'従業員番号 : '」のような形。

引用符付き文字列のqはQでもよいか

よい

引用符付き文字列のqでデリミタを指定しない場合何が起きるか

エラーが起きる

NULLと文字列を結合したらどうなるか

文字列がそのまま出力される

列別名の語頭に数字は使えるか

使えない

GROUP BYで算術式を利用できるか

利用できる

ORDER BYで算術式を利用できるか

利用できる

WHEREで列別名を使用できるか

できない。これ何度も間違える。

'01-APR-07'の日付書式は何か

DD-MON-RR。RR-MM-DDと間違えた。

= NULLで検索すると何が起きるか

検索結果が1件も表示されない。エラーにはならない。

文字列のソートでは大文字と小文字の扱いはどうなるか

昇順で大文字→小文字とソートされる。

!=は使えるか

使える

^=は使えるか

使える

INSTRは見つからない場合何を返すか

0

SUBSTRの第三引数は何を表すか

抽出する文字数

ROUND(DATE '2025-08-09')の出力は何か

2025-08-09。日付単位の丸め込みなので,それより粒度が1つ細かい時間で丸め込むが,デフォルトで0時となっているのでそのまま。

ROUND(DATE '2025-08-09', 'MONTH')の出力は何か

2025-08-01。月単位の丸め込みなので,それより粒度が1つ細かい日て丸め込む。

INSTR(prod_name, ' ', 1, 2)とは

prod_nameの1文字目から' 'が2回目に出現した位置を返す

TRIM('LED' FROM UPPER(prod_name))は正しいか

正しくない。削除文字がLEDと3文字であるため。1文字でなければいけない。

NEXT_DAYで日曜日は0と1のどちらか

1。0はない。

INITCAP('hello world FROM oracle')の出力を述べよ

Hello World From Oracle

ROUND(9876.54321, -3)の出力を述べよ

10000。負の値の絶対値は0の数になると覚える。今回でいくと,-3なので四捨五入すると10が3付く位置を選ぶので,8で四捨五入して10000となる。結果として0の数が増えただけ。正の値を指定した場合はその数字が結果が小数第何位かを表していたが,負の値の場合は感覚とズレるため注意。0の場合に小数第一位で四捨五入する。

DAYとDYの違い
  • DAY:水曜日(英語の場合固定幅)
  • DY:水(英語の場合3文字)
TO_CHAR('¥500,000.0', 'L999G999D0')のような指定はできるか

できない。第一引数に¥が使えない。

TO_NUMBER('123.456789', '999.999')はエラーになるか

なる。TO_NUMBERは桁数をピッタリ合わせる必要がある。

TO_CHARのPRとは

値が負の値の場合のみ<>で囲んで表示する。例えばTO_CHAR(-123456, '999999PR') は<123456>と表示される。

TO_XX関数をまとめよ
  • TO_CHAR:数値や日付値を文字列に変換する
  • TO_DATE:文字列を日付値に変換する
  • TO_NUMBER:文字列を数値に変換する

基本的に文字列との変換。例外的にTO_CHARの日付値。

RR-MM-DDと30-APR-10は合致するか

合致しない。MMは04となる。

AVG(hiredate)はエラーになるか

エラーになる

HAVINGに列別名を利用できるか

利用できない

副問合せが使えない場所はどこか

一旦GROUP BYと覚える。ORDER BYでは使える。

集合演算子ではデータ型が合っていればデータサイズは違っていてもよいか

よい

TRUNCATEでは索引・制約・トリガーは削除されるか

削除されない

TRUNCATEでは表領域は解放されるか

解放される

動的パフォーマンス・ビューの接頭語とパブリックシノニムの接頭語
  • 動的パフォーマンス・ビュー:V_$
  • パブリックシノニム:V$
CREATE ROLEにより作られたロールの所有者は誰になるか

ロールに所有者という概念は存在しない

ユーザに対してロールを付与した後にロールから権限を削除するとどうなるか

権限は残り続ける。AWSの帽子的な思想ではなく,初回のGRANTでrole分の権限が付くイメージ。

オブジェクトが削除されるとオブジェクト権限は削除されるか

削除される

ロールとシステム権限は同時に付与できるか

できる

ロールとオブジェクト権限は同時に付与できる

できない

ビューには索引を作成できるか

作成できない

test_viewというビューを削除するSQL文

DROP VIEW test_view

自動的に作成された一意索引は削除できるか

削除できない

DROP SYNONYMはpublicシノニムとprivateシノニムのどちらを削除するか

privateシノニム

降順indexはファンクションとして扱われるが昇順indexはファンクションとして扱われるか

扱われない

CREATE PRIVATE SYNONYMというSQLは存在するか

存在しない

ROWIDとは何か

物理的な格納場所

索引は作成後に変更できるか

できない

ALTER TABLEでDEFAULT値を指定した新規カラムを追加すると既存のレコードはどうなるか

DEFAULT値で埋まる

シェアはこちらからお願いします!

コメント

コメントする

※ Please enter your comments in Japanese to distinguish from spam.

目次