PC館

イントラ実験室3の2

ここまでの流れ

Windows2000Server+IISで構築されているイントラネットサイトにデータベースを組み込むためにやるべき事の詳細は「実験室 イントラ編3の1」を見てもらうとして,いよいよ実際にデータベースMySQLを使ってみることにしよう。

データベースの作成

ひとつサンプルデータベースでも作ってみることにしよう...F1のデータベースにでもしてみるか(^^;

mysql>create database formula1;
Query OK, 1 row affected(0.00 sec)

できた,できた(^^) とはいっても,中身がなんにもないぞ。データ構造(テーブル)を検討しなければ。必要と思われるものをあげていこう。

テーブル名カラム各形式内容
driverd_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
d_namechar(30) (30文字)名前
countrychar(30) (30文字)国籍
teamt_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
t_namechar(30) (30文字)チーム名称
enginee_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
e_namechar(30) (30文字)エンジン名称
circuitcir_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
cir_namechar(30) (30文字)サーキット名
cir_cntrychar(30) (30文字)国名
constcon_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
con_yearint(4) (整数4桁)西暦年
con_teamint(2) (整数2桁)チーム名(=t_id)
con_enint (整数)エンジン(=e_id)
tyrechar(20) (20文字)タイヤ名称
pack1
(レースカレンダ)
p1_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
p1_yearint(4) (整数4桁)西暦年
rndint(2) (整数2桁)ラウンド
p1_cirint (整数)サーキット(=cir_id)
pack2
(エントリリスト)
p2_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
p2_yearint(4) (整数4桁)西暦年
p2_driint (整数)ドライバー(=d_id)
p2_conint (整数)コンストラクタ(=con_id)
qualifyq_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
q_eventint (整数4桁)レース名(=p1_id)
q_seatint (整数)誰(=p2_id)
q_timedecimal(6,3) (数値6桁,小数点以下3桁)予選タイム(sec)
racer_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
r_eventint (整数)レースID(=p1_id)
r_seatint (整数)誰(=p2_id)
resultint(2) (整数2桁)結果(着順)
pointpt_idint (整数,primary keyに指定,auto_incrementだ)IDナンバー
pt_yearint(4) (整数4桁)西暦年
pt_rsltint(2) (整数)レース着順
pointint(2) (整数2桁)ポイント

...ちょっと待て!なんじゃこの複雑な構造は? もう少し簡単にはならんのかい?...まぁとりあえず作ってみよう。

え〜と,driverテーブルの作成は,

mysql>use formula1  ※注:Formula1データベースを使用するぞ
Database changed
mysql> create table driver(d_id int primary key auto_increment,d_name char(30),country char(30));
Query OK, 0 rows affected(0.00 sec)

この調子でどんどんテーブルを作成して...と。よしよし,できたできた。
ん? そうかぁ,データも入力しないとどうにもならないんだ...まずは地道に入力していくしかないか。

mysql> insert into driver(d_name,country) values('M.Schumacher','Germany');
Query OK, 1 row affected(0.00 sec)

d_idは入力しなくても勝手に1番から順に番号を割り当ててくれるんだ。(auto_increment) では,どんな感じで入っているか確認してみよう。

mysql>select * from driver;
+------+--------------+---------+
| d_id | d_name       | Country |
+------+--------------+---------+
|    1 | M.Schumacher | Germany |
+------+--------------+---------+
1 row in set (0.00 sec)

できたできた。さて,同様に全てのテーブルにデータを入れたら,レース結果でも抽出してみよう。

mysql>select * from race where r_event=1 order by result limit 8;
+------+---------+--------+--------+
| r_id | r_event | r_seat | result |
+------+---------+--------+--------+
|    1 |       1 |      1 |      1 |
|    2 |       1 |      2 |      2 |
|    3 |       1 |      8 |      3 |
|    4 |       1 |      4 |      4 |
|    5 |       1 |      3 |      5 |
|    6 |       1 |      9 |      6 |
|    7 |       1 |      7 |      7 |
|    8 |       1 |      5 |      8 |
+------+---------+--------+--------+
8 rows in set (0.03 sec)

上の結果は,2004年第1戦決勝結果の8位までのデータを抽出したものだけど,実はこれ,r_event=1が2004年第1戦だとわかっているから直接指定できたもの。こんな指定方法がいつもできる訳じゃない。そこで他のテーブルと関連づけて目で見てわかる抽出結果にしよう。

mysql>select d_name,result from ((select * from pack2 inner join driver on p2_dri=d_id) as tstrongp1 inner join (select * from race where r_event=(select p1_id from pack1 where p1_year=2004 and rnd=1)) as tstrongp2 on p2_id=r_seat) order by result limit 8;
+---------------+--------+
| d_name        | result |
+---------------+--------+
| M.Schumacher  |      1 |
| R.Barrichello |      2 |
| F.Alonso      |      3 |
| R.Schumacher  |      4 |
| J-P.Montoya   |      5 |
| J.Button      |      6 |
| J.Trulli      |      7 |
| D.Coulthard   |      8 |
+---------------+--------+
8 rows in set (0.00 sec)

ほぉら,こんどこそばっちりだ。
だけど...誰がこんなに長いコマンドを入力できるんだ? ...しょうがない別の手を考えてみるか。次のページに続く...