この記事の概要
- OracleMasterBronzeを勉強していくにあたり、初めて目にする関数や知識が何個かあったので、メモとして残しておこうと思い
- SQL関係はdualを使ってできる範囲でSQLと結果を載せますー
SQLの種類
DML(Data Manipulation Language)
- データ操作言語
- select, insert, delete, update, merge
DDL(Data Definition language)
- データ定義言語
- create, alter, drop, rename, truncate, comment
DCL(Data Control Language)
- データ制御言語
- grant, revoke
- revoke: ユーザやロールから権限を剥奪する
トランザクション制御
- commit, rollback, savepoint
汎用関数
nullif
- 第一引数と第二引数が等しい場合にNullを返す単一関数
SQL> select nullif(1000, 1000) from dual;
NULLIF(1000,1000)
-----------------
SQL> select nullif(1000, 1001) from dual;
NULLIF(1000,1001)
-----------------
1000
nvl
- 第一引数がNullだった場合に第二引数の値を返す関数
SQL> select nvl(null, 123) from dual;
NVL(NULL,123)
-------------
123
SQL> select nvl(1, 123) from dual;
NVL(1,123)
----------
1
nvl2
- 第一引数がnullじゃなかったら第二引数を、
- 第一引数がnullだったら第三引数を返す
SQL> select nvl2(null, 123, 456) from dual;
NVL2(NULL,123,456)
------------------
456
SQL> select nvl2(1, 123, 456) from dual;
NVL2(1,123,456)
---------------
123
coalesce
- 可変引数をとり、はじめにnullでない値を返す
- 引数はすべて同じデータ型である必要あり
- (読み方がわからん。。。)
SQL> select coalesce(null, 2, 3) from dual;
COALESCE(NULL,2,3)
------------------
2
SQL> select coalesce(null, null, null) from dual;
C
-
条件式
case文
- そういえばあまり使ってこなかったなぁ
- 最後のendを忘れない
-
CASE var WHEN val1 THEN ret1 ELSE ret2 ENDみたいな書き方もできる - decodeも条件で出し分けができるけど、範囲指定でやりたいときはこっちかな
SQL> select case when 90 > 80 then 'good' else 'soso' end from dual;
CASE
----
good
グループ関数
注意点メモ
- null値は集計対象にならない
- 集計対象にしたければnvlとかを使う
- ネストは2レベルまでOK。それ以上はエラー
複数の表の結合
- すべての列名に表接頭辞を付与するとoracleが列名の重複チェックをしなくなりわずかにパフォーマンスアップ!
- 表別名を短いものに設定するとSQLが短くなってパフォーマンスアップ!
集合演算子
- 集合演算子に優先順位はない
- 上から順に結合される
UNION
- 重複した行を排除して結合
- select句の先頭の列でソートされる
- 最後の問い合わせの後に
ORDER BY句を記述することでソート順を制御できる
UNION ALL
- 重複行も含めて結合
- ソートはされない
INTERSECT
- 共通する行だけを返す
MINUS
- 1つ目の問い合わせ結果 - 2つ目の問い合わせ結果
- 問い合わせ順を変えると結果が変わるよ
トランザクション制御
FOR UPDATE
- select句使用時には通常ロックはかからないが、
FOR UPDATE文を使用することで行単位でロックをかけることができる
表の作成と管理
TABLE
- DROPで削除できるが、ゴミ箱には残っている
- ゴミ箱からも削除したい場合は
PURGE句を指定する - ゴミ箱から復元するためには
FLASHBACK TABLE文を使用する
INDEX
- 一意性制約のチェックはインデックスを利用して行われる
- だからprimary_keyやunique制約をつけるとデフォルトでインデックスが作成されるのか
FOREIGN KEY制約
- 参照する列は同じ表でも異なる表でもOK
- ただしPRIMARY_KEY制約かUNIQUE制約が定義されている必要がある