連載
» 2001年04月11日 00時00分 UPDATE

SQL実践講座(12):データの登録を行うINSERT文

[篠原光太郎,@IT]

前回作成したテーブルにデータを登録してみよう

 今回は、データの登録を行うINSERT文を紹介します。前回(第11回「CREATE文をさらに使いこなそう」)では、「CardInfo」という名前の新しいテーブルを作成しました。今回はこのテーブルにデータを登録していきます。CardInfoテーブルの最新の定義の状態は次の画面のとおりになっているはずです。もう一度確認しておきましょう。

画面1 前回定義した、CardInfoテーブルのプロパティを確認したところ(画面をクリックすると拡大表示します) 画面1 前回定義した、CardInfoテーブルのプロパティを確認したところ(画面をクリックすると拡大表示します)

 では、このテーブルに次のデータを登録します。

項目名 項目の定義
カード番号 6けた数字のカード番号 NW0001
顧客 カード発行先の顧客 ALFKI
発行日 発行した年月日 2001/4/1
有効期限 有効期限の年月日 2002/4/1
発行した従業員 カードを発行した従業員 7
発行ID 発行通し番号

 顧客は、Customersテーブルに登録されているAlfreds Futterkiste社のMaria Anders氏で、顧客IDはALFKIです。また、カードを発行した従業員は、Employeesテーブルに登録されているKing Robert氏で、従業員番号は7です。発行IDはIDENTITY指定がしてあるので、データを指定しなくても自動的に採番されます。

 では、このデータをCardInfoテーブルに登録してみましょう。次のSQL文を実行します。

【例1】

INSERT INTO CardInfo (
  CardID,
  CustomerID,
  IssueDate,
  ExpireDate,
  EmployeeID
)
VALUES
(  'NW0001',
   'ALFKI',
   '2001/4/1',
   '2002/3/31',
   '7'
)
画面2 INSERT文でCardInfoテーブルにデータを挿入する(画面をクリックすると拡大表示します) 画面2 INSERT文でCardInfoテーブルにデータを挿入する(画面をクリックすると拡大表示します)

 構文の解説をする前に、データがぶじ登録されたことを確認しましょう。次のSQL文を実行します。

【例2】

SELECT * FROM CardInfo
画面3 SELECT文で、先ほど画面2で登録した内容が反映されているかを確認したところ(画面をクリックすると拡大表示します) 画面3 SELECT文で、先ほど画面2で登録した内容が反映されているかを確認したところ(画面をクリックすると拡大表示します)

 データが登録されているのが確認できますね。IssueID列へはデータの指定をしませんでしたが、前回のテーブル作成時に初期値に指定した「1000000000」番が採番され、登録されているのも確認できます。

INSERT文の使い方

 では、例1のSQL文を解読してみましょう。データの登録には「INSERT」文を使用します。INSERT文は、テーブルに行を新たに追加します。よって、例1を仮にもう一度実行したとすると、まったく同じ行がもう1行追加されてしまいます。本来のCardInfoテーブルの使用目的からすれば、同じカード番号のデータが複数登録されてしまうと不都合が起きますので、これを避けるための方法が別途用意されています。この解説は次回行います。

 さて、INSERT文は、まずデータを登録するテーブルを指定するところから始まります。例1では「INTO CardInfo」としている部分が該当します。INTO句はテーブル名に引き続き、列の指定をします。( )の中に、データ登録に必要な列名をカンマで区切って並べます。列の定義時に「NULLの許可」をしなかった列(つまり必須の列)は、最低でも指定する必要があります。ただし、デフォルト値の指定をした列は、もし値の指定をしなかった場合にはデフォルト値が設定されるので、INTO句の列で指定することは必須ではありません。

 INTO句の後には、さらにVALUES句が続きます。VALUES句にはINTO句で指定した列の順番に、登録する値をカンマ区切りで並べます。INSERT文の構文の基礎は、以上で終わりです。

 では、デフォルト値の効果を確かめるために、次のSQL文を実行してみましょう。

【例3】

INSERT INTO CardInfo (
  CardID,
  CustomerID,
  EmployeeID
)
VALUES
(  'NW0008',
   'ALFKI',
   '7'
)
画面4 画面2のときよりもINSERT文で値を登録するカラムの数を減らしておいて、デフォルト値の設定が有効かどうかを確認してみる(画面をクリックすると拡大表示します)

 IssueDate、ExpireDateは指定しませんでしたが、それぞれ既定値にセットした値が登録されているのが確認できますね。

 INSERT文は、すべての列に対して値を指定する場合には、INTO句を省略することが可能です。次の例を実行してみましょう。

【例4】

INSERT INTO CardInfo2
VALUES
(  'NW0010',
   'ALFKI',
   '2001/4/1',
   '2002/3/31',
   '7'
)

 「CardInfo」テーブルを例4で使用しなかったのは、IDENTITY列に対してはINTO句による列の指定なしに値の指定をすることができない、という制約があるからです。つまり、IDENTITY列を持つテーブルに対しては、常にINTO句で列の指定をする必要があります。

INSERTとSELECTの組み合わせ

 これまでの例では、データを1件ごとに登録する方法を紹介してきましたが、ほかのテーブルにあるデータを特定の条件で抽出して、テーブルに一括して登録する方法があります。これを紹介しましょう。

 SELECT文の解説の中で「サブクエリー」を取り上げましたが、ここでもサブクエリーを使用します。例えば、すべての顧客に対して顧客IDと同じカード番号のカードを発行する場合には、次のようなSQL文でCardInfoテーブルにデータを登録することができます。

【例5】

INSERT INTO CardInfo (
  CardID,
  CustomerID,
  EmployeeID
)
SELECT CustomerID, CustomerID, 7
  FROM Customers
画面5 SELECT文で抽出したデータをINSERT文でCardInfoテーブルに登録したところ(画面をクリックすると拡大表示します) 画面5 SELECT文で抽出したデータをINSERT文でCardInfoテーブルに登録したところ(画面をクリックすると拡大表示します)

 これまでの例と違うのは、VALUES句の代わりにSELECT文を使用していることです。例5のSELECT文の個所が、サブクエリーになります。ここで注意が必要なのは、INTO句とSELECT文の列の並びを、順序、個数ともに正確に合わせることです。

今回のまとめ

今回は、INSERT文について解説しました。次回は、キー(主キー、外部キー)について解説をしていきます



「SQL実践講座」バックナンバー

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。