本稿では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値で埋まる
コメント