SQL入門 第5章補足

5-1 新しいデータを挿入する(INSERT INTO

INSERT文の使用と2種類の挿入方法

教科書訂正

VALUE句の・・・  →  VALUES句の

■格納する行の列の値は、定数のほかに演算子を・・・。

INSERT INTO emp
(empno,comm)
VALUES (1234,20*1.05+1000);  ←empnoは数値型なので「’」不要。

基本構文

INSERT INTO <表名>
[ ( <列名1> [,<列名2>,<列名3>,・・・] ) ]
VALUES (<値1> [,<値2>,<値3>,・・・] )


例@ 全列のデータを挿入する

INSERT INTO DEPT
VALUES (50,’FINANCE’,’LOS ANGELS’);

・部門表(DEPT)にDEPTNOが50,DNAMEがFINANCE、LOCがLOS ANGELSの行を追加する。
・VALUES句の( )内の項目の順番は、表の列の定義と個数やデータ型が完全に一致していなければならない。


例A 特定の列のデータだけを挿入する

INSERT INTO DEPT
(DEPTNO,DNAME)
VALUES (50,’FINANCE’);

・部門表(DEPT)にDEPTNOが50,DNAMEがFINANCEの行を追加する。
・表名の後の列名は表の列名と一致していなければならない。
・VALUE句の( )内の項目の順番は、表名の( )内に指定した列と順番、個数、データ型が完全に一致していなければならない。
指定しない列にはNULLが入る

 

★注意

・INSERT文1つで挿入されるのは1行のみ。(複数挿入するときは置換変数を利用して1つのSQL文を複数回実行する。)
・格納する値は演算も可能。
・INSERT文を実行しただけでは挿入は確定されない
COMMIT文で挿入を確定する。(元に戻せなくなる。)
・COMMIT前であれば、ROLLBACK文で挿入前の状態に復元することができる。
(詳しくは5−4参照)

5-2 データを変更する(UPDATE SET

既存データの変更にはUPDATE文を用いる。

基本構文

UPDATE <表名>
SET <列名1> = <値1> [ , <列名2> = <値2>,・・・]
[ WHERE <条件式> ]

 

例@

UPDATE EMP
SET SAL = SAL * 1.05;

・EMP表のSAL列の全行のデータを現在の値の1.05倍する。
・WHERE句を書かない場合はすべての行を更新してしまうので注意。

A

UPDATE EMP
SET SAL = SAL * 1.05
WHERE JOB = ’SALESMAN’;

・EMP表のJOBがSALESMANのデータを現在の値の1.05倍する。
・WHERE句を書いた場合は特定の行を更新する。

★注意

・UPDATE文を実行しただけでは更新は確定されない
COMMIT文で更新を確定する。(元に戻せなくなる。)
・COMMIT前であれば、ROLLBACK文で更新前の状態に復元することができる。
(詳しくは5−4参照)

5-3 データを削除する(DELETE

既存データの削除にはDELETE文を用いる。

基本構文

DELETE FROM <表名>
[ WHERE <条件式> ]

 

例@

DELETE FROM EMP;

・EMP表の全データを削除する。
・WHERE句を書かない場合は表内の全データを削除してしまうので注意。

A

DELETE FROM EMP
WHERE EMPNO = 1234;

・EMP表のEMPNOが1234のデータを削除する。
・WHERE句を書いた場合は特定の行を削除する。

★注意

・DELETE文を実行しただけでは完全に削除されない
COMMIT文で削除を確定する。(完全に削除され、元に戻せなくなる。)
・COMMIT前であれば、ROLLBACK文で復元することができる。
(詳しくは5−4参照)

 

5-4 変更を確定する(COMMIT

トランザクション処理で実行した挿入、変更、削除など一連の処理を確定することをコミットという。
コミットはコマンド入力によって手動で行う場合とORACLEによって自動的に行われる場合の2種類がある。

@コマンド入力による手動コミット

COMMITコマンドを実行し、確定する。明示的なコミットという。


基本構文

COMMIT

 

ADDL文実行後に行われる自動コミット

DDL文を実行すると、自動的に確定する。暗黙のコミットという。

※DDL文とは

Data Definition Language : データ定義文

表全体に変更が加わるような操作を行うコマンド。以下のコマンドがDDL。

CREATE
ALTER
DROP
ANALIZE
GRANT
REVOKE

 

コミットが行われるタイミング

@COMMITコマンドの入力
ADDL文が発行されたとき
Bデータベースからセッションを切断したとき(SQL*Plusを終了したときなど)

※自らセッションを切断したとき(正常終了時)はコミットが行われるが、セッションが異常終了したときはロールバックが行われるので注意しよう。

 

トランザクションの単位

@コミットしてから次にコミットするまでの間
Aログイン(データベースに接続)してからコミットするまでの間
Bログイン(データベースに接続)してからデータベースから切断するまでの間

※Bのことをセッションといいます。

 

読み取り一貫性

挿入、変更、削除を行っても、変更した値を参照できるのは変更を行った本人のみで、すぐに他人がそのデータを参照することはできません。他人は変更前の旧データのみが参照できます。他人が更新済みデータを参照できるようになるのは変更者がコミットした後です。これを読み取り一貫性といいます。

以下に読み取り一貫性の例を挙げます。
渡邉さんは給与データの変更を担当しています。
清水くんは給与明細の印刷を担当しています。

★読み取り一貫性が保たれている場合

時間 渡邉さん SCOTTのSAL 清水くん
 9:30   7655  
10:00 SCOTTのSALを
7655→8000に変更
7655  
10:05   7655 SCOTTの
SAL検索 7655
10:10 変更取消(ROLLBACK)
SCOTTのSALが
8000→7655に戻る
7655  

読み取り一貫性が保たれていれば、
渡邉さんが10:00に変更をしてもコミットしていないのでSCOTTのSALは7655のままです。
10:05に清水くんはSCOTTのSALを読み取り、給与明細にSALを7655と印刷します。
渡邉さんは10:10に間違いに気づき、変更を取り消しました。

 

★読み取り一貫性がない場合

時間 渡邉さん SCOTTのSAL 清水くん
 9:30   7655  
10:00 SCOTTのSALを
7655→8000に変更
8000  
10:05   8000 SCOTTの
SAL検索 8000
10:10 変更取消(ROLLBACK)
SCOTTのSALが
8000→7655に戻る
7655  

読み取り一貫性がない場合、
渡邉さんが10:00に変更をすると、即時反映されSCOTTのSALは8000になります。
10:05に清水くんはSCOTTのSALを読みとり(ダーティ・リード)、給与明細に8000と印刷します。
渡邉さんは10:10に間違いに気づき、変更を取り消しました。
SCOTTの給与明細には8000と印刷されてしまっています。
SCOTTさんは、支払われた金額(7655ドル)と給与明細の金額(8000ドル)が違っているとマジギレしてしまいました。

 

5-5 変更を取り消す(ROLLBACK

トランザクション処理で実行した挿入、変更、削除など一連の処理を取り消すことをロールバックという。

基本構文

ROLLBACK

※ROLLBACKを実行すると変更が無効となり、前回のコミット直後の状態に戻ります。(ログイン後コミットしていないときはログイン直後の状態に戻ります。)

※ROLLBACKでDML文の取り消しはできるが、DDL文の取り消しはできない(暗黙のコミット)

DML文(ROLLBACK可)

INSERT,DELETE,UPDATE 

(SELECTもDMLであるが、データを検索するのみで変更を加えないのでROLLBACKとは関係ない)

DDL文(ROLLBACK不可・暗黙のコミット

CREATE,ALTER,DROP,ANALIZE,GRANT,REVOKE

★例1
@〜Iのコマンドを順番に実行した場合

@ COMMIT
A INSERT INTO EMP ・・・・
B INSERT INTO EMP ・・・・
C DELETE FROM EMP ・・・・
D UPDATE EMP SET ・・・・

E ROLLBACK
F UPDATE EMP SET ・・・・
G INSERT INTO EMP ・・・・
H DELETE FROM EMP ・・・・
I COMMIT

EのROLLBACKを実行するとA〜Dの処理は取り消される。
IのCOMMITでF〜Hの処理が確定する。

★例2
@〜Iのコマンドを順番に実行した場合

@ COMMIT
A INSERT INTO EMP ・・・・
B INSERT INTO EMP ・・・・
C ALTER TABLE EMP ・・・・
D UPDATE EMP SET ・・・・

E ROLLBACK
F UPDATE EMP SET ・・・・
G INSERT INTO EMP ・・・・
H DELETE FROM EMP ・・・・
I COMMIT

EのROLLBACKを実行するとDの処理のみ取り消される。CのALTER文はDDL文であり、暗黙のコミットが行われ、この時点でA〜Cは確定する。
IのCOMMITでF〜Hの処理が確定する。

 

5-6 更新過程で戻り先を指定する(SAVEPOINT,ROLLBACK TO

トランザクション処理で大量に挿入、変更、削除などを実行する場合、ROLLBACKでどの位置まで戻るかを指定することができます。

基本構文

SAVEPOINT <SAVEPOINT名称>

ROLLBACK TO <SAVEPOINT名称>

※ROLLBACK TOを実行すると指定したSAVEPOINTに処理が戻ります。

★例1
@〜Iのコマンドを順番に実行した場合

@ COMMIT
A INSERT INTO EMP ・・・・
B UPDATE EMP SET ・・・・

C SAVEPOINT a
D UPDATE EMP SET ・・・・
E INSERT INTO EMP ・・・・
F SAVEPOINT b
G DELETE FROM EMP ・・・・
H ROLLBACK TO b
I COMMIT

HのROLLBACK TO bを実行するとGの処理は取り消される。
IのCOMMITでABDEの処理が確定する。

★例2
@〜Iのコマンドを順番に実行した場合

@ COMMIT
A INSERT INTO EMP ・・・・
B UPDATE EMP SET ・・・・

C SAVEPOINT a
D UPDATE EMP SET ・・・・
E INSERT INTO EMP ・・・・
F SAVEPOINT b
G DELETE FROM EMP ・・・・
H INSERT INTO EMP ・・・・
I ROLLBACK

IのROLLBACKでSAVEPOINTを指定していないため、処理はすべて取り消される

※ROLLBACK TOによってSAVEPOINTに処理が戻っても、SAVEPOINT以前の処理がCOMITTされるわけではないので注意。最終的にCOMMITしなければ処理は確定しない。

★例3
@〜Iのコマンドを順番に実行した場合

@ COMMIT
A INSERT INTO EMP ・・・・
B UPDATE EMP SET ・・・・

C SAVEPOINT a
D UPDATE EMP SET ・・・・
E INSERT INTO EMP ・・・・
F SAVEPOINT b
G DELETE FROM EMP ・・・・
H ROLLBACK TO b
I COMMIT

CでSAVEPOINTを作成してもABはコミットされない


[ TOP ]