表に新しいデータを追加したり、データを新しい値に更新するといったことは、よく行う作業です。また、必要なくなったデータを削除することもあります。
ここでは、こういった表に対するデータ操作を解説していきます。
データの挿入
表にデータを挿入(追加)するときには、INSERT文を用います。INSERT文には大きく分けて2つの使い方があります。
- 1行ずつデータを挿入する
- 問合せ結果を挿入する
では、それぞれについて解説していきます。
1行ずつデータを挿入する
表に1行ずつデータを挿入するときには、INSERT...VALUES文を使います。INSERT...VALUES文の書式は次のようになります。
INSERT INTO <表名> (<列名1>[,列名2...])
VALUES (<値1>[,<値2>...]);
◆列と値の記述する位置を対応させる
INSERT...VALUES文には原則的に列名と値のリストがあります。これを記述するときには、列名と値の並びが対応している必要があります。これがずれていると、意図しないところにデータが挿入されたり、エラーとなります。
◆対応する列とデータ型を一致させる
各列に入力する値は、その列のデータ型と一致していなくてはなりません。データ型が対応していないと、エラーとなります。
CREATE TABLE 商品マスタ (
商品コード INT NOT NULL,
商品名 VARCHAR2(16) NOT NULL,
商品単価 INT,
販売元 VARCHAR2(16)
);
INSERT INTO 商品マスタ
(商品コード,商品名,商品単価,販売元) VALUES (
1201, '角の固い豆腐', 400, 'うつけ屋');
実行結果 1行が作成されました。
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
(商品コード,商品名,商品単価,販売元) VALUES (
(商品コード,商品名,商品単価,販売元) VALUES (
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
1300 | 透明なインク | 180 | 裸の王様堂 |
1355 | 滑稽な石 | 890 | 岩塩堂 |
INSERT INTO 商品マスタ VALUES
( 1400, '暗い蛍光灯', 1500, '非電気店');
実行結果 1行が作成されました。
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
1300 | 透明なインク | 180 | 裸の王様堂 |
1355 | 滑稽な石 | 890 | 岩塩堂 |
1400 | 暗い蛍光灯 | 1500 | 非電気店 |
検索結果の挿入
表に1行ずつデータを挿入するには、INSERT...VALUES文を使いました。しかし、すでにデータを入力した表があり、その表と同じデータを別の表に挿入する場合には、いちいち INSERT...VALUES文で1行ずつ挿入するよりも、すでに同じデータを保存している表から挿入した方が作業が楽です。このような場合には、INSERT...SELECT文を用います。
INSERT...SELECT文を使でば、すでにある表から、別の表にまとめてデータを挿入できます。書式は次のようになります。
INSERT INTO <表名1> (<列名1>[,列名2...])
SELECT (<列名1>[,列名2...])
FROM <表名A> WHERE <検索条件>;
INSERT INTO 商品バックアップ
SELECT * FROM 商品マスタ;
SQL文
SELECT * FROM 商品バックアップ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
1300 | 透明なインク | 180 | 裸の王様堂 |
1355 | 滑稽な石 | 890 | 岩塩堂 |
1400 | 暗い蛍光灯 | 1500 | 非電気店 |
SELECT句で「*」を指定し、「商品マスタ」表のすべてのデータを挿入する指定にしたので、まったく同じデータが保存されています。すべての列のデータを挿入する場合には、両方の表の定義がまったく同じでなければなりません。
では次に、もう少し複雑な使用例を見てみましょう。「商品マスタ」表から商品単価が「500」以上の商品だけを選択し、先に作っておいた「高額商品一覧」表に挿入してみます。
INSERT INTO 高額商品一覧
SELECT 商品コード,商品名,所品単価
FROM 商品マスタ WHERE 商品単価 > 500;
実行結果 2行が作成されました。
SELECT * FROM 高額商品一覧;
商品コード | 商品名 | 商品単価 |
1355 | 滑稽な石 | 890 |
1400 | 暗い蛍光灯 | 1500 |
WHERE句の検索条件を満たす行だけが、挿入されています。また、SELECT句で列を指定しているので、指定した列だけが挿入されました。列の指定をした場合には、両方の表がまったく同じ定義である必要はなく、指定した列の列名とデータ型の定義が同じであれば挿入することができます。
このように、INSERT...SELECT文を使えば、さまざまな問合せの結果を別の表に挿入することができます。
NULLの挿入
表に値を挿入するときに、行の中で値が存在しない列があることがあります。このようなときには表の該当する列にNULLを挿入します。NULLに関しては、こちらを参照してください。
NULLを挿入するときには、INSERT...VALUES文で、列の該当する部分の値を「NULL」と記述します。
INSERT INTO 商品マスタ VALUES (
1402, '睡眠コーヒー', NULL, 'うつけ堂');
実行結果 1行が作成されました。
SELECT * FROM 商品マスタ;
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
1300 | 透明なインク | 180 | 裸の王様堂 |
1355 | 滑稽な石 | 890 | 岩塩堂 |
1400 | 暗い蛍光灯 | 1500 | 非電気店 |
1402 | 睡眠コーヒー | うつけ堂 |
この使用例はORACLEを使っているので、NULLを指定した「商品単価」列には空白となっています。
NULLの挿入には注意することがあります。表を作成するときに「NOT NULL」と指定して、NULLを入れられないように定義している列に、NULLを入れるとエラーになります。そのため、NULLを挿入する場合には、NOT NULL制約があるかどうかを確認してから行う必要があります。
データの更新
ここまでに、問合せとデータの挿入について解説してきました。この他に、データを処理するときに重要なものとしてデータの更新処理があります。SQLで更新を行うときに用いるのはUPDATE文です。
UPDATE <表名> SET <列名1>=<値1>[,<列名2>=<値2>...] WHERE <検索条件>;
UPDATE 商品マスタ SET 商品単価 = 300
WHERE 商品名='睡眠コーヒー';
実行結果 1行が更新されました。
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
1300 | 透明なインク | 180 | 裸の王様堂 |
1355 | 滑稽な石 | 890 | 岩塩堂 |
1400 | 暗い蛍光灯 | 1500 | 非電気店 |
1402 | 睡眠コーヒー | 300 | うつけ堂 |
空白であった睡眠コーヒーの「商品単価」列が「300」に更新されています。
UPDATE文っでは、WHERE句の検索条件で複数行の結果を返すようにしておくと、結果のすべての行の値を更新することができます。また、検索条件を設定しなければ、表の全行の値を変更することもできます。
次の例では、商品単価「800」以上の商品の商品単価を、すべて「900」に変更しています。
UPDATE 商品マスタ SET 商品単価 = 900
WHERE 商品単価 >= 800;
実行結果 2行が更新されました。
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 400 | うつけ屋 |
1300 | 透明なインク | 180 | 裸の王様堂 |
1355 | 滑稽な石 | 900 | 岩塩堂 |
1400 | 暗い蛍光灯 | 900 | 非電気店 |
1402 | 睡眠コーヒー | 300 | うつけ堂 |
商品単価が「800」以上だった、「滑稽な石」と「暗い蛍光灯」の「商品単価」列の値が「900」に更新されています。
また、UPDATE文では、次のように更新する値を演算により作り出すこともできます。
UPDATE 商品マスタ SET 商品単価 = 商品単価 * 1.05;
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 420 | うつけ屋 |
1300 | 透明なインク | 189 | 裸の王様堂 |
1355 | 滑稽な石 | 945 | 岩塩堂 |
1400 | 暗い蛍光灯 | 945 | 非電気店 |
1402 | 睡眠コーヒー | 315 | うつけ堂 |
行の削除
データは挿入するだけではありません。削除することも必要になるでしょう。不要になったデータをいつまでも残しておくと、無駄な処理が増えることになり、RDB全体のパフォーマンスが下がります。定期的に不要なデータを削除するのも、RDBの管理には重要な作業になります。
DELETE FROM 商品マスタ WHERE 商品単価 > 500;
2行が削除されました。
このSQL文は、ここまで使ってきた「商品マスタ」表から、商品単価が「500」よりも大きいものを削除する処理を行っています。それでは、結果を確認してみましょう。
SQL文
SELECT * FROM 商品マスタ;
実行結果
商品コード | 商品名 | 商品単価 | 販売元 |
1201 | 角の固い豆腐 | 420 | うつけ屋 |
1300 | 透明なインク | 189 | 裸の王様堂 |
1402 | 睡眠コーヒー | 315 | うつけ堂 |
DELETE FROM 商品マスタ;
3行が削除されました。
「商品マスタ」表では、先ほど確認したときに、3行残っていましたから、その3行が削除されたことになります。
また、データを削除するにはTRUNCATE TABLE文を使うこともできます。TRUNCATE TABLE文はログの保存などといった処理を行わないため、高速に全行を削除できるのが特徴です。TRUNCATE TABLE文に関してはこちらを参照してください。
また、データを削除するときに注意しなければならないのが、データの整合性の問題です。例えば、ある表のある列が外部キーになっているとします。このとき、外部キーが参照されている状態で行を削除すると、参照している表の行は参照している先がなくなってしまい、整合性がとれなくなります。この「参照整合性」に関しての詳細はこのサイトでは説明しませんが、外部キーによる整合性には注意するようにしてください。