# データベース

MS AccessやOracle等のデータベースとADO経由で連携します。

## ★メリット

データベースを使うメリットは、いろいろとあります。

> ・大容量のデータの入出力が簡単！
> ・複数のテーブルを相互に連動させたりできる！
> ・複雑な条件で検索ができる！

また、Access や Oracle などのデータベースをひまわりと連携することのメリットも、たくさんあります。
手軽にデータベースにアクセスできるので、例えば、こんなことが簡単にできます。

> ・ひまわりで手軽にGUI（見た目）を作って、DBの内容を確認！
> ・データベースを参照して、その内容をメールしたり、ホームページを更新したり・・・！

## ★ 接続方法

データベースに接続する方法ですが、まず、当然のごとく、データベースがWINDOWSにインストールされている必要があります。代表的なデータベースには、マイクロソフトのACCESSや、ORACLEなどがあります。

ここでは、ACCESSのデータベースにアクセスする方法を説明します。

> `DBプロバイダは、DB_ACCESS2000 DBデータソースは、『c:\test.mdb』 //DBユーザーIDは、『xxxx』 //DBパスワードは、『xxxx』 DB接続。 DB切断。`

まず、DBプロバイダに、DB_ACESS2000(Access2000のとき)、または、DB_ORACLE(Oracleのとき)を設定します。
次に、DBデータソースに、アクセスするデータソース（データファイル名）を指定します。
それから、必要ならば、ユーザーID、パスワードを設定して、『DB接続』と、書きます。
接続したら、最後には必ず、切断する必要があります。

## ★データの検索方法

さて、データベースに接続したら、次に、データを検索してみます。まずは、アクセス等で、簡単なテーブルとサンプルのデータを作ってください。

> ID | 名前 | 住所 | 生年月日 | メールアドレス | 性別
> 1 | 佐藤 | 愛知県 | 1970/01/01 | satou@xxxx.xxx | 男
> 2 | 鈴木 | 静岡県 | 1980/08/08 | unoki@xxxx.xxx | 男
> 3 | 青木 | 愛知県 | 1969/03/03 | aoki@xxxx.xxx | 女
> 4 | 加藤 | 静岡県 | 1999/03/03 | katou@xxxx.xxx | 男
> 5 | 山田 | 北海道 | 1980/01/01 | aiko@xxxx.xxx | 女

例えば、上のようなテーブルを、『名簿テーブル』という名前で作成しました。

では、ひまわりでこの名簿テーブルを検索してみます。

> `'------------` ’接続処理 `DBプロバイダは、DB_ACCESS2000 DBデータソースは、『c:\test.mdb』 DB接続。 '------------ ' 検索 「名簿テーブル」の,「*」から,「名前='鈴木'」で、DB検索``'------------ ’検索結果取得````DBタブ区切りで全部取得``して、表示``。` `'``------------` `'切断処理` `DB切断。`

実際に検索をしているのが、『DB検索』命令です。この命令は、『(テーブル名)の、(フィールド名)から、（条件）で』という引数を使います。
上の例で、フィールド名に書いた『*』は、全てのフィールドを意味します。もし、フィールドを指定する場合は、

> `「名簿テーブル」の,「名前,住所」から,「名前='鈴木'」で、DB検索`

と、このようになります。

また、条件をつけず、全てのレコードを取り出したい場合は、

> `「名簿テーブル」の,「名前,住所」から,「*」で、DB検索`

のように、条件に、* を書くと、全てのレコードを取得することができます。

さて、上の例で「おや？」っと思うのは、検索しただけでは、結果が取得できないということです。必ず、「DB検索」命令を実行した後に、「`DBタブ区切りで全部取得`」などの検索結果を取り出す命令を実行しなければなりません。

どうしてこんな仕様にしたかと言うと、大容量のデータベースへのアクセスを考慮したためです。DB検索命令を実行した時点で、検索結果が、何千件にも達すると、ひまわりのパフォーマンスが極端に落ちてしまいます。そこで、何千件もの検索結果がありそうな場合は、検索結果を一件ずつ取り出せるような仕組みにしたのです。

検索結果を一件だけ取り出す命令は、「DBレコード取得」命令で、これを実行すると、データベースから結果を一件だけ読み出します。では、以下に、データベースの検索結果を一件ずつ読み出すサンプルを書きます。

> `'------------` ’接続処理 `DBプロバイダは、DB_ACCESS2000 DBデータソースは、『c:\test.mdb』 DB接続。 '------------ ' 検索 「名簿テーブル」の,「*」から,「*」で、DB検索``'------------ ’検索結果取得` `DBレコード取得``して、表示``。 DB次へ。 DBレコード取得``して、表示``。 DB次へ。 DBレコード取得``して、表示``。` `'``------------` `'切断処理` `DB切断。`

DBレコード取得しては、「DB次」命令で、DBの検索結果を、一件ずつ読み出しています。

## ★SQLマスターしてDB上級者になろう

ここまで読めば、既にDBとひまわりを連動して使って面白いことができるのですが、データベースの問い合わせ言語である、SQLを使うことで非常に細かい検索を行ったり、複数のテーブルを繋げて検索したりと、細かいことが出来るようになります。

SQLを使うには、「DB問い合わせ」命令を使います。実を言えば、上で見た、「DB検索」命令も、ひまわりの内部でSQLに変換して実行しているだけです。

> `'DB問い合わせ のサンプル DBプロバイダは、DB_ACCESS2000 DBデータソースは、『c:\test.mdb』 DB接続 "SELECT ID,名前 FROM 名簿テーブル;"と、DB問い合わせ。’←SQL文 DBタブ区切りで全部取得して、表示。 DB切断。`

使い方は、上のような感じです。

### ● SELECT

> SQLの基本はなんと言っても、SELECT です。以下がSELECT文の文法です。

> SELECT (フィールド名) FROM (テーブル名) [WHERE (条件)] [ORDER BY (フィールド名) [(順序)]] [GROUP BY (フィールド名)] [HAVING (条件)];

> では、いくつか SELECT 文を使って遊んでみます。
> 以下、上のDB問い合わせサンプルの、SQL文と結果だけを記します。問い合わせサンプルの、SQL文を書き換えたものです。

> SELECT 名前, メールアドレス FROM 名簿テーブル
> 佐藤 | satou@xxxx.xxx
> 鈴木 | unoki@xxxx.xxx
> 青木 | aoki@xxxx.xxx
> 加藤 | katou@xxxx.xxx
> 山田 | aiko@xxxx.xxx

> 上のように、フィールド名に、任意のフィールド名を、カンマ","で区切って書くことにより必要なフィールドだけを取り出すことができます。

> SELECT 名前, 'さんの誕生日は', 生年月日, 'です' FROM 名簿テーブル;
> 佐藤 | さんの誕生日は | 1970/01/01 | です
> 鈴木 | さんの誕生日は | 1980/08/08 | です
> 青木 | さんの誕生日は | 1969/03/03 | です
> 加藤 | さんの誕生日は | 1999/03/03 | です
> 山田 | さんの誕生日は | 1980/01/01 | です

> 上のように、フィールド名に、'文字列' を書くと、文字列がそのまま出力されます。

> SELECT DISTINCT 住所 FROM 名簿テーブル; | SELECT 住所 FROM 名簿テーブル;
> 愛知県 静岡県 北海道 | 愛知県 静岡県 愛知県 静岡県 北海道

> 上の２つの結果を見比べると分かると思いますが、フィールド名に DISTINCT を付けると、重複した結果が表示されなくなります。

> SELECT 名前,住所 FROM 名簿テーブル WHERE 住所='愛知県';
> 佐藤 | 愛知県
> 青木 | 愛知県

> さて、上のように、WHERE をつけると、条件を指定できます。

> SELECT 名前,住所 FROM 名簿テーブル WHERE 住所='愛知県' OR 住所='静岡県';
> 佐藤 | 愛知県
> 鈴木 | 静岡県
> 青木 | 愛知県
> 加藤 | 静岡県

> また、条件に、"OR(または)"、"AND(かつ)" のような演算子が利用できます。

> 曖昧検索をする場合には、LIKEを使います。

> SELECT 名前 FROM 名簿テーブル WHERE 名前 LIKE '%木';
> 鈴木 青木

> 上の例では、名前に、木のつく人をピックアップしています。

> ORDER BYを使うと、並び順を決められます。

> SELECT * FROM 名簿テーブル ORDER BY 生年月日;
> 3 | 青木 | 愛知県 | 1969/03/03 | aoki@xxxx.xxx | 女
> 1 | 佐藤 | 愛知県 | 1970/01/01 | satou@xxxx.xxx | 男
> 5 | 山田 | 北海道 | 1980/01/01 | aiko@xxxx.xxx | 女
> 2 | 鈴木 | 静岡県 | 1980/08/08 | unoki@xxxx.xxx | 男
> 4 | 加藤 | 静岡県 | 1999/03/03 | katou@xxxx.xxx | 男

> この場合は、生年月日順に並べています。

> GROUP BYを使うと、レコードをグループ化し、集計したりするときに便利です。

> SELECT 性別,COUNT(*) FROM 名簿テーブル GROUP BY 性別;
> 女 | 2
> 男 | 3

> 上の例では、性別をグループとし、性別の個数を表示しています。

> そして、HAVING は、GROUP BYを使ってグループ化したレコードについて、さらに条件を付加します。

> SELECT 性別,COUNT(*) FROM 名簿テーブル GROUP BY 性別 HAVING COUNT(*) > 2;
> 男 3

● INSERT

> INSERTは、テーブルにデータを追加する場合に使います。

> (1) INSERT INTO <テーブル名> [(<フィールド名>, <フィールド名>,...)] VALUES (<データ>,<データ>,....); (2) INSERT INTO <テーブル名> <SELECT文>;

> 簡単な例です。

> `'レコード挿入のサンプル DBプロバイダは、DB_ACCESS2000 DBデータソースは、『c:\test.mdb』 DB接続 「INSERT INTO 名簿テーブル (名前, メールアドレス) VALUES ('尼崎','ama@xxx.xx')」と、DB問い合わせ。 「名簿テーブル」の,「*」から,「*」で、DB検索 DB全部取得して、表示。 DB切断。`

● UPDATE

> UPDATE文は、レコードの更新を行います。

> UPDATE <テーブル名> SET <フィールド名>=<更新する値> [WHERE <条件>];

> 例と、その結果です。

> UPDATE 名簿テーブル SET 住所='北海道' WHERE ID=3
> 更新前 | 更新後
> 1 | 佐藤 | 愛知県
> 2 | 鈴木 | 静岡県
> 3 | 青木 | 愛知県
> 4 | 加藤 | 静岡県
> 5 | 山田 | 北海道
> 1 | 佐藤 | 愛知県
> 2 | 鈴木 | 静岡県
> 3 | 青木 | 北海道
> 4 | 加藤 | 静岡県
> 5 | 山田 | 北海道

> 上の例では、１つだけの更新でしたが、条件にあうものならいくつでも更新できます。

> UPDATE 名簿テーブル SET 住所='愛知県' WHERE 住所='北海道';
> 1 | 佐藤 | 愛知県
> 2 | 鈴木 | 静岡県
> 3 | 青木 | 愛知県
> 4 | 加藤 | 静岡県
> 5 | 山田 | 愛知県

● DELETE

> DELETE文は、レコードを削除します。

> DELETE FROM <テーブル名> [WHERE <条件>];

> もし、以下のように書くと、指定のテーブルを全て削除してします。運用には十分注意してください。

> DELETE FROM 住所テーブル;

> 以下の例は、ID=5 のレコードを削除します。

> DELETE FROM 住所テーブル WHERE ID=5;

● CREATE TABLE

> CREATE TABLE文は、新しいテーブルを作成します。

> CREATE TABLE <テーブル名> (<テーブルの定義>,<テーブルの定義>, ...);

● ALTER TABLE

> ALTER TABLE文は、既存のテーブルに対してフィールドの追加と削除を行います。

> ALTER TABLE <テーブル名> <テーブル操作>,...;

> テーブル操作で、フィールドの追加は、ADDを、フィールドの削除は、DROPを使います。

● DROP TABLE

> DROP TABLE文は、テーブルを削除します。

> DROP TABLE <テーブル名>;

戻る