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