アプリケーション開発でデータベースを利用する新人プログラマに向けて、SQLおよびT-SQLを短期間で理解できるよう、開発現場ですぐに必要となる内容を中心に解説する。(編集部)
主な内容
▼データを追加するINSERT文
▼列を省略したINSERT文
▼SELECTを利用したINSERT文
▼データの更新を行うUPDATE文
▼行の削除を行うDELETE文
▼まとめ
これまで7回にわたってSELECT文の利用法を取り上げてきましたが、今回はデータの操作を行うための文、「INSERT」「UPDATE」「DELETE」を取り上げます。
これらの命令文はそれぞれデータの追加、更新、削除といったデータの操作を行うためのものです。連載の第1回「初めてSQLコマンドを叩く緊張と感動の一瞬」でデータの操作を行う命令文をデータ操作言語(DML:Data Manipulation Language)と分類する、と解説しましたが、SELECT文と今回取り上げる命令文でDMLにひととおり触れることになります。DMLをマスターできれば、SQLの基本は把握できたことになるので、引き続きしっかりとその内容を把握していきましょう。
INSERTはデータを追加するための命令文です。具体的な構文は次のとおりです。
INSERT INTO テーブル名
(列名1,列名2,……)
VALUES
(値1,値2,……)
まず、データの追加対象となるテーブル名を指定します。続いて「列名」には、テーブルを構成する列名を指定します。「値」には、列に登録するデータを記述していきます。列名1に値1を、列名2に値2を、という具合に列の順番と値の順番が対応しています。INSERT文ではこのように構文上、注意すべき点がいくつか存在します。
それでは、具体的な例文を見てみましょう。ここでは、下記のような構成のテーブルに対し、データを登録してみます。SQLを実際に試す場合は、テーブルの作成をあらかじめ行っておきましょう。
テーブル名:Product | |
列名 | 型 |
ProductID | int |
ProductName | varchar(20) |
Price | money |
上記テーブルに対して、1件データを登録するINSERT文は次のとおりです。
INSERT INTO Product (ProductID,ProductName,Price) VALUES (1,'bag',9800)
文字列型の列に値を登録する際は、「'」(シングルクォーテーション)で囲い、値を指定します。
データを追加するテーブルのすべての列に対し値を登録する場合は、列名の指定を省略することも可能です。この場合、値の指定はテーブルの定義に従った順番に並べる必要があるため、注意が必要です。
INSERT INTO Product VALUES (2,'shoes',26000)
列名を省略したINSERT文は手軽ではあるのですが、データの登録対象となる列を間違ったり、テーブルの定義が変更された場合にエラーが発生するなど問題となりやすいため、利用する場合は取り扱いに注意します。
また、主キーなど一意制約のある列に対して、重複した値を登録しようとするとエラーとなります。INSERT文の発行に際しては一意制約違反が発生しやすいため、主キー項目などの取り扱いにも注意が必要です。先ほど利用したテーブルの「ProductID」列に主キーを設定し、重複した値を登録しようとすると、次のようなエラーが発生します。
INSERT INTO Product (ProductID,ProductName,Price) VALUES (1,'bag',9800) 実行結果 ------------- メッセージ 2627、レベル 14、状態 1、行 1 制約 'PK_Product' の PRIMARY KEY 違反。オブジェクト 'dbo.Product' には重複したキーを挿入できません
ここまで紹介したINSERT文は、データを1行ずつ登録するための構文でした。数件の登録であれば問題ありませんが、一度にたくさん登録を行いたい場合はなかなか面倒です。そのような場合は、INSERTとSELECTを組み合わせることによって、データを一括して登録できます。具体的には次のような構文になります。
INSERT INTO テーブル名
(列名1,列名2,……)
SELECT 列名1,列名2,……
FROM テーブル名2
WHERE 条件式;
このように、各列に対する値としてSELECT文の結果を登録することが可能です。SELECT文の結果が複数行となる場合、登録対象のテーブルには複数行のデータが登録されることになります。
それでは早速具体的な例を見てみましょう。次の例ではまったく同じ構成のテーブルを利用し、データの登録を行っています。
INSERT INTO Product (ProductID,ProductName,Price) SELECT ProductID,ProductName,Price FROM Product_bkup
SELECT文を使えるということは、これまで取り上げたテーブルの結合や関数などさまざまな構文を利用できるため、INSERT文を発行する際にその多様性を生かすことが可能です。
データの追加が行えたら、次はデータの更新を行いましょう。UPDATE文はテーブルに登録されているデータを更新するために利用する命令文です。UPDATE文の構文は次のような形です。
UPDATE テーブル名
SET 列名1=値1,列名2=値2,……
WHERE 検索条件
WHERE句の存在が示すとおり、UPDATE文は検索条件を満たす行をすべて更新対象とします。WHERE句を指定しない場合は、対象テーブルのすべての行が該当することになります。INSERT文では指定しなかった列にはデフォルト値、もしくはNULLが登録されますが、UPDATE文では指定した列のみ更新が行われます。
それでは、具体的な例文を見てみましょう。次の例では、ProductIDが1の行について、Priceを12000に変更しています。
UPDATE Product SET Price=12000 WHERE ProductID=1
WHERE句を省くと対象の列について、すべての行の値が更新されます。
UPDATE Product SET Price=12000 結果 --------------- (3 行処理されました)
WHERE句を省いたUPDATE文を発行する場合、主キーなどが設定された列で値が重複しないよう注意する必要があります。
最後にUPDATE文を発行する際に便利な使い方を取り上げます。UPDATE文では、列に値をセットする際、列の元の値を利用した演算を行うことができます。具体的には、次のような例文となります。
UPDATE Product SET Price=Price*1.5 WHERE ProductID=1
こちらの例では、元の値を1.5倍にしています。
追加、更新と取り上げたところで、最後に取り上げるのは行の削除を行うDELETE文です。1行、もしくは複数行にわたるデータの削除を行えます。DELETE文の構文は次のとおりです。
DELETE FROM テーブル名
WHERE 検索条件
構文の形はSELECT文に近い形になっています。削除対象のテーブルを指定したうえで、検索条件を満たす行のデータを削除できます。検索条件を指定しない場合、対象のテーブルからすべての行を削除することになります。また、DELETE文が削除可能なのは行単位での削除のみです。列ごとの値を削除することはできないため、個別の列の値を変更したい場合はUPDATE文を利用します。それでは、具体的な例文を見てみましょう。
DELETE FROM Product WHERE ProductID=2
こちらの例では、ProductIDの値が2の行を削除しています。DELETE文からWHERE句を省略すると、対象のテーブルからすべての行が削除されます。
DELETE FROM Product 結果 ----------------- (3 行処理されました)
すべての行が削除されても、テーブルそのものは削除されることはありません。テーブルの削除を行うためにはDROP TABLE文を利用する必要があります。
今回はデータの操作を行うために必要な3つの構文を取り上げました。追加、更新、削除それぞれに独特な構文を利用する必要があるため、その構文とSQLを発行した結果がどうなるか目で追いながらデータの操作に慣れていきましょう。また、復習の意味も兼ねて、これまでの連載で取り上げたSELECT文も併せて利用すると、より効果的な学習が可能です。
次回はSQLを利用した一連の処理を記述し、プログラムとしてデータベースに格納・利用ができる「ストアドプロシージャ」を取り上げる予定です。お楽しみに!(次回へ続く)
石橋潤一
株式会社システムインテグレータ勤務。Web+DBの業務アプリをメインに開発に携わる。@IT連載記事「SQL Server 2005を使いこなそう」「SQL Server 2005 CTPレビュー」執筆のほか、著書に『DBマガジン別冊 SQL Server 2005徹底活用ガイド』(翔泳社刊/共著)、『ASP.NET+SQL Server ゼロからはじめるWebアプリケーション』(ソフトバンクパブリッシング刊/共著)。
Copyright © ITmedia, Inc. All Rights Reserved.