【SQLの基礎知識⑯】 データの操作(insert・update・delete)

SQLの基礎知識
SQLの基礎知識
この記事は約13分で読めます。

表に新しいデータを追加したり、データを新しい値に更新するといったことは、よく行う作業です。また、必要なくなったデータを削除することもあります。

ここでは、こういった表に対するデータ操作を解説していきます。

Recommended Articles

データの挿入

表にデータを挿入(追加)するときには、INSERT文を用います。INSERT文には大きく分けて2つの使い方があります。

  • 1行ずつデータを挿入する
  • 問合せ結果を挿入する

では、それぞれについて解説していきます。

1行ずつデータを挿入する

表に1行ずつデータを挿入するときには、INSERT...VALUES文を使います。INSERT...VALUES文の書式は次のようになります。

書式
INSERT INTO <表名> (<列名1>[,列名2...])
VALUES (<値1>[,<値2>...]);
実際にINSERT...VALUES文を記述するときには、気を付けなくてはならない点が2つあります。

列と値の記述する位置を対応させる

INSERT...VALUES文には原則的に列名と値のリストがあります。これを記述するときには、列名と値の並びが対応している必要があります。これがずれていると、意図しないところにデータが挿入されたり、エラーとなります。

対応する列とデータ型を一致させる

各列に入力する値は、その列のデータ型と一致していなくてはなりません。データ型が対応していないと、エラーとなります。

この2点に気を付けて INSERT...VALUES文を記述するようにしてください。では、実際にデータの挿入をしていきましょう。先に、表を作っておきます。次の例はORACLEでの表の作成で商品コード列が数値型でNULLはなし、「商品名」列は文字列型でNULLはなし、「商品単価」列は数値型、「販売元」列は文字列型に指定した」、「商品マスタ」表を作成しています。
SQL文  ORACLE
CREATE TABLE 商品マスタ (
商品コード INT NOT NULL,
商品名 VARCHAR2(16) NOT NULL,
商品単価 INT,
販売元 VARCHAR2(16)
);
表ができたら1行のデータを挿入してみましょう。
SQL文
INSERT INTO 商品マスタ
(商品コード,商品名,商品単価,販売元) VALUES (
1201, '角の固い豆腐', 400, 'うつけ屋');

実行結果  1行が作成されました。

表に実際に挿入されたかどうかを確認します。

SQL文
SELECT * FROM 商品マスタ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐400うつけ屋
行が指定した値で入力されています。後は入力するデータを同じ要領で追加していきます。ここでは、次の順にINSERT文を使って追加しました。
INSERT INTO 商品マスタ
(商品コード,商品名,商品単価,販売元) VALUES (
VALUES ( 1300, '透明なインク', 180, '裸の王様堂');
INSERT INTO 商品マスタ
(商品コード,商品名,商品単価,販売元) VALUES (
VALUES ( 1355, '滑稽な石', 890, '岩塩堂');
では、この2つのデータを順番に挿入した結果を見てみましょう。

SQL文
SELECT * FROM 商品マスタ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐400うつけ屋
1300透明なインク180裸の王様堂
1355滑稽な石890岩塩堂
結果を見ると、INSERT...VALUES文でデータを追加した順番に出力されているのがわかります。つまり、INSERT...VALUES文を使ったデータの追加では、表の最終行にデータが追加されることになります。
また、INSERT...VALUES文では、次の書式のように、列名の記述を省略することもできます。
書式  INSERT INTO <表名> VALUES (<値1>[,<値2>...]);
SQL文
INSERT INTO 商品マスタ VALUES
( 1400, '暗い蛍光灯', 1500, '非電気店');

実行結果  1行が作成されました。

SELECT文で問合せをして、追加されたデータを確認すると、一番最後にデータが追加されています。

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 <検索条件>;
書式を見てわかるように、SELECT文で問合せを行い、その結果を挿入することになります。
まずは、先ほど作った「商品マスタ」表のデータをすBて、新しく作成しておいた「商品バックアップ」表に追加します。このとき、「商品マスタ」表から「商品バックアップ」表に挿入するデータは、列名や列のデータ型などの定義が同じである必要があります。
SQL文
INSERT INTO 商品バックアップ
SELECT * FROM 商品マスタ
;
結果  4行が作成されました。
では、「商品バックアップ」表に、データ挿入されているか確認します。

SQL文
SELECT * FROM 商品バックアップ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐400うつけ屋
1300透明なインク180裸の王様堂
1355滑稽な石890岩塩堂
1400暗い蛍光灯1500非電気店

SELECT句で「*」を指定し、「商品マスタ」表のすべてのデータを挿入する指定にしたので、まったく同じデータが保存されています。すべての列のデータを挿入する場合には、両方の表の定義がまったく同じでなければなりません。

では次に、もう少し複雑な使用例を見てみましょう。「商品マスタ」表から商品単価が「500」以上の商品だけを選択し、先に作っておいた「高額商品一覧」表に挿入してみます。

入力
INSERT INTO 高額商品一覧
SELECT 商品コード,商品名,所品単価
FROM 商品マスタ WHERE 商品単価 > 500
;

実行結果  2行が作成されました。

SQL文
SELECT * FROM 高額商品一覧;
実行結果

商品コード商品名商品単価
1355滑稽な石890
1400暗い蛍光灯1500

WHERE句の検索条件を満たす行だけが、挿入されています。また、SELECT句で列を指定しているので、指定した列だけが挿入されました。列の指定をした場合には、両方の表がまったく同じ定義である必要はなく、指定した列の列名とデータ型の定義が同じであれば挿入することができます

このように、INSERT...SELECT文を使えば、さまざまな問合せの結果を別の表に挿入することができます。

NULLの挿入

表に値を挿入するときに、行の中で値が存在しない列があることがあります。このようなときには表の該当する列にNULLを挿入します。NULLに関しては、こちらを参照してください。

【SQLの基礎知識⑦】 SQLにおけるNULLの扱い
NULLとは、値が存在していないことを言います。この章では、最低限知っておくべきSQLにおけるNULLの扱い方を習得できます。いちれべ.comは、オラクル、MS-SQL、MS-Access で使用可能か一目でわかるサイトです。

NULLを挿入するときには、INSERT...VALUES文で、列の該当する部分の値を「NULL」と記述します。

SQL文
INSERT INTO 商品マスタ VALUES (
 1402, '睡眠コーヒー', NULL, 'うつけ堂');

実行結果  1行が作成されました。

SQL文
SELECT * FROM 商品マスタ;
実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐400うつけ屋
1300透明なインク180裸の王様堂
1355滑稽な石890岩塩堂
1400暗い蛍光灯1500非電気店
1402睡眠コーヒー うつけ堂

この使用例はORACLEを使っているので、NULLを指定した「商品単価」列には空白となっています。

NULLの挿入には注意することがあります。表を作成するときに「NOT NULL」と指定して、NULLを入れられないように定義している列に、NULLを入れるとエラーになります。そのため、NULLを挿入する場合には、NOT NULL制約があるかどうかを確認してから行う必要があります。

【SQL】 INSERT(データを挿入する)の使い方
表にデータを挿入するのが、INSERT文です。列と値を指定して挿入するときには、列と値の個数、対応する列と値のデータ型が一致している必要があります。列に空の値をいれたいときには「NULL」と記述します。INSERT文の2つの書式について、活用時の注意事項とともに詳しく解説しています。

データの更新

ここまでに、問合せとデータの挿入について解説してきました。この他に、データを処理するときに重要なものとしてデータの更新処理があります。SQLで更新を行うときに用いるのはUPDATE文です。

書式
UPDATE <表名> SET <列名1>=<値1>[,<列名2>=<値2>...] WHERE <検索条件>;
UPDATE文は、表中でWHERE句の検索条件を満たす列のSET句で指定された列を、SET句で指定した値に更新します。
「商品マスタ」表で、睡眠コーヒーの商品単価の値をNULLにしています。このNULLを「300」に変更してみます。
SQL文
UPDATE 商品マスタ SET 商品単価 = 300
WHERE 商品名='睡眠コーヒー'
;

実行結果  1行が更新されました。

SQL文
SELECT * FROM 商品マスタ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐400うつけ屋
1300透明なインク180裸の王様堂
1355滑稽な石890岩塩堂
1400暗い蛍光灯1500非電気店
1402睡眠コーヒー300うつけ堂

空白であった睡眠コーヒーの「商品単価」列が「300」に更新されています。

UPDATE文っでは、WHERE句の検索条件で複数行の結果を返すようにしておくと、結果のすべての行の値を更新することができます。また、検索条件を設定しなければ、表の全行の値を変更することもできます。

次の例では、商品単価「800」以上の商品の商品単価を、すべて「900」に変更しています。

SQL文
UPDATE 商品マスタ SET 商品単価 = 900
WHERE 商品単価 >= 800
;

実行結果  2行が更新されました。

SQL文
SELECT * FROM 商品マスタ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐400うつけ屋
1300透明なインク180裸の王様堂
1355滑稽な石900岩塩堂
1400暗い蛍光灯900非電気店
1402睡眠コーヒー300うつけ堂

商品単価が「800」以上だった、「滑稽な石」と「暗い蛍光灯」の「商品単価」列の値が「900」に更新されています。

また、UPDATE文では、次のように更新する値を演算により作り出すこともできます。

SQL文
UPDATE 商品マスタ SET 商品単価 = 商品単価 * 1.05;
実行結果 5行が更新されました。
このUPDATE文では「商品単価」列を1.05倍する演算をすべての行に対して行っています。更新されたかどうかを確認するために問合せを行ってみます。

SQL文
SELECT * FROM 商品マスタ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐420うつけ屋
1300透明なインク189裸の王様堂
1355滑稽な石945岩塩堂
1400暗い蛍光灯945非電気店
1402睡眠コーヒー315うつけ堂
更新は既存のデータを更新するわけですから、使用にあたっては十分に注意する必要があります。もしも、間違えて更新してしまった場合には、大半のRDBMS製品では ROLLBACKでもとに戻すことができるはずです。
【SQL】 UPDATE(データを更新する)の使い方
UPDATE文は、表内のデータを更新するときに使います。UPDATEキーワードの後ろに更新対象の表名を記述し、SETキーワードの後ろにデータを更新する列名と更新する値を指定します。指定は「,」(カンマ)で区切ることで、複数の列の値を更新することが可能です。

行の削除

データは挿入するだけではありません。削除することも必要になるでしょう。不要になったデータをいつまでも残しておくと、無駄な処理が増えることになり、RDB全体のパフォーマンスが下がります。定期的に不要なデータを削除するのも、RDBの管理には重要な作業になります。

書式 DELETE FROM <表名> WHERE <検索条件>;
DELETE文は、WHERE句で指定した、表中の検索条件を満たす行を削除します。そのため、検索条件の記述により、1行から全行まで削除できます。
DELETE文は、データを削除するときに必ず行単位で削除し、行の中の各列の値ごとに削除することはできません。値を削除したい場合には、更新で使ったUPDATE文で、値を空にする処理を行います。
SQL文
DELETE FROM 商品マスタ WHERE 商品単価 > 500;
実行結果
2行が削除されました。

このSQL文は、ここまで使ってきた「商品マスタ」表から、商品単価が「500」よりも大きいものを削除する処理を行っています。それでは、結果を確認してみましょう。

SQL文
SELECT * FROM 商品マスタ;

実行結果

商品コード商品名商品単価販売元
1201角の固い豆腐420うつけ屋
1300透明なインク189裸の王様堂
1402睡眠コーヒー315うつけ堂
商品単価が「500」より大きい「滑稽な石」と「暗い蛍光灯」の2行が削除されていることがわかります。
また、DELETE文で、WHERE句を記述しなければ、すべての行を削除することになります。
SQL文
DELETE FROM 商品マスタ
;
実行結果
3行が削除されました。

「商品マスタ」表では、先ほど確認したときに、3行残っていましたから、その3行が削除されたことになります。

また、データを削除するにはTRUNCATE TABLE文を使うこともできます。TRUNCATE TABLE文はログの保存などといった処理を行わないため、高速に全行を削除できるのが特徴です。TRUNCATE TABLE文に関してはこちらを参照してください。

また、データを削除するときに注意しなければならないのが、データの整合性の問題です。例えば、ある表のある列が外部キーになっているとします。このとき、外部キーが参照されている状態で行を削除すると、参照している表の行は参照している先がなくなってしまい、整合性がとれなくなります。この「参照整合性」に関しての詳細はこのサイトでは説明しませんが、外部キーによる整合性には注意するようにしてください。

【SQL】 DELETE(データを削除する)の使い方
DELETE文は、表からデータを削除するときに使います。DELETE文はWHERE句により指定した条件に合致した行を表から削除します。WHERE句で条件を指定しない場合には、表のすべてのデータを削除することになります。また、すべてのデータを削除するときは、TRUNCATE TBLE を使います。

関連リンク

次の章へ進む
【SQLの基礎知識⑰】 ビューの取り扱い(VEIW)
表を増やすことなく、多様な要求に応えるのが「ビュー(View)」です。ビューは仮想表とも呼ばれます。この章では、VIEWの作成と削除について習得できます。いちれべ.comは、オラクル、MS-SQL、MS-Access で使用可能か一目でわかるサイトです。
目次
【SQLの基礎知識】基本ルールや基礎の基礎をマスターしよう
こちらの記事を読み進めることで、SQLの基礎が充分に身に付きます。これからSQLを身に着けたい初心者・入門者の方に最適です。データベース製品ごとに表現方法が異なることがありますので、ある程度SQLのスキルがある方も利用できるサイトです。
Recommended Articles