SQL をコマンドプロンプトから使う

[Top 側へ一つ移動]

SQL について

SQL は表形式のリレーショナルデータベースを制御する言語で、データを定義する命令 (データ定義言語:DDL) とデータを処理する命令 (データ操作言語:DML) からできています。文の最後はセミコロンで終わらせる必要があります。セミコロンを書かないと文が終わってないとみなされて改行を入れても命令は実行されず、プロンプトが変化します。例えば次のような例があげられます(空白部分は全角を使用しているので見た目を似せています)。制御文の意味については取りあえず置いておいてください。
SQL>select * from book_name where contents = 'spacetechnology' and price < 4800 order by author_name asc
CON>;
    検索結果が表示される
また一般に以下のように分かち書きをして制御文をみやすくします。
SQL>select * from book_name
CON>  where contents = 'spacetechnology' and price < 4800
CON>  order by author_name asc;
なお、マニュアルには DSQL を使う場合は最後のセミコロンが不要であることを強調しています(今のところ関係ありません)。
SQL の各命令の説明に入る前に、InterBase で利用できるオブジェクト名 (テーブル名・フィールド名・インデックス名など) の命名規則やデータ型そして文字種 (キャラクタセット)の指定 について説明します。
InterBase でのデータ−ベースオブジェクト (テーブル名・フィールド名・インデックス名など) の命名規則
InterBase 6 で使えるデータ型
後述する CREATE TABLE 文で定義できるデータ型は、マニュアルによると以下の通りだそうです。
データ型 サイズ 範囲/精度 詳細
BLOB 可変長 なし (セグメントサイズは 64k まで) グラフィクスやテキスト、音声データ等のための動的にサイズが変化できるデータ型
セグメントを単位とする構造をもつ
サブタイプを持ち、それにより BLOB の内容を示せる
CHAR(n) n 文字 1〜32767byte 文字サイズが固定長の文字列を扱う
DATE 64bit 西暦 100 年 1月 1 日〜
西暦 32768 年 2 月 29 日
ISO 日付
DECIMAL(精度,スケール) 可変長
(16, 32, 64bit)
精度:全桁数で 1〜 18
スケール:小数点以下の桁数 1 〜 18
(ただし全桁数以下であること)
 
DOUBLE PRECISION 64bit ±2.225 x 10^-308 〜± 1.797 x 10^308 IEEE の倍精度で 15 桁が有効
FLOAT 32bit ±1.175 x 10 ^-38 〜 ±3.402 x 10^38 IEEE の単精度で 7 桁が有効
INTEGER 32bit -2,147,483,648 〜 2,147,483,647  
NUMEIC(精度,スケール) 可変長
(16, 32, 64bit)
精度:全桁数で 1〜 18
スケール:小数点以下の桁数 1 〜 18
(ただし全桁数以下であること)
 
SMALLINT 16bit -32768〜32767  
TIME 64bit 0 時 0 分 0 秒 〜
23 時 59 分 59 秒9999
ISC 時間
TIMESTAMP 64bit 西暦 100 年 1月 1 日〜
西暦 32768 年 2 月 29 日
時間情報も含む
VARCHAR(n) n 文字 1〜32765byte 文字サイズが可変長…日本語や中国語の様に 1Byte のものと 2Byte 以上の符号が混じるような…の文字列を扱う
VARCHAR() 型の文字種 (キャラクタセット) 指定
VARCHAR() 型で利用できる文字種の例を示します。
文字種 文字種の番号 サイズ (Byte)
最大値 最小値
ASCII 2 1 1
BIG5 56 2 1
CYRL 50 1 1
色々あって…日本語が使える文字種は…
EUCJ_0208 6 2 1
SJIS_0208 5 2 1
UNICODE_FSS 3 3 1
文字種を指定可能なことで例えば以下のような使い方ができます。
SQL>SET NAMES SJIS_0208;
配列
ここでは以下の命令について説明します。

データベースファイルを新規作成する (CREATE DATABASE)

isql を管理者権限で起動し、以下のように打ち込むと 'book_list.gdb' というデータベースファイルを作成できます。
SQL>CREATE DATABASE "book_list.gdb";
ユーザー名やパスワードを指定してデータベースを作れます。管理者権限でデータベースを作成する場合などに使えます。
SQL>CREATE DATABASE "book_list.gdb" user 'SYSDBA' password 'masterkey';
既存のデータベースファイル名を指定して CREATE DATABASE を実行してもエラーになります。新しくファイルを作成したいときにはファイル名を変えるか既存のファイルを削除しなければなりません。既存のファイルを使いたいときは CONNECT で接続します。

既存のデータベースファイルに接続する (CONNECT)

SQL>CONNECT "book_list.gdb";

テーブルを作成する (CREATE TABLE)

データベースに CONNECT した後、テーブルを定義するときに使う文です。項目ごとに注釈を入れたいので表を使います
SQL>CREATE TABLE books ( books という名前の表を作ります。定義する要素は '(' で括ります。
CON>book_code CHAR(4) NOT NULL, 'book_code' という名前の、最大 4 文字までの文字列を定義しました。後ろに NOT NULL と書くと、 INSERT 文などでデータを入力するときに値を必ず入れる必要が生じます。この要素は後ほど主キーとして指定しますが、主キーは必ず NOT NULL を指定しなければなりません。
CON>book_name VARCHAR(60) CHARACTER SET SJIS_0208 NOT NULL, 本の名前用に可変長の文字用の文字列を定義しました。文字要素には SJIS を使うよう指定しました。
CON>company_code CHAR(4), 出版社名を記録するために 'company_code' という要素を定義しました。この要素は後ほど外部キーとして定義します。よって他 (取りあえず 'companies' という名前) の表で既に定義済みでなければなりません
CON>price integer, 価格を整数値として定義しました。
CON>PRIMARY KEY (book_code), 主キーとして 'book_code' を指定しました。
CON>FOREIGN KEY (company_code) REFERENCES companies(company_code), 'company_code' を外部キーとして指定しました。'companies という表およびその中の ''company_code' という要素はこの 'books' よりも前に定義されていなければなりません。なお最後の定義要素にはカンマは不要です
CON>); ')' で閉じ、セミコロンで終わります
という訳で?'bookkist.gdb' というデータベースファイルを作成し、COMPANIES と BOOKS という表を作るサンプルをつけます。
制約条件について
列のデータは、制約条件をつけない場合は何も入力しなくても構わないのですが、登録番号など必ずデータが入らねばならない場合もあります。そのようなときに制約条件を指定します。上記サンプルでの 'NOT NULL' の記述は必ず入力しなければならないことを示しています。また、主キーの定義 (PRIMARY KEY() の部分) を行なった要素は NOT NULL を宣言しておかねばなりません。FOREIGN KEY () は外部キーであることを定義している部分です。

テーブルを編集する

データを追加する (INSERT)
SQL>INSERT INTO 表名 (列名1, 列名2, …) VALUES (値1, 値2, …);
この時、列名と値の順番は対応している必要がありますが、表中の列の順と対応している必要はありません。もし、表中のすべての列にデータを入れるのなら列名を省略できます。この場合、値の順番は表中の列の順番に対応している必要があります。
SQL>INSERT INTO 表名 VALUES (値1, 値2, …);
前述の booklist.gdb にいくつかの本と出版社のデータを追加するサンプルをつけます。書名は目の前の棚にあるものから適当に選びました。
また文字種が異なるデータベースの作成とアクセス例も示します。同じ本のリストを EUC で作成し、
受験番号、生年月日、および三種類のテスト (情報処理試験のような) の結果を擬似的に作るプログラム
データの追加 (INSERT) で副問い合わせを利用する
データを削除する (DELETE)
SQL>DELETE FROM 表名 WHERE 条件;
データを変更する (UPDATE)
SQL>UPDATE 表名 SET 列 1 = 値1, 列2 = 値2… WHERE 条件;
編集した内容を更新する (COMMIT)
編集した内容を破棄する (ROLLBACK)

テーブルから該当するデータを探す (SELECT)

SQL>select 列1[, 列2,…] from 表名;
表の中から特定の列を選びます (射影)
SQL>select 列1[, 列2,…] from 表1, 表2…;
複数の表を結合し、指定した列を選びます (結合/結合と射影)
WHERE
insert の項で示した擬似試験結果データベースにおいて test1 の点数が 90 点以上でかつ test2 と test3 の点数の合計が 190 点以上の人を選択する問い合わせ
select * from test_result where
test1 >= 90 and
(test2 + test3) >= 190;
test1 の点数が 80 点以上でかつ test2 と test3 の点数の合計が 160 点以上の人をの中で、誕生日が '1980-01-01' 〜'1980-01-31' の人を選択する問い合わせ
select * from test_result where
test1 >= 80 and
(test2 + test3) >= 160 and
birthday between '1980-01-01' and '1980-01-31';
IN
ORDER BY
GROUP BY (HAVING)
副問い合わせ

[Top 側へ一つ移動]