データベースの扱いを局面で考えてみると、以下の2つの定義局面

define-1)データベース作成・破棄
define-2)テーブル作成・修正・破棄

と以下の2つの運用局面

practical-1)データ登録・修正・破棄
practical-2)データ取り出し

でなりたってると考えてよさげ。

 定義局面にテーブルって単語が初めて出てきたけど、前回説明したデータベース管理システム(DBMS)は、一つのデータベース内に複数の表(テーブル)を持ち、それぞれを関連付けることができるようになっている関係データベース管理システム(RDBMS:relational DBMS)が主流なんだそうです。

テーブルの概念
テン・シー・シー-fig.1
横にデータ項目、縦にデータという形で構成されている表

 チンパンジーゲームなら「ゲーム結果テーブル」と「レベル情報テーブル」を用意して「ゲーム結果」のレベルと「レベル情報」のレベルを関連づけるってとこですな。

テン・シー・シー-fig.2

 ゲーム結果のレベル5と関連づけられた連続出題数「15」を得ることで、ゲーム結果の1列目のデータは連続正解数も「15」なので、完全制覇、3列目のデータは連続正解数/連続出題数で正解率3/15という判断ができるわけですわ。

 ま、この程度ならゲーム結果テーブルに連続出題数も書き込めばいいじゃん、て話で...
 どのデータをどのテーブルに振り分けるか、あるいはテーブルひとつで運用するか、テーブルの構成がデータベース制作者の腕の見せ所ってことになるわけやね。だてにブロンズセイントとかゴールドセイントとか用意してねーわけだなオラクル。いやいやセイントは付いてないから。

 とりあえずターミナルからsqlite3を使って各局面を経験してみましょう。ターミナルは、ファインダーの移動>ユーティリティメニューを選ぶと表示されるフォルダの中にあります。

テン・シー・シー-fig.3

 ダブルクリックで起動すると、こんな感じで入力待ち状態になっています。
テン・シー・シー-fig.4
ちなみに私のターミナルの設定はHomebrew(ターミナル>環境設定...メニューのダイアログで設定)。

define-1)データベース作成・破棄

sqlite3 データベース名

 これをやらんことには何も始まらない。SQLiteだと一つのデータベースは一つのファイルになるみたいで

sqlite3 test.db

とすることでデータベースファイルが作成されます。名称はtest.dbでもchimpanzeeでも、なんでもいい。
 ファイルはターミナルの初期設定では自分のホーム直下にできます(ただしテーブル作成をおこなうまでファイルは作成されない)。

テン・シー・シー-fig.6

 破棄はこのファイルを削除するだけ。
 この時点でsqlite3が入力を受け付ける状態になって、プロンプトがターミナルのものからsqlite3のものに変わっているはず。

テン・シー・シー-fig.5

sqlite3のプロンプトで

.quit

と打ち込めばsqlite3が終了します。プロンプトもターミナルのものに戻ったはず。そこから、もう一度

sqlite3 test.db

と打ち込めば、またsqlite3のプロンプトになって、test.dbデータベースに対する作業を再開できます。

define-2)テーブル作成・修正・破棄

create table テーブル名(項目名 型, 項目名 型, .... )

 作ったデータベースにテーブルを追加していきます。このさいにテーブル項目の定義もおこないます。

テン・シー・シー-fig.7

 今回は試しに

テーブル:result
項目1:datetime 文字列型
項目2:level 整数型
項目3:correct 整数型

テーブル:levelinfo
項目1:level 整数型
項目2:complete 整数型

の2つのテーブルを作ります。
 項目には一般的なプログラム言語同様に型という属性があって、文字列型にするか整数型にするかは用途によります。例えば平均を取る場合なら整数型だし、人の名前なら文字列型ですな。日付は微妙~、DBMSによっては日付型ってのがあるみたい。とりあえず文字列型で。

create table result(datetime text, level int, correct int);
create table levelinfo(level int, complete int);

と順に入力。sqlite3は改行ではなく「;」が入力コマンドの区切りなので

create table result(
datetime text,
level int,
correct int);

と入力してもかまわない。こんな感じ。
テン・シー・シー-fig.8

practical-1)データ登録・修正・破棄

insert into テーブル(項目名1, 項目名2 ...) values(項目名1の値, 項目名2の値, ...);

 テーブルが用意できたので、実際のデータの登録。
 まず変更しないであろうlevelinfoから。今回は実験なので3つのレベルね。

insert into levelinfo(level, complete) values(1, 5);
insert into levelinfo(level, complete) values(2, 10);
insert into levelinfo(level, complete) values(3, 20);

 次はresult。こっちはどんどん追加されることになる。適当に7つ程度登録。

insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 2, 5);
insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 1, 5);
insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 1, 2);
insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 3, 12);
insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 2, 9);
insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 2, 10);
insert into result(datetime, level, correct) values(datetime('now', 'localtime'), 3, 10);

 ここでdatetime('now', 'localtime')ってのが使われてるけど、これはsqlite3備え付けの関数みたいです。'now'で現在の日付と時間が文字列として出力されます。'localtime'は付けないと標準時(グリニッジ?)になっちゃうからです。あ、でも考えようによっては標準時で保存する方が正解?
 修正・破棄はまた今度。

practical-2)データ取り出し

select 項目1, 項目2, ... from テーブル名1, テーブル名2, ... where ....

 こいつがデータベース運用の"キモ"の部分なんですが、さすがに多彩です。
 一番簡単なのはテーブルの内容全部表示で

select * from result;



select * from levelinfo;

ですな。

テン・シー・シー-fig.9

難しいのだとこんな感じ。

select
result.datetime,
result.level,
result.correct,
levelinfo.complete
from result,levelinfo
where result.level = 2
and result.level=levelinfo.level;

どうすか?

テン・シー・シー-fig.10

レベル2の結果をレベル2の連続出題数付きで表示~。
いや、すげーけどよ。
whereてなんだよ、and result.level=levelinfo.levelとか、わけわかんねーし。日本語しゃべれ。
みたいな。

謎が謎を呼び以下次回!

------------
サンプルデータベースファイル:test.db.zip