【ORACLE MASTER Silver SQL】(1Z0-071-JPN)の試験対策用の個人的な忘備録として、暗記事項をまとめました。
章の構成は『試験公式ページ』の出題範囲に依拠しています。
- 第1章:リレーショナル・データベースの概要
- 第2章:SQL SELECT 文を使用したデータの取得
- 第3章:データの制限とソート
- 第4章:単一行関数を使用した出力のカスタマイズ
- 第5章:変換関数と条件式の使用
- 第6章:グループ関数を使用した集計データのレポート
- 第7章:複数の表からのデータの表示
- 第8章:副問合せを使用した問合せの解決
- 第9章:集合演算子の使用
- 第10章:DML 文を使用した表の管理
- 第11章:DDL による表とその関係の管理
- 第12章:ビューの管理
- 第13章:索引とシノニムとシーケンスの管理
- 第14章:ユーザー・アクセスの制御
- 第15章:データ・ディクショナリ・ビューを使用したオブジェクトの管理
- 第16章:異なるタイムゾーンでのデータの管理
- 参考文献
第1章:リレーショナル・データベースの概要
DBMSの利点
- DBMS(データベース管理システム)を使うと以下の様なメリットを得られる
- 大量のデータを複数のユーザで利用でき、データを高速で参照・変更ができる
- データ型・トランザクション機能・整合性制約により、データの高い整合性を維持できる
- データが破損した場合速やかに復旧できる
- ユーザ単位でアクセスと操作権限の制御ができる
SQLを実行するツール
- Oracleの実行ツールには、SQL*PlusとOracle SQL Developerがある
- SQL*Plusはコマンドラインベースのツール
- ターミナル・コマンドプロンプト上で実行する
- SQLに加えて専用のコマンドを実行できる
- Oracle SQL DeveloperはGUIベースのツール
オブジェクト
- オブジェクトとは表などのデータを管理するものをオブジェクトと呼ぶ
- Oracleでは主に以下のオブジェクトが使われる
オブジェクト名 | 内容 |
---|---|
表 | データを格納する |
ビュー(view) | SELECT文に名前を付け保存したもの |
シーケンス | 一意である数値(連番など)を生成する |
索引 | 表からのデータの読み取りを高速化するもの |
シノニム | オブジェクトの別名を定義できる |
セグメント・表領域
- セグメントとは記憶域のこと
- 表などのデータを持つオブジェクトには、セグメントが1対1で対応している
- セグメントは表領域に格納される
- 1つの表領域は複数のセグメントを格納できる
スキーマ
- スキーマとはユーザと1対1で対応するもので、オブジェクトが格納されている
- スキーマには同名のユーザが所有しているオブジェクトが入っている
初期化パラメータ
- 初期化パラメータはメモリサイズや各機能のオンオフ等の設定値
ALTER SESSION SET
文で初期化パラメータをセッションレベルで変更できる
ALTER SESSION SET <パラメータ名> = <設定値>;
第2章:SQL SELECT 文を使用したデータの取得
列別名
- 列名の後に列別名を指定できる
- 列別名の前の
AS
は省略できる - 列別名を
"
(2重引用符)で囲む必要があるのは列別名が以下の場合- 空白を含む
$
・_
・#
以外の記号を含む- 大文字・小文字を区別する
- 最初の文字が数字・記号を含む
- Oracleの予約語
データ型
- 列にはデータ型が指定され、データ型に対応するデータしか格納できない
- 主なデータ型は以下
データ型名 | 内容 |
---|---|
NUMBER | 整数と小数 NUMBER(n) n桁の整数(n:1~38) NUMBER(n,m) 最大桁数n、小数点以下の最大桁数mの整数・小数 |
CHAR(n) | サイズがnバイト固定長の文字列(n:1~2000) nは省略可能(省略時は1) n未満の文字列を入れた場合、空白埋めされる |
VARCHAR2(n) | 最大サイズがnバイトの文字列(n:1~4000) nの指定必須 |
BLOB | 最大128テラバイトのバイナリデータ |
CLOB | 最大128テラバイトの文字列 |
DATE | 日付と時刻(小数秒を含まない) 年・月・日・時・分・秒を格納できる |
TIMESTAMP | 日付と時刻(小数秒を含む) 年・月・日・時・分・秒・小数秒を格納できる |
TIMESTAMP WITH TIME ZONE | 日付と時刻(小数秒を含む)とタイムゾーン情報 |
TIMESTAMP WITH LOCAL TIME ZONE | 正規化された日付と時刻(小数秒を含む) |
INTERVAL YEAR TO MONTH | 年月の時間間隔 |
INTERVAL DAY TO SECOND | 日時分秒の時間間隔 |
DESCRIBEコマンド
DESCRIBE
コマンドで表の構造を確認できる- コマンドは
DESC
と短縮可能 - コマンドで確認できる要素は以下
列名 | 内容 |
---|---|
名前 | 表にある列名 |
NULL? | 空白の場合NULLが入力できる NOT NULLの場合NULLが入力できない |
型 | データ型と文字サイズ・数値の精度 |
文字リテラル
'
(1重引用符)で文字列を囲むと文字リテラルとなり、文字列そのものを指定できる- 文字リテラル内で1重引用符を使用したい場合は1重引用符を2つ続けて記述するか、代替引用メカニズムを使う
- 代替引用メカニズムは「
q'
と任意の文字」「任意の文字と'
」で囲む
- 代替引用メカニズムは「
NULL
- 列に値を設定せずに追加・更新すると
NULL
が設定される - 空文字は
NULL
として扱われる NULL
を含む計算式はNULL
として扱われるNULL
と「指定した文字列」を連結すると指定した文字列が返される
DISTINCT
SELECT
の直後にDISTINCT
を記述すると重複データを除外できる- それ以外の場所には指定できない
第3章:データの制限とソート
条件式
- 条件式には列別名を指定できない
条件の評価順序
- 条件の評価順序は以下になる(上にあるものが優先される)
=
・!=
・<
・>
・<=
・>=
IS NULL
・LIKE
・BETWEEN
・IN
・EXISTS
NOT
AND
OR
()
で囲むと順序が優先される
ORDER BY句
ASC
(昇順)・DESC
(降順)省略時は昇順になるASC
(昇順)を指定すると、文字列はアルファベット順、日時は古い→新しい順でソートされる
置換変数
- 置換変数を使うことでSQL文の一部を変えたものを繰り返して実行できる
&<変数>
を使うと毎回変数の値入力が必要&&<変数>
を使うと変数の値が保存され繰り返し使える
DEFINE
コマンドでSQL実行前に置換変数を値を設定できる- 置換変数の処理前後を非表示にするには変数
VERIFY
をOFF
にする
第4章:単一行関数を使用した出力のカスタマイズ
文字列を受け取るファンクション(引数:文字列)
UPPER・LOWER・INITCAPファンクション
- アルファベットの大文字・小文字を変更するファンクションは
UPPER
・LOWER
・INITCAP
があるINITCAP
ファンクションは先頭文字を大文字、それ以降を小文字にする
SUBSTRファンクション
- 文字列から文字を抜き出す
SUBSTR(<文字列STR>,<開始位置N>,<長さL>) --STRの先頭N文字目からL文字を抜き出す
--lを省略したら最後まで抜き出す
SUBSTR('ABCDE',2) --BCDE
SUBSTR('ABCDE',-2) --DE マイナスは開始位置を後ろから数える
SUBSTR('ABCDE',2,3) --BCD
REPLACEファンクション
- 文字列を置換する
REPLACE(<文字列STR>,<開始位置N>,<長さL>) --STRの先頭N文字目からL文字を抜き出す
--lを省略したら最後まで抜き出す
SUBSTR('ABCDE',2) --BCDE
SUBSTR('ABCDE',-2) --DE マイナスは開始位置を後ろから数える
SUBSTR('ABCDE',2,3) --BCD
LPAD・RPADファンクション
- 文字列に文字を埋め込む(0埋めなど)
LPAD(<文字列STR>,<長さL>,<文字列PAD>) --STRの左側に、長さがLになるようにPADを埋め込む
--PADを省略したら空白が埋め込まれる
LPAD('AB',5,'0') --000AB
LPAD('AB',5) -- AB
RPAD(<文字列STR>,<長さL>,<文字列PAD>) --STRの右側に、長さがLになるようにPADを埋め込む
--PADを省略したら空白が埋め込まれる
RPAD('AB',5,'0') --AB000
TRIMファンクション
- 文字列の前後から指定の文字を削除する
- 指定する文字は1つのみ(複数はエラー)
TRIM(<文字CHAR FROM> <文字列STR>) --STRの先頭と末尾から連続した文字CHARを削除
--<文字CHAR FROM>を省略した場合は前後の空白文字を削除
TRIM(' AB ') --AB
TRIM('A' FROM 'ABA') --B
TRIM(<LEADING | TRAILING | BOTH> <文字CHAR FROM> <文字列STR>)
--LEADINGを指定した場合STRの先頭の文字CHARを削除
--TRAILINGを指定した場合STRの末尾の文字CHARを削除
--BOTHを指定した場合STRの先頭・末尾の文字CHARを削除
--<文字CHAR FROM>を省略した場合は前後の空白文字を削除
TRIM(LEADING '*' FROM '**AB**') --AB**
TRIM(TRAILING '*' FROM '**AB**') --**AB
TRIM(BOTH '*' FROM '**AB**') --AB
数値を受け取るファンクション
INSTRファンクション
- 指定した文字列の出現した位置を返す
INSTR(<文字列STR>, <文字列SEARCH>, <場所POS>, <回数N>)
--文字列STRのPOS文字目から文字列SEARCHを検索、N回目に出現する位置を返す
--POSとNを省略した場合は1となる
--SEARCHが無い場合0が戻る
INSTR('ABCDE', 'C') --3
INSTR('ABCDEABCDE', 'C', 6, 1) --8(6文字目から数えて1回目に出現する位置)
ROUNDファンクション
- 数値を四捨五入する
ROUND(<数値N>, <桁INT>) --数値Nを小数点以下INT桁で四捨五入
--INTが負の時は小数点左側INT桁で四捨五入
--INTを省略した時は0扱いになり整数で四捨五入
ROUND(15.555) --16
ROUND(15.555, 1) --15.6
ROUND(15.555, -1) --20
TRUNCファンクション
- 数値を切り捨てる
日時の計算・日時ファンクション
日時データの計算
- 日時データの計算の挙動は以下の表の通りになる
- 日時+日時の計算はエラーになる
計算式 | 内容 | 戻り値 |
---|---|---|
日時 + 数値 | 日時に日数(数値分)が足される | 日時 |
日時 – 数値 | 日時から日数(数値分)が引かれる | 日時 |
日時 – 日時 | 日時間の日数が戻される | 数値 |
NEXT_DAYファンクション
- 指定した日付の後に来る、指定した曜日の日付を返す
NEXT_DAY(<日付DATE>, <曜日STR>) --日付DATEの後に来るSTRに指定した曜日で最初の日付を返す
NEXT_DAY(<日付DATE>, <曜日NUM>) --日付DATEの後に来るNUMに指定した曜日で最初の日付を返す
--数値NUMは、1:日、2:月、3:火…のように定義される
第5章:変換関数と条件式の使用
データ型の変換
- データ型の変換については明示的な変換(ファンクションを使用して型を変換を指定する)と暗黙的な変換(Oracleが自動的に型を変換する)がある
- 暗黙的な変換は意図しない挙動になることがあるため明示的な変換が推奨される
ファンクション | 変換内容 |
---|---|
TO_CHAR | 数値型・日時型→文字型 |
TO_NUMBER | 文字型→数値型 |
TO_DATE | 文字型→日時型 |
NULLに関するファンクション
NVLファンクション
NULL
を指定した値に置き換える
NVL(<入力IN>, <出力OUT>)
--INがNULL以外の場合INをそのまま戻す
--INがNULLの場合OUTを戻す(INとOUTの型が異なる場合は暗黙的な変換が行われる)
NVL2ファンクション
- 入力が
NULL
かNULL
以外かで指定した値に置き換える
NVL2(<入力IN>, <出力OUT1>, <出力OUT2>)
--INがNULL以外の場合OUT1を戻す
--INがNULLの場合OUT2を戻す(INとOUTの型が異なる場合は暗黙的な変換が行われる)
NULLIFファンクション
- 2つの引数の値が等しい時に
NULL
を戻す- 等しくない時は1つ目の引数の値をそのまま戻す
- 2つの引数のデータ型は一致している必要がある
COALESCEファンクション
- 複数の値から最初にある
NULL
でない値を返す- 引数のデータ型は全て一致している必要がある
COALESCE(<入力IN1>, <入力IN2>, ....) --入力の中から最初の非NULL値を返す
--全てNULLの時はNULLを返す
第6章:グループ関数を使用した集計データのレポート
集計ファンクション
- 複数のデータを集計するときは集計ファンクションを使用する
ファンクション | 集計内容 |
---|---|
SUM | 合計値を返す |
AVG | 平均値を返す |
MAX | 最大値を返す |
MIN | 最小値を返す |
COUNT | 行数を返す |
- 集計ファンクションは返り値のデータは1件になる
NULL
は集計の対象外になるCOUNT(*)
ではNULL
もカウントの対象になるCOUNT(<列名>)
の時は列がNULL
の時は集計の対象外になる
DISTINCT
を集計ファンクションに指定すると、重複データを排除してから集計処理を行う- 例:
AVG(DISTINCT <列名>)
- 例:
GROUP BY句とHAVING句
- データをグループに分けてからそれぞれ集計したい時は
GROUP BY
句にグループ分けしたい列を指定するWHERE
句で絞ってからグループ分けできる(グループ分けの前に絞り込みされる)GROUP BY
句に複数の列を指定した場合列の組み合わせでグループ分けされる- 集計ファンクションをネストすることで、グループごとに集計したデータをさらに集計できる
HAVING
句を使うとグループ分けし集計した後にデータの絞り込みができる
第7章:複数の表からのデータの表示
内部結合
- 複数の表からデータを結合(
JOIN
)することができる - 内部結合では結合条件(
ON
句)を満たすデータのみ表示する
外部結合
- 外部結合では結合条件を満たさないデータも表示される
外部結合 | 結合条件を満たさなくても表示される表 |
---|---|
左外部結合 | 結合条件の左側の表 |
右外部結合 | 結合条件の右側の表 |
完全外部結合 | 結合条件の両方の表 |
USING句
- 2つの表を同じ名前で結合する時は
USING
句が使用できる
NATURAL JOIN構文
- 列の名前とデータ型が同じ場合
NATURAL JOIN
を使用できる
自己結合
- 同じ表を結合することもでき、自己結合と呼ばれる
クロス結合
- クロス結合(デカルト積)では行の全ての組み合わせを返す
- 表名を指定する時に
CROSS JOIN
か,
を指定する
- 表名を指定する時に
非等価結合
- 結合に
=
以外の条件を使用した結合は非等価結合と呼ばれる USING
とNATURAL JOIN
を用いた結合では非等価結合はできない
第8章:副問合せを使用した問合せの解決
副問合せ
- SQL文の中にSELECT文を埋めることができ、そのSELECT文を副問合せ(サブクエリ)と呼ぶ
- 副問合せを埋め込んだSQL文を主問合せと呼ぶ
- 1つの主問合せに埋め込める副問合せの数に制限は無く、副問合せの中に副問合せを埋め込むことも可能
スカラー副問合せ
- 「1つの行の1つの列の値」を戻す副問合せをスカラー副問合せと呼ぶ
- スカラー副問合せは
SELECT
文のWHERE
句だけではなく、FROM
句やHAVING
句などの単独の値を指定できる所ならどこでも使える - スカラー副問合せでは複数の行・列の値を返す場合はエラーになる
- スカラー副問合せのWHERE条件を満たす行がない時は
NULL
を返す
非スカラー副問合せ
- 「1つの行の1つの列の値以外」を戻す副問合せを非スカラー副問合せと呼ぶ
IN
条件を指定すると複数の値のいずれかに等しい時条件を満たすANY
条件を指定すると複数の値のいずれかが指定した演算子を満たす場合に条件を満たす=
、!=
、>
、>=
、<
、<=
、<>
を指定できる
ALL
条件を指定すると複数の値の全てが指定した演算子を満たす場合に条件を満たす- 指定できる演算子は
ANY
条件と同じ
- 指定できる演算子は
相関副問合せ
- 副問合せの中で「主問合せで参照している表の列」を参照している問合せを相関副問合せと呼ぶ
- 相関副問合せでは主問合せと副問合せが関連付けられているので、副問合せのSQLを単独で実行はできない
- 相関副問合せの内、主問合せと副問合せで同じ表を参照するものを自己相関副問合せと呼ぶ
第9章:集合演算子の使用
集合演算
- SQLでは問合せによって戻されるデータを1つの集合として扱うことで集合演算が可能
- 集合演算子は以下の4つ
集合演算子名 | 内容 |
---|---|
UNION ALL | 和集合(問合せの行を足したもの・重複行を含む)を返す |
UNION | 和集合(重複行を含まない)を返す |
INTERSECT | 積集合(問合せの行で共通するもの)を返す |
MINUS | 差集合(最初の問合せにしか含まれていないもの)を返す |
集合演算の注意事項
SELECT
の列数・データ型を一致させるSELECT
の列名は異なっても良いORDER BY
句は文の最後に指定するUNION ALL
以外の集合演算では戻るデータがソートされる(最初の列の昇順)
第10章:DML 文を使用した表の管理
DML
- DML(表のデータを操作するSQL)には
INSERT
文、UPDATE
文、DELETE
文、MERGE
文などがある
マルチテーブルINSERT
- マルチテーブルINSERTでは副問合せが戻す複数行を複数表の行へ挿入できる
マルチテーブルINSERTの種類 | 内容 |
---|---|
無条件 INSERT | 副問合せから戻された行がINTO句で指定された全ての表に挿入される |
条件付き INSERT ALL | 副問合せから戻された行がWHEN句の条件を満たすものの全ての表に挿入される |
条件付き INSERT FIRST | 副問合せから戻された行がWHEN句の条件を最初に満たす時表に挿入される |
MERGE文
- MERGE文はある表から取得した行を元に、別の表の追加・更新を行う
MERGE INTO <ターゲット表>
USING <ソース表>
ON (結合条件)
WHEN MATCHED THEN
UPDATE ...
WHEN NOT MATCHED THEN
INSERT ...
トランザクション
- トランザクションはDMLを実行すると自動で開始され、
COMMIT
文を実行すると終了する(変更が確定)COMMIT
文を実行する前にROLLBACK
文を実行すれば変更を取り消せる
- トランザクションの開始・終了の条件は以下
トランザクションの開始 | 条件 |
---|---|
トランザクションの開始 | トランザクションが実行されていない時にDMLを実行SET TRANSACTION 文を実行した時 |
トランザクションの終了 (COMMIT) | COMMIT文を実行 接続を正常終了した時 DDLを実行した時 |
トランザクションの終了 (ROLLBACK) | ROLLBACK文を実行 接続が異常終了した時 |
- トランザクション中にセーブポイントを指定すると、トランザクション中にセーブポイントまで戻ることができる
第11章:DDL による表とその関係の管理
オブジェクト
- オブジェクトにはスキーマオブジェクトと非スキーマオブジェクトがある
- スキーマオブジェクトは表・索引・ビュー・シーケンス・シノニムなど特定のユーザに所有される
- 非スキーマオブジェクトはユーザ・ロール・表領域など特定のユーザに所有されない
DDL
- オブジェクトの定義に関するSQLはDDLと呼ばれる
第12章:ビューの管理
ビュー
- ビューは表に対する
SELECT
文より定義されるオブジェクト - ビューを作成するには
CREATE VIEW
文を使用するOR REPLACE
を指定すると同じビューがあったときに上書きされるWITH READ ONLY
を指定するとビューは読み取り専用になるWITH CHECK OPTION
を指定するとビューのデータを変更した時、変更後のデータがビュー定義のWHERE条件を満たすかチェックする(満たさない場合エラー)
第13章:索引とシノニムとシーケンスの管理
索引
- 表からのデータの読み取りを高速化するオブジェクトを索引(インデックス)と呼ぶ
- 使用することで読み取るデータ量を削減して処理を高速にする
CREATE INDEX <索引名> ON <表名> (<列名> ... ) --索引の作成
DROP INDEX --索引の削除
- 索引をUNUSABLE(使用不可)にすると索引のセグメントが削除される(索引の定義は削除されない)
- 索引をINVISIBLE(不可視化)にすることで、索引を削除しても影響が無いか確認ができる(索引が見えなくなるが実体は残る)
シーケンス
- シーケンスを使うことでデータベース全体で一意である連番を振る処理を行う
CREATE SEQUENCE <シーケンス名> --シーケンスの作成
<シーケンス名>.NEXTVAL --シーケンスから新たに連番を振り出す
<シーケンス名>.CURVAL --振り出された連番の確認
シノニム
- シノニムは表・ビューなどのオブジェクトに対して付ける別名
- プライベートシノニムとパブリックシノニムがある
- プライベートシノニムは所有ユーザとシノニムが差すオブジェクトにアクセスできるユーザがアクセスできる
- パブリックシノニムはどのユーザでもアクセスできる
第14章:ユーザー・アクセスの制御
ユーザ
- DBでデータを管理するには属性・権限を付与したユーザを作成する
- ユーザは所有するオブジェクトに対してどの表領域からどれだけストレージ領域を割り合てるか設定できる
スキーマ
- ユーザには同名のスキーマが存在し、ユーザが所有するオブジェクトはユーザのスキーマに格納される
権限
- Oracleの権限はシステム権限とオブジェクト権限の2種類ある
- システム権限はデータベースへの操作が実行可能かを制御する権限
- オブジェクト権限は他のユーザが所有する表・ビューなどのオブジェクトに対する操作が実行可能かを制御する権限
- 権限は
GRANT
文で付与しREVOKE
文で取り消す - ADMINオプションを指定してシステム権限を付与されたユーザは他のユーザにそのシステム権限を付与できる
- GRANTオプションを指定してオブジェクト権限を付与されたユーザは他のユーザにそのオブジェクト権限を付与できる
ロール
- 複数の権限をまとめたものをロールと呼ぶ
第15章:データ・ディクショナリ・ビューを使用したオブジェクトの管理
- データディクショナリと呼ばれるOracle内部の管理情報を格納している特殊な表から作られるビューをデータディクショナリビューと呼ぶ
第16章:異なるタイムゾーンでのデータの管理
タイムゾーン
- 各国・地域で使われる日時の基準を標準時と呼び、その標準時を使う国・地域をタイムゾーンと呼ぶ
- タイムゾーンはタイムゾーンリージョン名かタイムゾーンオフセットで指定する
- タイムゾーンリージョン名は日本の場合
Japan
、Asia/Tokyo
- タイムゾーンオフセットは日本の場合
+9:00
- タイムゾーンリージョン名は日本の場合
- Oracleにはタイムゾーンに対応している日時データ型は
TIMESTAMP WITH TIME ZONE
型とTIMESTAMP WITH LOCAL TIME ZONE
型がある
期間データ型
- 期間データ型には
INTERVAL YEAR TO MONTH
型とINTERVAL DAY TO SECOND
型がある