# CHAPTER 2: Empress SQL の使用

## 2.1 はじめに

Empressは大きく複雑なプログラムですが、 ユーザーにとっては、コンピュータープログラミングや システムおいてどのようにデータが格納され、検索されるかを 知る必要はありません。 しかしながら、Empress を理解するためにコマンドを習得する必要はあります。 コマンドの数は多くなく、複雑でもありませんので、 基本コマンドを簡単に覚えることができ、すぐにそれを使用することができます。 この章では、基本のEmpress SQLコマンドについて示します。

## 2.2 データベースの構造

Empressのデータベースは、オペレーティングシステム上の １つのディレクトリとして作成されます。 このディレクトリは、データを蓄積するための複数のオペレーティング システムファイルが含まれます。 Empressは、これらのファイルとユーザーの間のインターフェイスと言えます。 例えば、テーブルを作成したときにEmpressは、 テーブルデータを格納するためのオペレーティングシステムファイルを作成します。 また、テーブルをアクセスするための問い合わせを行った場合は、 Empressが対応したオペレーティングシステムファイルから 情報を検索します。

データベースには、テーブルの集合が含まれ、 各テーブルには 0 個以上のレコードが格納されます。 各レコードには設定したアトリビュートの値を含み、 各アトリビュートはそのデータの特性の定義が含まれます。 例えば、例のデータベースの場合は、以下のような構造になります。

Database: |  | repairs
Tables: |  | personnel loans auto_parts customers
Records: |  |
    (personnel テーブル)

    10   Kilroy     426-9681      $500.00
     5   Mosca      544-2243      $750.00
    17   Wladislaw  723-6073       $50.00
     3   Jones      667-2951      $500.00
     8   Peterson   978-6060      $250.00
     4   Scarlatti  961-7363      $100.00
     9   Jordan     964-3335      $250.00
Attributes: |  |
    (personnel テーブル)

    number           integer
    name             char (25,1)
    phone            char(15,1)
    credit_limit     dollar

## 2.3 Empress データタイプ

Empressは、広く様々なデータタイプを提供します。 データタイプのリストを以下に示します。

表 2-1 Empress データタイプ

タイプ | 宣言
Character | `CHAR` または `CHARACTER` (長さ, タイプ) `TEXT` (表示長, 主記憶長, オーバーフロー記憶長, エクステント数) `NLSCHAR` または `NLSCHARACTER` (長さ, タイプ) `NLSTEXT` (表示長, 主記憶長, オーバーフロー記憶長, エクステント数)
Date | `DATE` (フォーマット) `TIME` (フォーマット) `MICROTIMESTAMP` (フォーマット)
Decimal | `DECIMAL` または `DEC` (全体の最大桁数, 小数部桁数) `DOLLAR` (全体の最大桁数, フォーマット)
Float | `REAL` `FLOAT` (小数部桁数) `LONGFLOAT` または `DOUBLE PRECISION`
Integer | `INTEGER` または `INT` `LONGINTEGER` `SHORTINTEGER` または `SMALLINT`
ユーザ解釈のデータ型 (バイトストリーム) | `MULTIMEDIA` または `BULK` (表示長, 主記憶長, オーバーフロー記憶長, エクステント数)

NULL値は、特別の形式で内部に格納され, `NULL` キーワードを使用することにより、 NULL値を入力、検索が可能です。

Empressデータタイプの詳細な説明は、 Empress SQL: リファレンスマニュアルを 参照してください。

### 2.3.1 文字データ

`CHARACTER`データタイプは、 固定長の文字列データを格納するための データタイプで、入力データのための 3 つのタイプがあります。

表 2-2 Empress CHARACTER データ型のタイプ

タイプ | 説明
タイプ 1 | 印字可能な文字だけを格納し、 データの前後に空白がある場合、取り除きます。
タイプ 2 | 印字可能な文字だけを格納し、 データの前後に空白がある場合、取り除かず、 入力されたとおりに格納します。
タイプ 3 | `NULL`以外の任意のASCII文字を格納します。

例えば、`personnel`テーブルの`name`アトリビュートは、

       name   CHAR (25,1)

25 文字の長さの固定長の文字データを扱い、データの前後に空白がある場合、 取り除かれます。

### 2.3.2 テキストデータ

`TEXT`データタイプは、可変長文字列タイプで、 少ない文字から複数ページに渡る可変の文字列を扱うためのデータタイプです。

例えば`customers`テーブルの`comments`アトリビュートは、

       comments  TEXT (25, 0, 80, 1)

表示長が 1行に25 文字、メインテーブルに文字を格納せずに オーバーフローテーブルに固定長レコードとして 80 バイトを格納し、 メインテーブルのオーバーフロー拡張ポインタ領域を1つ持つ、 可変長文字列の定義になります。

### 2.3.3 National Language Support (NLS) データ

Empressは、the ISO Latin1 のソートメカニズムに一致する すべてのNational Language 8ビットキャラクターセットをサポートします。 また、16ビット 漢字およびハングルをサポートします。

例えばフランスの文字を端末から入力する場合、 `personnel`テーブルの`name`アトリビュートに次のように 宣言することができます。

       name   nlschar (25,1)

### 2.3.4 日付データ

`DATE`データタイプは、日付を格納するためのデータタイプで、9つの 日付データフォーマットがあります。

表 2-3 Empress DATE データタイプフォーマット

タイプ | フォーマット | 年の範囲 | 例
0 | yyyymmdd | 0000-9999 | 19980627
1 | dd aaaaaaaaa yyyy | 0000-9999 | 27 June 1998
2 | aaaaaaaaa dd, yyyy | 0000-9999 | June 27, 1998
3 | mm/dd/yy | nn00-nn99 * | 06/27/98
4 | dd/mm/yy | nn00-nn99 * | 27/06/98
5 | dd aaa yy | nn00-nn99 * | 27 Jun 98
6 | aaa dd, yy | nn00-nn99 * | Jun 27, 98
7 | mm/dd/yyyy | 0000-9999 | 06/27/1998
8 | dd/mm/yyyy | 0000-9999 | 27/06/1998

*
  `nn`は、 Empressシステム変数`MSDATELIMIT` によって定義され、入力日付を適切な世紀を指定するため ユーザーが設定する変数です。

すべての`DATE`タイプでは、入力キーワードとして `today` と `now`があり、キーワードは 大文字・小文字に関係なく、現在の日付を適切なフォーマットで 格納します。 を持っています。

以下の例は、`loans`テーブルの`date`アトリビュートです。

       date    DATE (1)

### 2.3.5 時間データ

`TIME` データタイプは、日付に加え時間情報を格納するための データタイプです。 9つのデータフォーマットがあり、以下の表での例は、 1998年 8月 28日 p.m. 2:56:15 を それぞれのフォーマットで出力した例になります。

表 2-4 Empress TIME データタイプフォーマット

タイプ | フォーマット | 年の範囲 | 例
0 | yyyymmddhhmmss | 1970-2035 | 19980828145615
1 | dd aaaaaaaaa yyyy hh:mm:ss | 1970-2035 | 28 August 1998 14:56:15
2 | aaaaaaaaa dd, yyyy hh:mm:ss | 1970-2035 | August 28, 1998 14:56:15
3 | mm/dd/yy hh:mm:ss | 1970-2035 | 08/28/98 14:56:15
4 | dd/mm/yy hh:mm:ss | 1970-2035 | 28/08/98 14:56:15
5 | dd aaa yy hh:mm:ss | 1970-2035 | 28 Aug 98 14:56:15
6 | aaa dd, yy hh:mm:ss | 1970-2035 | Aug 28, 98 14:56:15
7 | mm/dd/yyyy hh:mm:ss | 1970-2035 | 08/28/1998 14:56:15
8 | dd/mm/yyyy hh:mm:ss | 1970-2035 | 28/08/1998 14:56:15

`TIME`データタイプは、現在の日付および時間を格納するための キーワードとして`today`と`now`があります。 `today`は、現在の日付で、時間は00:00:00が入力されます。 `now`は、現在の日付と時間が入力されます。

次の`TIME`データのアトリビュートの例は、

       time   TIME (1)

1998年 6月 1日 2:30 PMの表示例です。

       1 June 1998 14:30:00

### 2.3.6 マイクロ秒データ

`MICROTIMESTAMP` データタイプは、マイクロ秒までの日付、時間情報を 格納するためのデータタイプです。

`MICROTIMESTAMP`のデータフォーマットは以下に示された 異なった9つのタイプがあり、以下の表での例は、 1998年 8月 28日 p.m. 2:56:15 234599マイクロ秒を 各フォーマットで出力した例です。

表 2-5 Empress MICROTIMESTAMP データタイプフォーマット

タイプ | フォーマット | 年の範囲 | 例
0 | yyyymmddhhmmssffffff | 0000-9999 | 19980828145615234599
1 | dd aaaaaaaaa yyyy hh:mm:ss.ffffff | 0000-9999 | 28 August 1998 14:56:15.234599
2 | aaaaaaaaa dd, yyyy hh:mm:ss.ffffff | 0000-9999 | August 28, 1998 14:56:15.234599
3 | mm/dd/yy hh:mm:ss.ffffff | nn00-nn99 * | 08/28/98 14:56:15.234599
4 | dd/mm/yy hh:mm:ss.ffffff | nn00-nn99 * | 28/08/98 14:56:15
5 | dd aaa yy hh:mm:ss.ffffff | nn00-nn99 * | 28 Aug 98 14:56:15.234599
6 | aaa dd, yy hh:mm:ss.ffffff | nn00-nn99 * | Aug 28, 98 14:56:15.234599
7 | mm/dd/yyyy hh:mm:ss.ffffff | 0000-9999 | 08/28/1998 14:56:15.234599
8 | dd/mm/yyyy hh:mm:ss.ffffff | 0000-9999 | 28/08/1998 14:56:15.234599

*
  上の表での`nn`は、Empressシステム変数 `MSDATELIMIT`に指定された値であり、この値は 日付入力のための適切な世紀を指示した値になります。

### 2.3.7 Decimal データ

38 桁までの`DECIMAL`データを格納することができます。 ユーザーが小数の桁数を指定することができます。

例えば、`circumference`アトリビュートは 全体の桁数を 7 桁として、小数部の桁数は 3 になります。

       circumference   DECIMAL (7, 3)

### 2.3.8 通貨(ドル) データ

`DOLLAR` データタイプは 通貨(ドル)データを格納するためのデータタイプです。 このデータタイプには 3 のタイプがあり、そのうちの1つを使用し 13桁まで有効です。

表 2-6 Empress DOLLAR データタイプフォーマット

タイプ | 例 | 説明
タイプ 1 | $1,234.00 | ドル記号付きの値を出力します。
タイプ 2 | $****1,234.00 | 固定長の表示で最大桁数の前にドル記号がつけられ、数字は右詰で表示されます。 数字の表示されない桁では、アスタリスクが表示されます。
タイプ 3 | 1234.00 | ドル記号、アスタリスク、カンマを付けない値を出力します。

例えば、`personnel`の`credit_limit`アトリビュートは、

       credit_limit     DOLLAR (6,1)

6 桁でタイプ 1 表示 の `DOLLAR` データタイプになります。

### 2.3.9 浮動小数点 データ

浮動小数点の値を格納するデータ型として以下のデータ型が用意されています。

- `REAL`
- `FLOAT`
- `LONGFLOAT` または `DOUBLE PRECISION`

データは検索の上では、科学小数点法で表わされます。

例えば、`10342`は、`1.0342e+04`と表すことができます。

### 2.3.10 整数データ

整数値を格納するデータ型として以下のデータ型が用意されています。

- `INTEGER` または `INT`
- `SHORTINTEGER` または `SMALLINT`
- `LONGINTEGER`

例えば`personnel`テーブル中の`number`アトリビュートは、 以下のように定義されています。

       number   INTEGER

`INTEGER` 型の範囲は-32767から+32767までを扱うことができます。

### 2.3.11 マルチメディアデータ

`MULTIMEDIA`型、または`BULK`型は、 画像イメージ、音声イメージ、サウンドイメージなどのような 構造化されていないデータを格納するためのデータタイプです。 例えば、従業員の写真を格納する`picture`というアトリビュートを宣言する 場合は以下のように指定します。

       picture BULK (80,0,1024,1)

## 2.4 データベースの作成とアクセス

このセクションでは、データベースの作成とアクセス方法についてを示します。 Empressデータベースの作成およびアクセスの手順は 通常、以下のようにおこないます。

1. オペレーティングシステムにログインします。

2. 作業ディレクトリ、またはデータベースを作成したいディレクトリに移動します。 例として`work`という作業ディレクトリの場合、以下のように入力します。

          cd work

3. `empmkdb`コマンドの後にスペースを開け、作成するデータベース名を 入力することでデータベースを作成することができます。 指定したデータベースが既に存在している場合は作成することはできません。 (この場合、ステップ４に進んでください。) データベースの名前は、その文字列中に空白がない文字の並びにしてください。 "repairs" データベースを作成するには、以下のように入力します。

          empmkdb repairs

4. `empmkdb`コマンドは、Empress のデーターベース作成を行います。 指定された名前のシステムディレクトリを作成し、 そのディレクトリ中にEmpressが、データベースとして認識するための 複数のファイル(データ辞書)を作成します。

5. `empsql`コマンドの後にスペースを開け、データベース名を指定することで Empress SQLセッションを起動します。 例えば、以下のように入力します。

          empsql repairs

6. 前ステップで失敗した場合、 Empress SQLスタートアップコマンドは、インストレーション時に リネームされた可能性があります。この場合、システム管理者に相談してください。

7. Empress SQLセッションが起動されると アスタリスク(*) をともなったプロンプトが表示され、 使用されているEmpressバージョンで有効な すべてのEmpress SQLコマンドの使用が可能になります。

## 2.5 テーブルの作成

データの格納および検索をする前に最初にテーブルを作成します。 例えば、サンプルデータベースは、従業員のローンについての情報 (従業員名、ローン日付、ローン金額)を含んだ`loans`テーブルを持ち、 アトリビュートとして`name`、`date`および`amount` があります。

`loans`テーブルを作成するためには、以下のSQLコマンドを発行します。

       CREATE TABLE loans (name CHAR (25,1),
                           date DATE (1),
                           amount DOLLAR (6,1));

`CREATE TABLE`コマンドの後にテーブル名を指定し、その後に各アトリビュートの 設定を行います。 `loans`テーブルは、char型データでサイズが25の`name`アトリビュートと date 型の`date`アトリビュート、 dollar 型の`amount`アトリビュートになります。

対話型インターフェイス Empress SQLでの、テーブルを 作成するための他の簡単な方法として、 対話型インターフェイスコマンドを使います。 `personnel`テーブルを作成しまするためには 以下のように入力します。

    CREATE TABLE personnel;

プロンプトが表示され、対話的にアトリビュートの属性情報を入力します。

       アトリビュート名 #1: number
       データタイプ: integer
       NULL 値を認めますか ?: y

       よろしいですか？ .e

       アトリビュート名 #2: name
       データタイプ: char
       Maximum Number of Characters: 25
       Type: 1
       NULL 値を認めますか ?: y

       よろしいですか？ .e

       アトリビュート名 #3: phone
       データタイプ: char
       Maximum Number of Characters: 15
       Type: 1
       NULL 値を認めますか ?: y

       よろしいですか？ .e

       アトリビュート名 #4: credit_limit
       データタイプ: dollar
       Maximum Number of Dollar Digits: 6
       Type: 1
       NULL 値を認めますか ?: y

       よろしいですか？ .e

       アトリビュート名 #5: .q

サンプルデータベースの`auto_parts`、 `customers`テーブルを作成するために 上記の例のように対話型インターフェイスコマンドを 使うことができます。

## 2.6 データベースおよびテーブルの表示

データベースの情報を得るためには、 次のコマンドのどちらかを入力します。

       DISPLAY DB;

       DISPLAY DATABASE;

上記のコマンドにより、以下の情報を表示します。

       **** Database: repairs ****

       auto_parts
       customers
       loans
       personnel

`personnel`テーブルの構造を参照するためには 次のように入力します。

       DISPLAY TABLE personnel;

上記のコマンドにより、以下の情報を表示します。

       *** Table: personnel ***

       Attributes:

       number          integer
       name            char(25, 1)
       phone           char(15, 1)
       credit_limit    dollar(6, 1)

## 2.7 テーブルへのデータ登録

データを格納するためのテーブルの作成が完了することで、 レコードを登録を開始することができます。 Empress SQLでは、 シングルコマンド、対話型インターフェイス およびファイルからのデータを使ったテーブルへの データ登録をすることができます。

サンプルデータベースの `personnel`、`loans`、`auto_parts` `customers`テーブルへのデータ登録は、 以下に示す例により登録することができます。

### 2.7.1 シングルコマンドによる登録

シングルコマンドを使用して`personnel`テーブルに最初のレコードを 登録するためには、以下のように入力します。

       INSERT INTO personnel
          VALUES 10, "Kilroy", "426-9681", 500;

上記の例では、 `INSERT INTO`コマンドで登録するテーブル名として `personnel`を指定し、 格納するデータとして、続けて指定されたデータの値のリスト (10, "Kilroy","426-9681", 500) を指定することでデータ登録されます。

### 2.7.2 対話的な登録

対話型インターフェイスを使用して、 プロンプトに対し、各アトリビュート値を入力することで レコード登録を行います。 以下に例を示します。

       INSERT INTO personnel;

       number: 5
       name: Mosca
       phone: 544-2243
       credit_limit: 750

       よろしいですか？.e

       number: .q

       入力レコード数 = 1

### 2.7.3 ファイルからのデータ登録

ファイルからデータを登録するためには、あらかじめ システムエディタを使用して、データを含むデータファイルを作成します。 この例では、以下のようなデータを含む`datafile`というファイルを作成します。

       17
       Wladislaw
       723-6073
       50
       3
       Jones
       667-2951
       500

以下のコマンドを発行することにより `personnel`テーブルに ファイルデータを登録することが可能です。

    INSERT INTO personnel FROM datafile;

上記のコマンドにより、登録されたレコード数を表示します。

    入力レコード数 = 2

今までの登録例で3つの異なった方法を使用して`personnel`テーブルへ 4 レコードが登録されました。

### 2.7.4 テキストデータの登録

対話型インターフェイスを使い `customers`テーブルに最初のレコードを登録するには 以下のように入力します。

       INSERT INTO customers;

以下のようにプロンプトにデータを入力します。

       name: Mr. R. Lucas
       address: 1423 Beach Drive,\
       Bayville, CA 92308
       comments: Can always be sold\
       something new and flashy - likes\
       chrome and colored stuff,\
       also little gadgets.

       Ready .e

       name: .q

例の値の入力での バックスラッシュ(\)は、複数行に渡るテキストデータ入力の継続を 指示するために使用されますが、データとしては登録されません。 継続文字はEmpress環境変数`MSLINECONT`によって定義されています。 詳細な情報は Empress: Database 管理者ガイドマニュアルの `MSLINECONT` を参照してください。

## 2.8 データ検索

最も一般的な SQL オペレーションは、データの検索です。 データベースからデータを検索することを、 クエリ と呼びます。 `SELECT`コマンドは、クエリを発行するために使用されます。 `personnel`テーブルからレコードを検索するためには、 以下のように入力します。

       SELECT * FROM personnel;

アスタリスク(*) は、 `personnel`テーブルからすべてのレコードをリストします。 上記のコマンドにより、以下の表示をします。

       number    name         phone        credit_limit

           10    Kilroy       426-9681          $500.00
            5    Mosca        544-2243          $750.00
           17    Wladislaw    723-6073           $50.00
            3    Jones        667-2951          $500.00
            8    Peterson     978-6060          $250.00
            4    Scarlatti    961-7363          $100.00
            9    Jordan       964-3335          $250.00

### 2.8.1 部分的なデータ検索

#### 2.8.1.1 特定のアトリビュート検索

前の例では、 `personnel`テーブルからすべてのデータの検索をしましたが、 従業員名と電話番号のリストのような特定な情報の検索が必要な場合は、 以下のように入力します。

       SELECT name, phone FROM personnel;

この場合、`SELECT`句は、 指定されたアトリビュートのみをリスト表示し、 以下のような出力になります。

       name        phone

       Kilroy      426-9681
       Mosca       544-2243
       Wladislaw   723-6073
       Jones       667-2951
       Peterson    978-6060
       Scarlatti   961-7363
       Jordan      964-3335

#### 2.8.1.2 特定のレコード検索

前に示された例では、指定されたアトリビュート情報の検索でしたが、 特定のレコードのみをさらに検索するためには、 `SELECT`文に`WHERE`句を追加します。 `WHERE`句を使用することで、 `WHERE` 句に指定された条件を満たすレコードのみを検索します。

例えば、 `personnel`テーブルから $500 を越えるクレジット制限を持つ 従業員名をするとする場合、以下のように入力します。

       SELECT number, name, phone FROM personnel
          WHERE credit_limit > 500;

出力結果は以下のようになります。

       number   name        phone

            5   Mosca       544-2243

#### 2.8.1.3 検索条件

以下の例では、検索条件の使用について示します。

`AND` | 1 つ以上の検索条件を指定し、 すべての検索条件を満たすレコードのリストを得ます。 例として以下に示します。
       SELECT number, name, phone FROM personnel
          WHERE credit_limit < 500
          AND credit_limit > 100;
`OR` | 1 つ以上の検索条件を指定し、 どちらかの検索条件を満たすレコードのリストを得ます。 例として以下に示します。
       SELECT name FROM personnel
          WHERE credit_limit > 500
          OR credit_limit < 100;
`!=` | 指定した条件を満たさないレコードのリストを得ます。 例として以下に示します。
       SELECT name FROM personnel
          WHERE credit_limit != 500;
`BETWEEN` | 指定した範囲内のレコードのリストを得ます。 例として以下に示します。
       SELECT name FROM personnel
          WHERE credit_limit BETWEEN 100 AND 500;
`IN` | 条件として指定された値のリストに アトリビュートの値が含まれている場合のレコードリストを得ます。 例として以下に示します。
       SELECT name FROM personnel
          WHERE credit_limit IN (100, 200, 500);
`Pattern Matching` | 条件として指定された文字パターンにマッチするレコードを検索することができます。 例として以下に示します。
       SELECT name FROM personnel
          WHERE name MATCH "C*";

より詳細な情報は、 Empress SQL: リファレンスマニュアルの Empress `WHERE` 句のオペレーション を参照してください。

### 2.8.2 検索データのグループ指定

`SELECT`コマンドにより要求されたレコードを 共通のアトリビュート値により、グルーピングすることができます。 `GROUP BY`句の使用は、 出力は指定されたアトリビュートによりグループ化することができます。 例として以下に示します。

       SELECT * FROM loans GROUP BY name;

出力結果は以下のようになります。

       name                                   date        amount

       Jones                      7 February  1992        $33.95
                                  3 April     1992        $25.00
                                 12 August    1992       $300.00
       Kilroy                    16 February  1992       $250.00
       Mosca                      2 February  1992       $150.00
                                  4 May       1992       $200.00
       Peterson                   6 June      1992        $50.00
       Scarlatti                 14 October   1992       $125.00
                                  9 September 1992       $150.00
       Wladislaw                 25 June      1992        $75.00
                                 27 February  1992        $55.00
                                 12 May       1992        $25.00

`GROUP BY`句は、 `COUNT`、`MAX`、 `MIN`、`SUM`、 `AVG` などのような集計関数がしばしば利用されます。 例として以下に示します。

    SELECT name, SUM(amount) FROM loans GROUP BY name;

出力結果は以下のようになります。

       name                          SUM(amount)

       Jones                              358.95
       Kilroy                             250.00
       Mosca                              350.00
       Peterson                            50.00
       Scarlatti                          275.00
       Wladislaw                          155.00

`WHERE`句は、 個別のレコードに対しての検索条件を指定するために使用され。 `HAVING`は、 グループ化されたレコードに対しての検索条件を指定するために使用されます。 例として以下に示します。

       SELECT name, SUM(amount) FROM loans GROUP BY name
          HAVING SUM(amount) > 300;

出力結果は以下のようになります。

       name                          SUM(amount)

       Jones                              358.95
       Mosca                              350.00

### 2.8.3 ユニークな値の検索

重複した値を除くためには、 `SELECT`文中に`DISTINCT`キーワードを指定します。 例として以下に示します。

       SELECT DISTINCT (name) FROM loans:

出力結果は以下のようになります。

       name

       Mosca
       Jones
       Kilroy
       Wladislaw
       Peterson
       Scarlatti

### 2.8.4 複数テーブルの問い合わせ

ここまでに示した例はすべて1つのテーブルに対しての問い合わせでしたが、 場合により、1つ以上のテーブルに格納された情報を捜すことがあります。 この場合においては2つ以上のテーブルを組み合わせ検索する必要があります。

`loans`テーブルからすべてのレコードリストと 併せて`personnel`テーブルから従業員の電話番号を含むレコードリストを 取得するためには、以下のように入力します。

       SELECT name, phone, date, amount
          FROM loans, personnel
          WHERE loans.name = personnel.name;

出力結果は以下のようになります。

       name             phone                   date      amount

       Mosca           544-2243     2 February  1992     $150.00
       Jones           667-2951     7 February  1992      $33.95
       Kilroy          426-9681    16 February  1992     $250.00
       Wladislaw       723-6073    27 February  1992      $55.00
       Jones           667-2951     3 April     1992      $25.00
       Mosca           544-2243     4 May       1992     $200.00
       Wladislaw       723-6073    12 May       1992      $25.00
       Peterson        978-6060     6 June      1992      $50.00
       Wladislaw       723-6073    25 June      1992      $75.00
       Jones           667-2951    12 August    1992     $300.00
       Scarlatti       961-7363     9 September 1992     $150.00
       Scarlatti       961-7363    14 October   1992     $125.00

## 2.9 出力データのソート

これまでの例において、問い合わせの出力結果の表示順は、 Empressによって決定されていましたが、 `SELECT`文に`ORDER BY`句を追加することにより 出力表示をソートすることができます。

例えば、`personnel`テーブルから クレジット制限が $100以下の 従業員番号と従業員名のリストを 従業員番号の昇順にソートし、 出力するためには以下のように入力します。

       SELECT number, name, credit_limit
          FROM personnel WHERE credit_limit <= 100
          ORDER BY number ASCENDING;

出力結果は以下のようになります。

       number   name         credit_limit

           4    Scarlatti         $100.00
          17    Wladislaw          $50.00

`DESCENDING`キーワードは、リストを降順にソートし、 出力します。 使用例として以下のように入力します。

       SELECT number, name, credit_limit
          FROM personnel WHERE credit_limit <= 100
          ORDER BY number DESCENDING;

## 2.10 レコードの更新

データベースにおいて情報を更新をしなくてはならいない場合があります。 例においては、住所や電話番号の変更、あるいは新しい従業員の追加により 必要になります。

### 2.10.1 シングルコマンドによる更新

従業員名"Kilroy" の電話番号を"426-9681"から"513-8888"に変更するためには 次のコマンドを使用します。

       UPDATE personnel SET phone TO "513-8888"
          WHERE name = "Kilroy";

`UPDATE`コマンドは、修正するためのテーブル(`personnel`)を指定し、 `SET`句は、指定した値(513-8888)にアトリビュートの値を変更します。 `WHERE`句は、このコマンドにより影響されるレコードを指定します。

### 2.10.2 対話的な更新

対話型インターフェイスを使ってレコードを更新するためには 以下のコマンドを使用します。

       UPDATE personnel WHERE name = "Kilroy";

Empress prompts you with:

       number: 10
       name: Kilroy
       phone: 426-9681 513-8888
       credit_limit: $500.00

       よろしいですか？ .e

       更新レコード数 = 1

## 2.11 レコードの削除

`personnel`テーブルから従業員名"Kilroy"のレコードを削除するためには 以下のように入力します。

       DELETE personnel WHERE name = "Kilroy";

`DELETE`コマンドはテーブルを指定し、 `WHERE`句は削除するためのレコードを指示します。 `WHERE`句を指定しない場合、テーブルのすべてのレコードが 削除されることに注意してください。

## 2.12 テーブル構造の変更

テーブルを作成した後にそのテーブルの構造を変更するためには、 `ALTER TABLE`コマンドを使用します。 このコマンドは、 アトリビュートの追加または削除および アトリビュートの定義を変更することができます。

`personnel`テーブルの`name` アトリビュートのサイズを 25 から 30 文字に変更するためには、以下のように入力します。

       ALTER personnel
          CHANGE name CHAR (30,1);

`personnel`テーブルへ character 型の長さ 50 の `address`アトリビュートを追加するためには、 以下のように入力します。

       ALTER personnel
          ADD address CHAR (50,1);

`personnel`テーブルから `credit_limit`アトリビュートを削除するためには、 以下のように入力します。

       ALTER personnel
          DELETE credit_limit;

また、上記のそれぞれのコマンドをすべて組み合わせて １つのコマンドとして実行することができます。

       ALTER personnel
          CHANGE name CHAR (30,1)
          ADD address CHAR (50,1)
          DELETE credit_limit;

## 2.13 テーブルおよびアトリビュート名の変更

`personnel`から`employees`にテーブルの名前を変更するためには、 以下のように入力します。

       RENAME personnel TO employees;

`auto_parts`テーブル中の `part no.`から`numbers`に アトリビュートの名前を変更するためには、 以下のように入力します。

       RENAME auto_parts."part no." TO numbers;

アトリビュート`part no.`は複雑な名前です。 複雑な名前は、数字または non-letter文字から始まるか、 あるいは空白、タブ、ピリオドなどを含まれていることがあります。 Empressコマンドを使用する場合、複雑な名前は 引用符で囲む必要があります。

## 2.14 テーブルの削除

データベースから`personnel`テーブルを削除するためには、以下のように入力します。

       DROP personnel;

上記を実行することで、データベースから`personnel`テーブルは削除されます。

このコマンドは十分に注意して使用してください 一度、テーブルを削除すると、データベースから永久に消えることになります。 その場合、テーブルを検索するための唯一の方法は、 そのテーブルを作成しなおすことです。 (トランザクション中であれば、トランザクションのロールバックにより テーブルを戻すことも可能かもしれません。)

## 2.15 ヘルプの使用

Empressは、Empress SQLに関するオンラインヘルプを備えています。 `HELP`コマンドの構文は以下のとおりです。

       HELP [topic];

上記の指定によって、使用可能なヘルプ情報のリストが表示されます。 ある特定のコマンドに関するヘルプ情報を得るためには、以下のように入力します。

       HELP command;

これによって、コマンドの要約が表示されます。 例えば`DATABASE`コマンドに関する情報を得る場合は、 以下のように使用します。

       HELP DATABASE;

これによって、以下の出力が得られます。

                           ----------  Database  ----------

       "Database" コマンドは現在使用しているデータベースの名前を表示させたり、使用
     しているデータベースを変更したい場合に使用します。

       [構文]

            |database| [DATABASE]  [| onto | FILE ]
            |db      |              | onto |

       コマンド "database" または "db" だけを指定すると現在のデータベース名を表示します。
       データベース名 DATABASE を指定した場合は、現在使用しているデータベースを変更します。

       "database" コマンドの出力は，"into" あるいは "onto" とそれに続くファイル名を
        指定することにより、端末からリダイレクトして新しいファイルを作るか，あるいは既
        に存在するファイルに追加することができます。

       さらに情報が必要な場合は、以下に示すコマンドを入力してください。

                    help display;

ヘルプは、対話型インターフェイスから使用することも可能です。 対話型の`CREATE`、`INSERT` 、`UPDATE` コマンドで 利用可能なコマンドの要約を".?"を入力することで得ることができます。

## 2.16 データベースの終了

データベース(SQLセッション)から終了するには、以下のように入力します。

       STOP

または

       EXIT

これにより、オペレーティングシステムに制御が戻ります。