データベースの扱いを局面で考えてみると、以下の2つの定義局面
と以下の2つの運用局面
でなりたってると考えてよさげ。
定義局面にテーブルって単語が初めて出てきたけど、前回説明したデータベース管理システム(DBMS)は、一つのデータベース内に複数の表(テーブル)を持ち、それぞれを関連付けることができるようになっている関係データベース管理システム(RDBMS:relational DBMS)が主流なんだそうです。
テーブルの概念
![テン・シー・シー-fig.1](https://stat.ameba.jp/user_images/20090404/16/xcc/21/fa/j/o0393024210161243085.jpg?caw=800)
横にデータ項目、縦にデータという形で構成されている表
チンパンジーゲームなら「ゲーム結果テーブル」と「レベル情報テーブル」を用意して「ゲーム結果」のレベルと「レベル情報」のレベルを関連づけるってとこですな。
![テン・シー・シー-fig.2](https://stat.ameba.jp/user_images/20090404/16/xcc/e3/ec/j/o0351052010161243087.jpg?caw=800)
ゲーム結果のレベル5と関連づけられた連続出題数「15」を得ることで、ゲーム結果の1列目のデータは連続正解数も「15」なので、完全制覇、3列目のデータは連続正解数/連続出題数で正解率3/15という判断ができるわけですわ。
ま、この程度ならゲーム結果テーブルに連続出題数も書き込めばいいじゃん、て話で...
どのデータをどのテーブルに振り分けるか、あるいはテーブルひとつで運用するか、テーブルの構成がデータベース制作者の腕の見せ所ってことになるわけやね。だてにブロンズセイントとかゴールドセイントとか用意してねーわけだなオラクル。いやいやセイントは付いてないから。
とりあえずターミナルからsqlite3を使って各局面を経験してみましょう。ターミナルは、ファインダーの移動>ユーティリティメニューを選ぶと表示されるフォルダの中にあります。
![テン・シー・シー-fig.3](https://stat.ameba.jp/user_images/20090404/16/xcc/dc/54/j/o0400026610161243095.jpg?caw=800)
ダブルクリックで起動すると、こんな感じで入力待ち状態になっています。
![テン・シー・シー-fig.4](https://stat.ameba.jp/user_images/20090404/16/xcc/71/70/j/o0400026610161243099.jpg?caw=800)
ちなみに私のターミナルの設定はHomebrew(ターミナル>環境設定...メニューのダイアログで設定)。
define-1)データベース作成・破棄
これをやらんことには何も始まらない。SQLiteだと一つのデータベースは一つのファイルになるみたいで
とすることでデータベースファイルが作成されます。名称はtest.dbでもchimpanzeeでも、なんでもいい。
ファイルはターミナルの初期設定では自分のホーム直下にできます(ただしテーブル作成をおこなうまでファイルは作成されない)。
![テン・シー・シー-fig.6](https://stat.ameba.jp/user_images/20090404/16/xcc/9b/af/j/o0400028210161245880.jpg?caw=800)
破棄はこのファイルを削除するだけ。
この時点でsqlite3が入力を受け付ける状態になって、プロンプトがターミナルのものからsqlite3のものに変わっているはず。
![テン・シー・シー-fig.5](https://stat.ameba.jp/user_images/20090404/16/xcc/99/84/j/o0400034510161243102.jpg?caw=800)
sqlite3のプロンプトで
と打ち込めばsqlite3が終了します。プロンプトもターミナルのものに戻ったはず。そこから、もう一度
と打ち込めば、またsqlite3のプロンプトになって、test.dbデータベースに対する作業を再開できます。
define-2)テーブル作成・修正・破棄
作ったデータベースにテーブルを追加していきます。このさいにテーブル項目の定義もおこないます。
![テン・シー・シー-fig.7](https://stat.ameba.jp/user_images/20090404/16/xcc/8a/7c/j/o0384024610161246950.jpg?caw=800)
今回は試しに
の2つのテーブルを作ります。
項目には一般的なプログラム言語同様に型という属性があって、文字列型にするか整数型にするかは用途によります。例えば平均を取る場合なら整数型だし、人の名前なら文字列型ですな。日付は微妙~、DBMSによっては日付型ってのがあるみたい。とりあえず文字列型で。
と順に入力。sqlite3は改行ではなく「;」が入力コマンドの区切りなので
と入力してもかまわない。こんな感じ。
![テン・シー・シー-fig.8](https://stat.ameba.jp/user_images/20090404/16/xcc/2b/d4/j/o0400010010161246954.jpg?caw=800)
practical-1)データ登録・修正・破棄
テーブルが用意できたので、実際のデータの登録。
まず変更しないであろうlevelinfoから。今回は実験なので3つのレベルね。
次はresult。こっちはどんどん追加されることになる。適当に7つ程度登録。
ここでdatetime('now', 'localtime')ってのが使われてるけど、これはsqlite3備え付けの関数みたいです。'now'で現在の日付と時間が文字列として出力されます。'localtime'は付けないと標準時(グリニッジ?)になっちゃうからです。あ、でも考えようによっては標準時で保存する方が正解?
修正・破棄はまた今度。
practical-2)データ取り出し
こいつがデータベース運用の"キモ"の部分なんですが、さすがに多彩です。
一番簡単なのはテーブルの内容全部表示で
や
ですな。
![テン・シー・シー-fig.9](https://stat.ameba.jp/user_images/20090404/16/xcc/38/92/j/o0400023010161246957.jpg?caw=800)
難しいのだとこんな感じ。
どうすか?
![テン・シー・シー-fig.10](https://stat.ameba.jp/user_images/20090404/16/xcc/44/e6/j/o0400021510161246977.jpg?caw=800)
レベル2の結果をレベル2の連続出題数付きで表示~。
いや、すげーけどよ。
whereてなんだよ、and result.level=levelinfo.levelとか、わけわかんねーし。日本語しゃべれ。
みたいな。
謎が謎を呼び以下次回!
------------
サンプルデータベースファイル:test.db.zip
define-1)データベース作成・破棄
define-2)テーブル作成・修正・破棄
と以下の2つの運用局面
practical-1)データ登録・修正・破棄
practical-2)データ取り出し
でなりたってると考えてよさげ。
定義局面にテーブルって単語が初めて出てきたけど、前回説明したデータベース管理システム(DBMS)は、一つのデータベース内に複数の表(テーブル)を持ち、それぞれを関連付けることができるようになっている関係データベース管理システム(RDBMS:relational DBMS)が主流なんだそうです。
テーブルの概念
![テン・シー・シー-fig.1](https://stat.ameba.jp/user_images/20090404/16/xcc/21/fa/j/o0393024210161243085.jpg?caw=800)
横にデータ項目、縦にデータという形で構成されている表
チンパンジーゲームなら「ゲーム結果テーブル」と「レベル情報テーブル」を用意して「ゲーム結果」のレベルと「レベル情報」のレベルを関連づけるってとこですな。
![テン・シー・シー-fig.2](https://stat.ameba.jp/user_images/20090404/16/xcc/e3/ec/j/o0351052010161243087.jpg?caw=800)
ゲーム結果のレベル5と関連づけられた連続出題数「15」を得ることで、ゲーム結果の1列目のデータは連続正解数も「15」なので、完全制覇、3列目のデータは連続正解数/連続出題数で正解率3/15という判断ができるわけですわ。
ま、この程度ならゲーム結果テーブルに連続出題数も書き込めばいいじゃん、て話で...
どのデータをどのテーブルに振り分けるか、あるいはテーブルひとつで運用するか、テーブルの構成がデータベース制作者の腕の見せ所ってことになるわけやね。だてにブロンズセイントとかゴールドセイントとか用意してねーわけだなオラクル。いやいやセイントは付いてないから。
とりあえずターミナルからsqlite3を使って各局面を経験してみましょう。ターミナルは、ファインダーの移動>ユーティリティメニューを選ぶと表示されるフォルダの中にあります。
![テン・シー・シー-fig.3](https://stat.ameba.jp/user_images/20090404/16/xcc/dc/54/j/o0400026610161243095.jpg?caw=800)
ダブルクリックで起動すると、こんな感じで入力待ち状態になっています。
![テン・シー・シー-fig.4](https://stat.ameba.jp/user_images/20090404/16/xcc/71/70/j/o0400026610161243099.jpg?caw=800)
ちなみに私のターミナルの設定はHomebrew(ターミナル>環境設定...メニューのダイアログで設定)。
define-1)データベース作成・破棄
sqlite3 データベース名
これをやらんことには何も始まらない。SQLiteだと一つのデータベースは一つのファイルになるみたいで
sqlite3 test.db
とすることでデータベースファイルが作成されます。名称はtest.dbでもchimpanzeeでも、なんでもいい。
ファイルはターミナルの初期設定では自分のホーム直下にできます(ただしテーブル作成をおこなうまでファイルは作成されない)。
![テン・シー・シー-fig.6](https://stat.ameba.jp/user_images/20090404/16/xcc/9b/af/j/o0400028210161245880.jpg?caw=800)
破棄はこのファイルを削除するだけ。
この時点でsqlite3が入力を受け付ける状態になって、プロンプトがターミナルのものからsqlite3のものに変わっているはず。
![テン・シー・シー-fig.5](https://stat.ameba.jp/user_images/20090404/16/xcc/99/84/j/o0400034510161243102.jpg?caw=800)
sqlite3のプロンプトで
.quit
と打ち込めばsqlite3が終了します。プロンプトもターミナルのものに戻ったはず。そこから、もう一度
sqlite3 test.db
と打ち込めば、またsqlite3のプロンプトになって、test.dbデータベースに対する作業を再開できます。
define-2)テーブル作成・修正・破棄
create table テーブル名(項目名 型, 項目名 型, .... )
作ったデータベースにテーブルを追加していきます。このさいにテーブル項目の定義もおこないます。
![テン・シー・シー-fig.7](https://stat.ameba.jp/user_images/20090404/16/xcc/8a/7c/j/o0384024610161246950.jpg?caw=800)
今回は試しに
テーブル: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](https://stat.ameba.jp/user_images/20090404/16/xcc/2b/d4/j/o0400010010161246954.jpg?caw=800)
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](https://stat.ameba.jp/user_images/20090404/16/xcc/38/92/j/o0400023010161246957.jpg?caw=800)
難しいのだとこんな感じ。
select
result.datetime,
result.level,
result.correct,
levelinfo.complete
from result,levelinfo
where result.level = 2
and result.level=levelinfo.level;
どうすか?
![テン・シー・シー-fig.10](https://stat.ameba.jp/user_images/20090404/16/xcc/44/e6/j/o0400021510161246977.jpg?caw=800)
レベル2の結果をレベル2の連続出題数付きで表示~。
いや、すげーけどよ。
whereてなんだよ、and result.level=levelinfo.levelとか、わけわかんねーし。日本語しゃべれ。
みたいな。
謎が謎を呼び以下次回!
------------
サンプルデータベースファイル:test.db.zip