テーブルの作成とデータの登録

この章のコードはSample_SQL10.txtを使用します。

ここではSQLを使用してテーブルを作成する方法を学びます。また、作成したテーブルにデータを登録したり、そのデータを修正したり削除したりする方法も学びます。

9章まではBaseUI機能であるクエリーデザイン画面上でSQLを実行・検証してきましたが、Baseクエリーはそもそもデータ操作言語(DML)の内、主としてSELECT文を自動生成して実行させるオブジェクトです。そのため、データ定義言語(DDL)やデータ制御言語(DCL)としてのSQLには対応しておりません。(DDLDCLの詳細については第1章「SQLとはを参照して下さい。)
そこで、ここ第10章ではBaseクエリーを使わず、メニュー「ツール>SQL」を選択すると開くダイアログボックス「SQLステートメントを実行する」を使用してSQLを実行し、結果を検証することにします。

テーブル作成

テーブルを作成する場合、CREATE TABLE文を使用します。

SQLの書式は下記のとおりです。
<
書式10.1>
CREATE TABLE <
テーブル名>(
<
列名1> <データ型1> <属性1>,
<
列名2> <データ型2> <属性2>,
     .
     .
     .
<
列名n> <データ型n> <属性n>
);

 テーブル名に続く括弧内に各列(フィールド)を定義します。ひとつの列には列名、データ型、属性を記述します。また、列と列の間は,で区切ります。

例としてテーブル「Prefecture」をSQL上で定義し、それを実行することによりBase上にテーブルを作成してみましょう。

<SQL10.1>
CREATE TABLE Prefecture(
     IDINTEGER PRIMARY KEY,
     NameVARCHAR(4),
     PronouncingVARCHAR(10)
);

 <SQL10.1>ではテーブル「Prefecture」(都道府県マスター)を定義します。最初の列は「ID」(都道府県ID)で整数とし、プライマリーキー設定します。次の列は「Name」(名称)でテキスト4文字とします。3番目の列は「Pronouncing」(ふりがな)でテキスト10文字とします。

それでは、このSQLコードを使用してBase上にテーブルを作成することにしましょう。
下図のようにBase編集画面の左ペイン「データベース」欄の「テーブル」を指定し、メニュー「ツール>SQL」を選択します。

すると、下図のようにダイアログボックス「SQLステートメントを実行する」が表示されますので、「実行コマンド」欄に<SQL10.1>のコードを入力するか、またはSample_SQL10.txtを開いて<SQL10.1>のコードをコピペし、ボタン[実行]をクリックします。

すると、下図のように「状態」欄に「1:コマンドは正常に実行されました」と表示されますので、ボタン[閉じる]をクリックします。

ダイアログボックスを閉じた直後の状態ではBase編集画面上、なにも変化がありませんが、次に下図のようにメニュー「表示>テーブルの更新」を選択してください。

すると、下図のように右ペイン下部のテーブル一覧にテーブル「Prefecture」が追加されて表示されるので、テーブル名を右クリックし、コンテキストメニューから「編集」を選択します。
(注)これを「テーブルを編集モードで開く」といいます。

すると下図のようにテーブル「Prefecture」が意図どおりに作成されたことが確認できます。

データ入力

テーブルにデータを入力する場合、INSERT文を使用します。

SQLの書式は下記のとおりです。
<
書式10.2>
INSERT INTO <
テーブル名>(<列名1>,<列名2>,)
     VALUES(
<
1>,<2>,);

 テーブル名に続く括弧内に列名を記述し、VALUES句の括弧内の各列に対応する位置にセットする値を記述します。列の数と値の数は同じでなければなりません。

<SQL10.2>
INSERT INTO Prefecture(ID,Name,Pronouncing)
     VALUES(1,
北海道’,ほっかいどう);

それでは、このSQLコードを使用してテーブル「Prefectureにデータ入力することにしましょう。
図のようにメニュー「ツール>SQL」を選択して開いたダイアログボックス「SQLステートメントを実行する」の「実行コマンド」欄に<SQL10.2>のコードコピペし、ボタン[実行]をクリックします。

すると、下図のように「状態」欄に「1:コマンドは正常に実行されました」と表示され、「出力」欄に「1rows updated」と表示されますので、ボタン[閉じる]をクリックします。

下図がテーブル「Prefecture」をダブルクリックして開いた状態です。SQLに記述したとおりのデータが1レコード登録されていることが確認できます。

データ入力(列名省略形)

INSERT文では、全ての列に値をセットする場合に限り、列名を省略することができます。
SQL
の書式は下記のようになります。
<
書式10.3>
INSERT INTO <
テーブル名> VALUES(<1>,<2>,);

<SQL10.3>
INSERT INTO Prefecture VALUES(2,青森県’,あおもりけん’);

ダイアログボックス「SQLステートメントを実行する」を開き、「実行コマンド」欄に<SQL10.3>のコードコピペし、ボタン[実行]をクリックします。
すると、下図のように「状態」欄に「1:コマンドは正常に実行されました」と表示され、「出力」欄に「1rows updated」と表示されますので、ボタン[閉じる]をクリックします。

下図がテーブル「Prefecture」をダブルクリックして開いた状態です。2件目のデータが1レコード追加されていることが確認できます。

データ入力(連続入力)

INSERT文を複数同時に実行することができます。各INSERT文の文末には;を忘れずに記述して下さい。このように複数の命令文を一度に実行するSQL文を「マルチステートメント」といいます。

<SQL10.4>
INSERT INTO Prefecture VALUES(3,
岩手県’,いわてけん’);
INSERT INTO Prefecture VALUES(4,
宮城県’,みやぎけん’);
INSERT INTO Prefecture VALUES(5,
秋田県’,あきたけん’);

ダイアログボックス「SQLステートメントを実行する」を開き、「実行コマンド」欄に<SQL10.4>のコードコピペし、ボタン[実行]をクリックします。
すると、「状態」欄に「1:コマンドは正常に実行されました」と表示され、「出力」欄に「1rows updated」と表示されますので、ボタン[閉じる]をクリックします。
下図がテーブル「Prefecture」をダブルクリックして開いた状態です。3件目以降のデータが3レコード追加されていることが確認できます。

データ入力(検証SQL付き)

これまでINSERT文を実行した後に毎回テーブル「Prefecture」をダブルクリックで開いて検証してきました。これでは操作に手間が掛かるので、これから先はダイアログボックス内で検証できるように工夫してみましょう。

<SQL10.5>
INSERT INTO Prefecture VALUES(6,
山形県’,やまがたけん’);
INSERT INTO Prefecture VALUES(7,
福島県’,ふくしまけん’);
INSERT INTO Prefecture VALUES(8,
茨城県’,いばらぎけん’);
SELECT * FROM Prefecture;
(注)4番目の文は検証のためのSELECT文です。

下図のようにダイアログボックス「SQLステートメントを実行する」を開き、「実行コマンド」欄に<SQL10.5>のコードコピペし、今回からはチェックボックス「”select”ステートメントの出力を表示」をONにしてボタン[実行]をクリックします。

すると、下図のように「状態」欄に「1:コマンドは正常に実行されました」と表示され、「出力」欄にテーブル「Prefecture」の内容が表示されます。これで6件目以降のデータが3レコード追加されていることが確認できます。

データ更新

データの更新はUPDATE文で行います。

SQLの書式は下記のとおりです。
<
書式10.4>
UPDATE <
テーブル名> SET <列名1>=<1>,<列名2>=<2>,
     WHERE
<
条件式>;

(注)UPDATE文には必ずWHERE句を記述して更新するレコードを限定して下さい。記述しないと全てのレコードが更新対象になってしまいますので注意してください。

前節で<SQL10.5>を実行して登録したID=8のレコードのふりがな4文字目が「ぎ」になっています。茨城県は「いばらきけん」と「き」に濁点がないのが正式名称ですので、これを更新します。

<SQL10.6>
UPDATE Prefecture SET Pronouncing”=
いばらきけん
     WHERE ID”=8;
SELECT * FROM Prefecture;
 2番目のSELECT文が検証のためのSQLです。

ダイアログボックス「SQLステートメントを実行する」の「実行コマンド」欄に<SQL10.6>のコードコピペし、チェックボックス「”select”ステートメントの出力を表示」をONにしてボタン[実行]をクリックします。
すると、下図のように「状態」欄に「1:コマンドは正常に実行されました」と表示され、「出力」欄にテーブル「Prefecture」の内容が表示されます。これでID=8のレコードのふりがなが「いばらきけん」に更新されていることが確認できます。

データ削除

データの更新はDELETE文で行います。

SQLの書式は下記のとおりです。
<
書式10.5>
DELETE FROM <
テーブル名> WHERE <条件式>;
(注)DELETE文も
UPDATE文のように、必ずWHERE句を記述して削除するレコードを限定して下さい。記述しないと全てのレコードが削除対象になってしまいますので十分注意してください。

<SQL10.7>
DELETE FROM Prefecture WHERE ID”=1;
     SELECT * FROM Prefecture;

<SQL10.7>の実行結果】
ここまで学習を進めてきた方はダイアログボックス「SQLステートメントを実行する」の操作法に十分慣れたと思われますので、これ以降は操作手順の記述を省きます。
実行すると下図のように「出力」欄にテーブル「Prefecture」の内容が表示されますので、ID=1のレコード(北海道)が削除されているのが確認できます。

テーブル削除

Base編集画面上でテーブルを削除する場合は、テーブル一覧に表示されているテーブル名を指定して右クリックし、コンテキストメニューより「削除」を選択すれば削除することができますが、ここではSQLを使用して削除する方法を学びます。

テーブル削除はDROP文で行います。
SQLの書式は下記のとおりです。
<
書式10.6>
DROP TABLE <
テーブル名>;

<SQL10.8>
DROP TABLE Prefecture_2;

<SQL10.8>の実行結果】
上記SQLを読んで気づかれたことと思いますが、ファイル「Sample_SQL.txt」に掲載した<SQL10.8>は「DROP TABLE Prefecture;」になっています。実装されたテーブル「Prefecture」にはこれまでの実装体験で既にデータを入力してあり、この後も検証に使用しますので、ここではテーブル「Prefecture」を削除せず、削除対象テーブルの名前を「Prefecture_2」としました。しかし、テーブル「Prefecture_2」は未だ実装されていないので、このままでは削除することができません。
そこで、削除するためのテーブル「
Prefecture_2」を作成することにします。コードは<SQL10.1>を使います。ただし、CREATEするテーブル名を「Prefecture_2」に変更して実行して下さい。
実行後、メニュー「表示>テーブルの更新」を選択してテーブルPrefecture_2が作成されたことを確認して下さい。
テーブルの存在確認が済んだら、上記<SQL10.8>を実行して下さい。
実行後、再びメニュー「表示>テーブルの更新」を選択してテーブルPrefecture_2が削除されたことを確認して
下さい。

データ入力(INSERT文によるテーブルTOテーブル)

INSERT文を使用して既にデータ登録してあるテーブルから同じ構造の別テーブルにデータを複写して登録することができます。

SQLの書式は下記のとおりです。
<
書式10.7>
INSERT INTO <
出力テーブル名>
     SELECT * FROM <
入力テーブル名> WHERE <
条件式>;

<SQL10.9>
CREATE TABLE 東北地方(
     IDINTEGER PRIMARY KEY,
     NameVARCHAR(4),
     PronouncingVARCHAR(10)
);
INSERT INTO
東北地方
     SELECT * FROM PrefectureWHERE ID”>1 AND ID”<8;
SELECT * FROM
東北地方;
 <SQL10.9>3つのSQL文からなるマルチステートメントです。
1
番目の文は
<SQL10.1>と同じですが、テーブル名を「東北地方」としています。このように出力先のテーブルを最初に作成しておきます。
2
番目の文はINSERTですが、VALUE句の代わりに入力テーブルから検索するSELECT文をはめ込んでいます。(これもサブSQLの例です。)こうすることにより、入力した各列の値をそのまま出力テーブルの各項目にセットすることが可能になります。
3
番目の文は検証のためのSELECT文です。

<SQL10.9>の実行結果】
下図のように「出力」欄にテーブル「東北地方」の内容が表示されます。これでID=2からID=7までの東北6のレコードがテーブル「東北地方」に登録されたことが確認できます。

 もちろん、ダイアログボックスを閉じ、メニュー「表示>テーブルの更新」を選択した後にテーブル「東北地方」をダブルクリックして開いてもデータ内容を確認することが可能です。

データ入力(SELECT文によるテーブルTOテーブル)

SELECT文を使用すると予め出力テーブルを作成しておかなくてもデータを複写して登録することができます。また、出力テーブルの種類を選択することが可能です。
SQL
の書式は下記のとおりです。
<
書式10.8>
SELECT <
列名1>,<列名2>,
     INTO
[CACHED|TEXT|TEMP] <
出力テーブル名>
     FROM <
入力テーブル名>
     WHERE <
条件式>;
(
1
INTO
句の[CACHED|TEXT|TEMP]はテーブルの種類のオプションで、「CACHED」はデフォルトです。各オプションの意味は下記の通りです。
CACHED:Base上にオブジェクトとして登録される、キャッシュテーブルが作られる
TEXT:キャッシュテーブルが作られると同時にデータベースファイルの外側にCSVファイルが出力される
TEMP:テンポラリーテーブルが作られる

(
2
指定したテーブルの列のタイプがそのまま出力テーブルの出力テーブルの列のタイプとして使われます。

<SQL10.10>
SELECT ID,Name,Abbreviation
     INTO CACHED State_2
     FROM State;
SELECT * FROM State_2;

<SQL10.10>の実行結果】
下図のように「出力」欄にテーブル「State_2」の内容が表示され、テーブル「State」に登録された全レコードがコピーされて出力されたことが確認できます。
もちろん、今回もメニュー「表示>テーブルの更新」を選択してテーブル
State_2が作成されたことを確認することができます。

<SQL10.11>
SELECT ID,Name,Abbreviation
     INTO TEXT State_3
     FROM State;
SELECT * FROM State_3;

<SQL10.11>の実行結果】
下図のように「出力」欄にテーブル「State_3」の内容が表示され、テーブル「State」に登録された全レコードがコピーされて出力されたことが確認できます。

今回もメニュー「表示>テーブルの更新」を選択してテーブルState_3」が作成されたことを確認してみましょう。
下図の破線で囲ったオブジェクトが作成されたテーブルState_3」ですが、外部ファイルに出力された状態を示すアイコンになっています。

また、実行・検証に使用しているデータベースファイルBase_SQL練習.odbが格納されているフォルダーの直下にCSVファイル「state_3.csv」が外部ファイルとして出力されていますので、エディター等で開いて内容を確認してみましょう。
下図はサクラエディターで開いた状態のstate_3.csvです。

(注)現在のところ、残念ながら全角文字には対応していないので文字化けが生じます。半角文字または数値のフィールドに限定して活用するとよろしいでしょう。

<SQL10.12>
SELECT ID,Name,Abbreviation
     INTO TEMP State_4
     FROM State;
SELECT * FROM State_4;

<SQL10.12>の実行結果】
下図のように「出力」欄にテーブル「State_4」の内容が表示され、テーブル「State」に登録された全レコードがコピーされて出力されたことが確認できます。

ここでメニュー「表示>テーブルの更新」を選択してテーブルState_4」が作成されたことを確認してみると、今回はテーブル一覧に表示されません。このように、テンポラリーテーブルはテーブル一覧に表示されないのです。
ちなみに<SQL10.12>を再度実行してみると、「状態」欄にエラーメッセージ「1:Table already exist State_4 in statement…」が表示されて実行されません。

<SQL10.13>
DROP TABLE IF EXISTS State_4;
SELECT ID,Name,Abbreviation
     INTO TEMP State_4
     FROM State;
SELECT * FROM State_4;

最初の文は予めテーブル「State_4」を削除するためのSQLですが、存在しない場合にエラーとなることを避けるために「IF EXISTS」という条件を加えています。こうしておけば、このSQLを最初に実行する場合でも2度めに実行する場合でもエラーを発生させずに実行させることができます。
2
番目以降の文は
<SQL10.12>と同じです。

<SQL10.13>の実行結果】
下図のように<SQL10.12>と同じ結果が確認できます。

テーブルの存在確認

前節でも述べたように、テンポラリーテーブルはテーブル一覧に表示されません。テンポラリーテーブルを作成した直後ならテーブル名を知っていますから、不要な場合にDROP文で削除できますが、何度かSQLを実行した後に、一体いくつのテンポラリーテーブルが登録されているか知りたくなることがあるでしょう。そうした場合はテーブル「SYSTEM_TABLES」から情報を得る方法があります。

SQLの書式は下記のとおりです。
<書式10.9>
SELECT <
列名1>,<列名2>,
     FROM <
スキーマ名>.<テーブル名>
     WHERE <
条件式>;

(注)実はSELECT文ではFROM句で<スキーマ名>.<テーブル名>と記述するのが正式な書式です。
ここで「スキーマ」について解説しておきます。
DBMSを学習すると「スキーマ」という用語が出てきて、その扱い方法に苦労する事があります。スキーマは簡単にいうと、「データベース全体を理解するために割り当てられた構造」のことです。Windowsエクスプローラーにおけるフォルダーのようなものと考えて頂いてもいいでしょう。そして定義されたスキーマの配下にテーブルを定義するわけです。皆さんがBaseを使用する上で、普段はスキーマを意識する必要はありませんが、内部的には「PUBLIC」というスキーマ名が付けられています。
Base
にはスキーマPUBLIC」のほかに、システムが管理するために用意されているスキーマ「INFORMATION_SCHEMA」があります。今回はその配下にあるテーブルSYSTEM_TABLES」から情報を取得します。

<SQL10.14>
SELECT TABLE_NAME
     FROM INFORMATION_SCHEMA”.”SYSTEM_TABLES
     WHERE TABLE_NAME NOT LIKE SYSTEM_%;

(注)テーブルSYSTEM_TABLES」には全てのテーブル名が格納されていますが、その中にはシステムが管理するためのテーブルもあります。それらは頭に「SYSTEM_」がついていますので、WHERE句にキーワード「NOT LIKE」を付け、あいまい検索で「SYSTEM_」がついているテーブル名を対象から外しています。
蛇足ですが、
<SQL10.14>からキーワード「NOT」を削除して実行するとシステムが管理するためのテーブルの名前の全貌が分かります。

<SQL10.14>の実行結果】
下図の破線で囲ったテーブル名が、テーブル一覧に表示されないテンポラリーテーブルState_4です。

 このSQLはクエリーデザイン画面上でも実行可能です。

テーブル更新

ALTER文を使用してテーブルの構造や属性等の変更を行うことができます。

列の追加

テーブルに列を追加するにはALTER TABLE文にADD COLUMNを記述します
SQL
の書式は下記のとおりです。
<
書式10.10>
ALTER TABLE <
テーブル名>
     ADD COLUMN <
列名> <データ型> <属性>;

<SQL10.15>
ALTER TABLE State
     ADD COLUMN CapitalVARCHARA(10);

(注)テーブルState」に新たな列「Capital」(州都)を追加するSQLです。列は最終列として追加されます。

<SQL10.15>の実行結果】
<SQL10.15>を実行し、メニュー「表示>テーブルの更新」を選択した後にテーブル「State」を編集モードで開いてください。
下図のように破線で囲った部分が新たに追加された列
Capitalです。

列の削除

テーブルの列を削除するにはALTER TABLE文にDROP COLUMNを記述します
SQL
の書式は下記のとおりです。
<
書式10.11>
ALTER TABLE <
テーブル名>
     DROP COLUMN <
列名>;

<SQL10.16>
ALTER TABLE State
     DROP COLUMN Capital;

<SQL10.16>の実行結果】
<SQL10.16>を実行し、メニュー「表示>テーブルの更新」を選択した後にテーブル「State」を編集モードで開いてください。列Capital」が削除されたのが確認されます。

自動採番の値変更

最後にALTER TABLE文で自動採番の値を変更する例を紹介しましょう。
プライマリーキーを自動採番で登録するテーブルは前回までの採番の値を記憶していますが、その値をリセットするSQLです。
SQL
の書式は下記のとおりです。
<
書式10.12>
ALTER TABLE <
テーブル名>
     ALTER COLUMN <
列名> RESTART WITH <>;

 このSQL例は当塾「知っていますか」のページ、Baseでプライマリーキーの自動採番をリセットするにはで詳しく説明していますので、そちらの記事をご覧ください。

【講座を終えるに当たって
当講座では全ての機能を紹介しきれていません。Base SQLにはまだまだ多くの関数や構文が用意されています。
もっと詳しく知りたい方は他のDBMSSQLであってもBase上で実行したら有効に働く場合がありますので、試してみて下さい。
1章でも説明したように、この講座はBaseのデフォルト埋め込みデータベースエンジンHSQLDBの仕様に沿ってSQL文を紹介しましたが、HSQLDBSQLMySQLに文法が近いので、より深く研究される方はMySQLの関数や構文を参考にするといいでしょう。

これにてBase SQL講座は終了と致します。お疲れ様でした。

Back> 9.集約時のグループ化
Back>>「Base SQL講座 コースの内容」

タイトルとURLをコピーしました