データベース千夜一夜第7回

データの加工命令(1)~レコードの追加とテーブルの作成 長谷川裕行
有限会社 手國堂

テーブルを作るもう一つの方法~INTO句

INSERT命令は、既存のテーブルにレコードを追加する命令でした。その動作を実際に試すため、CREATE TABLE命令で新規テーブルを作りました。

実は、SELECT命令で抽出したレコードをそのまま新規テーブルに保存する便利な方法があります。INTO句です。


- SELECT~INTOで抽出と追加を行う -

INTO句はSELECT命令と組み合わせて、以下のような書式で用います。

  SELECT <フィールドリスト>
  INTO <新規テーブル> FROM <追加元テーブル> ...

SELECT文のFROM句の前に“INTO <新規テーブル>”の一文を挿入する形で記述すれば、SELECT命令で抽出されたレコードセットが<新規テーブル>に追加されます。

先の例と同じように、「商品_mr」から在庫数が10未満のレコードを抽出し、それらを新規テーブル「在庫減少」に保存するなら、以下のようなSQLを記述します。

  SELECT 商品ID, 品名, 在庫 INTO 在庫減少 FROM 商品_mr WHERE 在庫 < 10

通常のSELECT文にアンダーラインの箇所を追加しただけです。



- INSERT命令とSELECT~INTOの使い分け -

テーブルにレコードを追加する方法として、INSERT命令とSELECT~INTOの2通りを紹介しました。両者は似ているようで微妙に異なり、目的によって使い分けることになります。

INSERT命令
既存のテーブルに次々とレコードを追加していくときに使います。今回の例ではCREATE TABLE命令で新規テーブルを作りましたが、実際には予めデータベースに準備した業務記録用のテーブルなどに、日々発生する業務の運行結果を追加していくような場合に用います。

ここでは例として単純なサブクエリを用いましたが、実際の業務処理ではリレーションを設定した複雑なクエリ式から新たなレコードセットを生成し、それを記録用のテーブルに書き写す場合に多用される命令です。


SELECT~INTO
処理の中で新規にテーブルを作成し、そこに一時的なデータを蓄えるような場合に用います。

例えば、名簿のテーブルから「千葉県在住の人」だけを抽出して宛名を印刷したり、あるいは販売結果のテーブルから特定の年齢層だけを抽出して購買傾向を分析するような場合です。

レコードセットとして処理の中だけにレコード群を存在させる場合と異なり、処理を終えても作成したテーブルを残すことができます。

但し、同じ命令を重複実行すると「既存の同名テーブルがある」というエラーになるため、処理内容によっては既存テーブルを削除するDROP TABLE命令と組み合わせて、以下のようなSQLを記述することもあります。実行するたびに、同じ名前で新たな内容のテーブルが作られます。

  DROP TABLE 在庫減少 ----- 既存テーブルを削除する
  SELECT 商品ID, 品名, 在庫
  INTO 在庫減少 FROM 商品_mr WHERE 在庫 < 10

DROP TABLE命令も、先述したCREATE TABLE命令と同じ「データ定義命令」なので、別の機会に詳しく説明しましょう。


あとがき

レコードを追加する命令とテーブルを作成する命令を紹介しました。特にレコードの追加は利用する機会が多いので、使い方をしっかり理解しておきましょう。INSERTとSELECT~INTOの違いを把握し、うまく使い分けてください。


- サンプルデータベースの扱いについて -

今回紹介したSQL文を実行すると、テーブルにレコードを追加したり、新規テーブルを作成するなど、サンプル・データベース“db1001ya”の内容を書き換えることになります。

書き換えた内容のまま使い続けても問題はありませんが、気になる方はサンプルを実行する前に“db1001ya”のバックアップを取っておいてください。手順は以下の通りです。

(1) SQL Serverのサービスマネージャを開く
(2) ボタンをクリックしてSQL Serverサービスを停止する
(3) データフォルダ(標準では“C:\MSSQL\Data”)内にある“db1001ya.mdf”を他のフォルダにコピー
(4) SQL ServerのサービスマネージャでをクリックしてSQL Serverサービスを開始する

元(書き換える前の内容)に戻すには、上記の(1)~(2)でSQL Serverを停止させ、SQL Serverのデータフォルダにある(書き換えられた)“db1001ya.mdf”を削除して、上記(3)で別フォルダに保存した“db1001ya.mdf”を元の場所にコピーします。

データベースごと削除して新たにダウンロードしたサンプル・データベースをインストールし直しても構いません。

本コラムの第3回で紹介しているダウンロード手順でサンプル・データベースをダウンロードし、先にスクリプト“DelExampleDb.sql”をクエリアナライザで実行して“db1001ya.mdf”を削除します。その上でダウンロードした“db1001ya-1.mdf”をSQL Serverのデータフォルダにコピーし、クエリアナライザで“AddExampleDb.sql”を実行します。

2つのスクリプトの内容は以下の通りです。詳しくは第3回のコラム末尾をお読みください。

DelExampleDb.sql
データベース“db1001ya”をSQL Serverから削除します。スクリプトは以下の1行です。

sp_detach_db db1001ya

AddExampleDb.sql
サンプルデータベースをSQL Serverに登録します。“db1001ya-1.mdf”をデータフォルダに保存してから実行してください。
スクリプトは以下のようになっているので、mdfファイルを異なる場所に保存したときは、アンダーラインの箇所を適切なパスに書き換えてください。

CREATE DATABASE db1001ya
ON PRIMARY (FILENAME = 'C:\MSSQL\Data\db1001ya-1.mdf')

FOR ATTACH
GO



Downloadサンプルファイル (LZH形式 764 B)


トップページ
データを加工する
レコードの追加~INSERT命令
テーブルを作成する命令~CREATE TABLE
SELECTとINSERTの組み合わせ
テーブルを作るもう一つの方法~INTO句
SELECT~INTOで抽出と追加を行う
INSERT命令とSELECT~INTOの使い分け
あとがき
Copyright © MESCIUS inc. All rights reserved.