検索
連載

SQLでデータを操作するときの文法(INSERT/UPDATE/DELETE)Webブラウザで気軽に学ぶ実践SQL講座(13)(2/2 ページ)

SELECT文を理解したら、次はINTSERT、UPDATE、DELETEでデータ操作する感覚を覚えていこう。APEX環境と一般環境の違いも紹介しておく

PC用表示 関連情報
Share
Tweet
LINE
Hatena
前のページへ |       

データを更新するSQL文(UPDATE)

 次に、データを更新してみましょう。データを更新するには、UPDATE文を使用します。UPDATE句の後に表名を、SET句の後に更新する列名と更新後の値を指定します。また、どの行を更新するか(更新対象の行)をWHERE句を使って指定します。条件を指定しなければ、表の全ての行が更新されてしまうため、注意してください。

UPDATEの基本構文

UPDATE  表名
SET    列名 = 値 
WHERE 更新する行を特定する条件;

 それでは、DEPT表のデータを更新してみましょう。先ほど部門60のデータをINSERTした際には、部門の場所(LOC)を省略したため、部門60には場所データが登録されていません。そこで、部門60の行を更新して、場所に「北海道」を入力してみましょう。

UPDATE dept
SET    loc = '北海道'
WHERE  deptno = 60;

図13-9 データの更新

 データが更新されると、「1 row(s) updated」(日本語環境では「1行が作成されました」)と表示されます。SELECT文で検索して、正しく更新されたか確認してみましょう。

SELECT * FROM dept;

図13-10 更新結果を確認する

複数の列を一度に更新する

 データを更新する際には、複数の列を一度に更新することもできます。例えば、部門80の部門名を「技術部」に、場所を「福岡」に変更したい場合には、以下のように、UPDATE文のSET句に「列名=値」のペアを、カンマ区切りで指定します。

UPDATE dept
SET    dname = '技術部',
       loc   = '福岡'
WHERE  deptno = 80;

図13-11 複数の列を一度に更新する

 SELECT文で更新結果を確認すると、以下のように更新されたことが分かります。

SELECT * FROM dept;

図13-12 更新されているのが分かる

データを削除するSQL文(DELETE)

 最後に、データを削除してみましょう。データを削除するには、DELETE文を使用します。DELETE句の後に表名を、WHERE句の条件式で削除する行を指定します。UPDATE文と同様に、条件を指定しなければ、表の全ての行が削除されてしまうため、注意してください。

DELETE文の基本構文

DELETE  FROM  表名
WHERE 削除する行を特定する条件;

 それでは、DEPT表から、1行データを削除してみましょう。例えば、部門80を削除するには以下のように指定します。

DELETE FROM dept
WHERE  deptno = 80;

図13-13 データを削除する

 この例では、WHERE句で指定する条件として、deptno列を指定していますが、もちろん他の列を条件にすることもできます。例えば「WHERE loc = '福岡'」のように指定しても、同様にこの行を削除できます。ただし、もしも福岡に複数の部門がある場合には、これらの行が全て削除されることになります。UPDATE文やDELETE文で行を更新したり削除したりする場合には、なるべく対象行を一意に識別できるID列などを指定するとよいでしょう。

 それでは、ここまでの結果をSELECT文で確認してみましょう。

SELECT * FROM dept;

図13-14 図13-13指定したデータDEPT表から削除された

 今回は、基本的なINSERT文、UPDATE文、DELETE文の構文を説明しました。次回は、これらの構文を少し応用した、データの挿入と更新を同時に行う「MERGE文」や、相関副問合せと組み合わせた「相関UPDATE文」などをご紹介したいと思います。お楽しみに!

「トランザクション」ってどういう意味?

 通常、アプリケーションやバッチ処理は複数のSQL文から構成されます。例えば、注文が入ったら、注文表に注文データをINSERTし、さらに在庫表をUPDATEして在庫数を減らす、という処理が必要かもしれません。このような「関連する一連の処理」を、データベースではこれを「トランザクション」という概念であらわします。

 複数の関連する処理を「トランザクション」として定義することで、関連する処理をまとめて「確定(COMMIT)」または「取り消し(ROLLBACK)」できます。これによって、例えば「注文情報のINSERTは成功したけれど、在庫数を減らす処理が失敗した」という、処理上の不整合をなくせます。

 データベースでは、接続して最初の処理を開始してから、処理を「確定(COMMIT)」するか、または「取り消し(ROLLBACK)」するまでが一連のトランザクションであると見なされます。

APAX環境と通常の環境の違いに注意しよう

 実は今回使用しているAPEX環境では、SQL文の実行後に、自動的に確定処理(COMMIT)が実行されています。そのため、明示的に「COMMIT」コマンドを使用しなくても、INSERTやUPDATE、DELETE処理が確定します(そのため、取り消し(ROLLBACK)することもできません)。

 しかし、一般的なSQL実行ツール(SQL*Plusなど)では、明示的に「COMMIT」コマンドを実行するまで処理が確定しない(保存されない)ものがほとんどです。一連の処理が完了したら「COMMIT」コマンドを実行するのを忘れないようにしてください。COMMITせずにツールを終了すると、処理が確定せず、変更が失われて(自動的にROLLBACKされて)しまいます。また、一連の処理を明示的に取り消したい場合には「ROLLBACK」コマンドで処理を取り消します。


Copyright © ITmedia, Inc. All Rights Reserved.

前のページへ |       
ページトップに戻る