データベース
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 名簿テーブル; |
愛知県
静岡県
北海道 |
愛知県
静岡県
愛知県
静岡県
北海道 |
上の2つの結果を見比べると分かると思いますが、フィールド名に 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 性別; |
|
上の例では、性別をグループとし、性別の個数を表示しています。
そして、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 |
山田 |
北海道 |
|
|
上の例では、1つだけの更新でしたが、条件にあうものならいくつでも更新できます。
UPDATE 名簿テーブル SET 住所='愛知県' WHERE 住所='北海道'; |
1 |
佐藤 |
愛知県 |
2 |
鈴木 |
静岡県 |
3 |
青木 |
愛知県 |
4 |
加藤 |
静岡県 |
5 |
山田 |
愛知県 |
|
● DELETE
DELETE文は、レコードを削除します。
DELETE FROM <テーブル名> [WHERE <条件>]; |
もし、以下のように書くと、指定のテーブルを全て削除してします。運用には十分注意してください。
以下の例は、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文は、テーブルを削除します。
戻る