編集中です!大量データの一括処理:SQLiteによるリレーショナルデータベース入門

前回授業ではDNAデータベースを検索して、自分が必要とするデータを取り出し(検索・ダウンロード)、加工し(アラインメント)、目的とする解析(系統解析)を行った。アンケートでの結果「理解できた」という人が多かったのは、皆さんが、インターネットを使って何かを検索し、データを取り出すという作業に慣れているからだろう。

では、授業で使ったDNAデータベースやYahoo、Amazonなどのサイトで、キーワードを入力して検索をかけた時、どんなソフトウェアが働いて、データが取り出されているか想像したことはあるだろうか?DNAデータベースの場合、数千万件のデータ(配列にすると数百億!)という、ちょっと実感がわかないほど大量のデータが、インターネットを介して処理されていることになる。

自分の実験で沢山のデータを処理する場合も、データの量が多くなるほど目的のものを取り出すのが大変になってきて、1つ1つ手作業で処理するということは難しくなる。そんなとき役に立ってくれるのが「データベース」だ。先週使ったDNAデータベースでも、Yahooでも、Amazonでも、いずれもリレーショナルデータベースというシステムを利用することで、塩基配列、生物情報、文献情報などのものすごく大量のデータから、一瞬にして必要な情報を検索し、抽出し、並び替えるという処理をおこなっている。この、

大量のデータの検索・抽出・並び替え

複数のデータ(テーブル)を結合

というのが、データベースには簡単にできて、テキストエディタやワープロには簡単にできないことだ。
おそらく、今現在の時点でデータベースを使うことはあまりないだろうが、この技術は知っておいて、絶対に損はない。将来的に自由に使えるようになれば、心と時間に余裕が生じるだろう。

せっかく情報処理を勉強するのだから、こういう便利な方法があるということを知っておかなければ勿体ないので、今日の授業の前半部分ではとにかく、データベースを使って簡単なデータ処理に挑戦してみる。

第13回授業の獲得目標: [worried]

1. リレーショナルデータベース(SQLite)をインストールする

データベースという言葉は、保存されたデータのまとまりそのものを指すことも、データを管理するシステムのことを指すこともある。この授業でも特に厳密な定義はしない。授業で使うのは、リレーショナルデータベースというシステム(RDBS: Relational Data Base System)を無料で簡単に構築できるソフトウェア、SQLiteだ。このソフトウェアを使って、実際のデータからデータベースを構築し、必要なデータを検索・抽出・並び替えすることを学ぶ。その過程でSQL言語という、データベースとお話するための言葉を使う。

まずはリレーショナルデータベースシステムを利用するために必要なフリーソフトウェアSQLiteをインストールする。これは予習課題でやって貰っているはずだ。なお、皆さんが大学で使っているコンピュータにはAccessというデータベースソフトも入っているが、自分のパソコンでも無料で使えるという点を重視して、この授業ではSQLiteを使うことにした。SQLiteはダウンロードした実行ファイルをクリックするだけで、データベースを扱うことができるし、データベースのデータ本体が1つのファイルに保存されるので、コピーやバックアップが簡単にできるという特徴を持っている。

SQLiteのインストール

では、以下のリンクから、SQLiteの実行形式ファイルをダウンロードしよう。

SQLiteについて自習する場合は、以下のサイトを参照してみよう

2. コマンドプロンプトの利用法と、コンピュータにおけるディレクトリ構造を修得する

さて、いよいよSQLiteを使ってデータベースを操作するのだが、このとき必要になるのが、

コマンドプロンプト

というものだ。

「すべてのプログラム/アクセサリ/コマンドプロンプト」を起動

まずコマンドプロンプトというソフトウェアを起動しよう。

ウィンドウズのスタートメニューから、「すべてのプログラム/アクセサリ/コマンドプロンプト」を選ぶ。
WS000009.JPG
そうすると黒いウィンドウが開き、Rで使ったようなプロンプト

>

が表示される。これはWindowsXPというOS(オペレーションシステムという、コンピュータの基本ソフト)に、キーボードから命令を入力する処理系だ。普段、皆さんが使っている処理は、「マウスをクリックすることでコンピュータに命令を与えている」わけだが、コマンドプロンプトでは、「文字を入力することで、コンピュータに命令を与える」。試しに下の囲みのように

>notepad

と入力すると、WindowsXPの「メモ帳」が起動する。 つまり、文字を入力することでコンピュータに命令を与えたわけだ。
実は、マウスをクリックしてコンピュータに命令を与えるインターフェース(ヒトと機会を繋ぐもの)は、コンピュータのハードウェアやOSに依存する部分が多いので、ソフトウェアを開発するプログラミングがそれだけ面倒になる。でも、今見ているコメンドプロンプトは、文字で命令を与えるので、そういう面倒な部分のプログラミングが必要ない。そのため、コマンドプロンプトを採用する方が、ソフトウェアの開発にかかる手間が減るわけだ。

演習: コマンドプロンプトで命令を入力して、フォルダ(または、ディレクトリと言う)の中身を表示してみよう
> dir

3.データベースとお話しよう:  SQLという言語の利用

では、今から、SQLiteを使って、データベースとお話ししてみる。
「お話し」などという言い方をすると、なんだか曖昧に聞こえるかもしれないが、これからやるのは、

「データベースから生物学科の先生の名前だけを抜き出して」
 とか、
「データベースから教授の名前だけを抜き出して」

などという命令を、データベースに英語で与えるものだ。

サンプルデータベースの準備

SQLite3の起動~

  1. カレントディレクトリの移動: 
    コマンドプロンプトで、自分が今いる閲覧している場所の中を、もう一度見てみよう。
    > dir
    そうすると、ここには先ほどだるンロードした、meiboというデータベースファイルは入っていないことが分かる。
    そこで、まず、自分がコマンドプロンプトから閲覧しているディレクトリを 次の命令を使って、Z:\sqlite に変更する。そうすると、プロンプトのところが、Z:\sqlite> に変わる。
    > cd z:\sqlite
    Z:\sqlite>
    ついでに、dirと打って、sqlite3.exemeiboというファイルが入っていることを確認しておこう。
     Z:\sqlite>dir
  2. sqlite3を使ってmeiboデータベースを開く
    ここまで準備ができたら、
    >sqlite3  meibo
    と入力すると、SQLiteが起動し、先ほどダウンロードしたmeiboというデータベースファイルが開かれる

SQLiteを使って、データベースとお話しする

ここから先は、簡単な英語を使って、データベースとお話しする。これから使う英語の意味をまとめておくと、

select    :選び出して表示しなさい
from  〜  : 〜というデータベースから
 where  :  ・・・という条件で

というものだ。

命令の形式さえ守っていれば、コンピュータは内容を分かってくれるので
変更できるところは自由に変更して楽しんでみよう

データベースにおけるテーブルの概念を理解する [smile]

いま使っている meiboというデータベースには、rigakuというテーブルが入っていることは上でも述べた。
ここで、

テーブル というのは 表 のこと

であることを、理解しておこう。先ほどの rigaku というテーブルは、エクセルを使うと、次のようなテーブルとして表せる。
#13_1.gif
また、

1つのデータベースファイルの中には、複数のテーブルをしまっておける
(エクセルで、複数のワークシートを使うようなもの)

では、エクセルを使わずに、SQLiteを使ってテーブルを操作することの利点は何か?それは、

大量のデータを含んだ、 複数のテーブルを、 1つの命令で簡単に処理できること

だろう。何千、何万ものデータが入ったテーブルを、エクセルで開いて、並べ替えたり、データを抽出したりするのがどれだけ大変なことか、想像してみるといいだろう。

SQLiteを使って、2つ以上のテーブルを連結して、データを抽出する方法に挑戦!! [smile]

これから実際にSQLiteを使って何ができるかを体験してもらう。目標とするのは、次のようなケースを簡単にSQLiteで簡単に処理することだ。

テーブル作成の準備

まず、テーブルを確認しておく。テーブルには、上の例で示したようなカラム名が必要になる。それぞれ、タイプしやすいようなカラム名にしておくといいだろう。

テーブルテーブル名カラム
名簿meibogakuseki, namae, yomi
国語kokugogakuseki,score
数学sugakugakuseki,score
英語eigogakuseki,score

データをデータベースに入れる。

  1. タブ区切りテキストファイルの準備
    データをSQLiteで使える形にするには、タブ区切りテキストファイルの形にしておかなければならない。そこで、名簿とそれぞれの科目を、K2Editorを使って、タブ区切りテキストファイルとして保存する。それぞれ、
    meibo.txt
    kokugo.txt
    sugaku.txt
    eigo.txt
    という名前で保存しておく。名簿の方はもともとタブ区切りになっているが、点数の方は空白で区切られているし、行頭に空白が入っているので、次の正規表現検索置換をして、テキストファイルにするのを忘れないように。
    検索文字列: ^ +  置換文字列<指定しない>
    検索文字列:  +  置換文字列: ¥t

この4つの情報を統合して、学生ごとの成績を一覧表示する場合を考えてみましょう。こういうときエクセル、テキストエディタの組み合わせで、次のような手順で操作を行えば、4つの表から目的のデータを抜き出すことができます。

  1. まず、上の成績ファイルをデータベースで利用できる形のテーブルにまとめることを考えます。うえのデータをそれぞれタブ区切りテキストに変換し(正規表現検索・置換です)、科目名を付け加え、1つのテーブルにまとめます。(:SQLを使う場合、3つをそれぞれ別のテーブルとして扱う方が、簡単かもしれません。でも、この授業では、エクセル・テキストエディタ・データベースの合わせ技を勉強させたいのと、なるべく簡単な命令文を使いたいので、エクセルで簡単にできることはエクセルでやってしまいます。3つをそれぞれ別の表として扱う方法は、後の授業のページで説明します。)
    • ワードで開いた成績ファイルをK2Editorでタブ区切りテキストに変換して、エクセルに移動します。エクセルで、それぞれの科目ごとに新しいカラムを付け加えます。(全部をK2Editorでやっても構いません)。
          06S4061   42
          06S4028   44
      なら、
          06S4061   42   eigo
          06S4028   44   eigo
      にするわけです。この作業を国語、数学、英語の3教科のデータについて行います。
      • (学籍番号ごとに集計するだけなら、エクセルでもできますよね(だいぶ前にやりました))
  2. 次に、上で1つのファイルにまとめた3教科分のデータを、タブ区切りのテキストファイルに保存します。K2Editorで新しい書類を作って、そこに、上の3つのファイルの内容を、コピーペーストします。
    • 注:もちろん、エクセルで最初からタブ区切りテキストにセーブしても構いませんし、エクセルを使わずに、最初からK2Editorを使って正規表現検索置換で科目名を加えてもかまわないのですが、ここで両方のソフトウェアを立ち上げているのは、もっと複雑な処理が必要になったとき
      エクセル: データをカラム分けて眺めつつ、編集できる
      テキストエディタ: 正規表現検索・置換を行うことで、データの一括整形ができる
      ことを利用して、場合によってはそれぞれのステップで編集できることを思い出して貰うためです。
         06S4061   42   eigo
         .
         .
         06S4063   55   sugaku
         .
         .
         06S4066   66   kokugo
         .
         .
      のようなデータをK2Editorで作って、これを、ex3.txtというファイル名で、Z:\sqlite\に保存します。
  3. 次にSQLiteを立ち上げて、テーブルを2つ作ります。
    • 1つは、先ほど作ったex3.txtの内容を入れるテーブルで、scoreという名前にします。このテーブルは
            gakuseki    score    kamoku
      という列からできています。のデータベースを作る命令は
    • もう1つは、meibo.txtの内容を納めるテーブルで、meiboという名前にします。このテーブルは
            gakuseki   namae   yomi
      という列からできています。
    • 実際の操作は次のようにします。コマンドラインから、SQLiteを起動して, ex3.dbという名前のデータベースを作ります。
      Z:\sqlite>sqlite3 ex3.db
    • 次に、上で考えた2つのテーブルを作ります。
      sqlite> create table score (gakuseki, score, kamoku);
      sqlite> create table meibo (gakuseki, namae, yomi);
  4. 2つのテーブルに先ほど作ったex3.txtのデータと、meibo.txtのデータをそれぞれ読み込んで、gakusekiをキーにして関連づければ、それぞれの、氏名と科目の点数合計などを表示することがきます。
    • まず、入力ファイルの区切り文字をタブに変更します(忘れられがち)
      sqlite> .mode tab
    • まず、それぞれのテーブルにデータを読み込みます。
      • 上の操作が追いつかなかった人は、このファイルを使ってください&ref(): File not found: "ex3.txt" at page "授業/H21/情報処理/13";。
        sqlite> .import 'ex3.txt' score
        sqlite> .import 'meibo.txt' meibo
    • これでデータが入ったはずです。確かめるには、select命令を使います
      sqlite> select * from score;
      sqlite> select * from meibo;
    • それでは、2つのテーブルをgakuseiで関連づけてみましょう。
      • sqlite> select * from meibo left outer join score on meibo.gakuseki = score.gakuseki order by yomi;
    • 他にも、命令の最後の部分を
        order by yomi limit 10;
      などにかえてやってみてください。

2つのシート(下の方にあるタブ) 「Web登録データ」と「銀行振り込み」が入っている。
会計係のあなたは、2つの表を比較して、参加費未納者や、振り込み金額間違いのリストを作らなければならない。また、メールアドレスを抜き出して、督促状を送らなければならない。

さて、どうすれば良いだろうか?

このケースでは、2つの表がる。

ウェブ登録で得られた参加者のデータ: 氏名、よみがな、所属、メールアドレス(後にmeiboと呼ぶ表) 銀行から得られた振り込みリスト: 日付、振り込み人氏名(カナ)、振り込み金額(後にfurikomiと呼ぶ表)

手作業で解決するならば、それぞれの表をエクセルで1つのシートにまとめ、氏名で並び替え、上から順に、会費未納の人はいないか(あるいは、2回振り込んでしまっている人がいないか)、振り込み金額が間違っている人がいないかをチェックする。
しかし、この例で用いた100件のデータでもかなり大変な作業になる。これが2000件とか1万件とかのデータを対象に手作業でやるとなると、、、、ちょっと気が遠くなってしまう。

こういうときこそ、データベースソフトウェアであるSQLiteの出番だ。まず答えだけを言ってしまうと、SQLiteを使って2つのテーブルを連結して、2つを比較する次の命令を与えれば、上の作業をコンピュータにやらせることができる。

select name, email, shozoku, date, amount from web left outer join ginko on name_kana = ginko_name;
では、2つのテーブルが連結できるところまで、話しを進めてみよう。全体の流れは次のようになる。

1. エクセルの表のデータをSQLiteのテーブルに移す
 1-1. SQLiteを起動し、webとginkoというテーブルを作成する
  create table web (name, name_kana, shozoku, email);
  create table ginko (date, ginko_name, amount);
 1-2. エクセルのデータをK2Editorにコピーし、タブ区切りテキストにしておく
  web.txt, ginko.txtという2つのファイルを作る
 1-3. SQLiteで、webとginkoというテーブルに、web.txt, ginko.txtの内容をそれぞれインポートする
  import 'z:\sqlite\web.txt' web
  import 'z:\sqlite\ginko.txt' ginko
2. SQLiteの2つのテーブルで、ヨミガナが同じデータ同士を連結する
 2-1. select ... left outer join ...という命令で2つのテーブルを連結
  select name, email, shozoku, date, amount from web left outer join ginko on name_kana = ginko_name;
 2-2. 得られた結果をK2Editorにコピーし、空白の連続をタブに変換して、エクセルで閲覧

上のような操作で2つのテーブルを連結することで、次のような表が得られ、Web登録をしたのに銀行振り込みしていない人がいるかどうかや、間違った金額を支払っている人がどれくらいいるかなどを知ることができる。

nameemailshozokudateamount
市川トミ子06S4080@gmail.com東北大・院・理2008-05-09(Fri)6000
越川和彦06S4010@gmail.com東大院・理学系・生物科学2008-05-16(Fri)7000
宇山智哉06S4009@gmail.com東邦大・医・生物2008-05-16(Fri)6000
宇山秀樹06S4008@gmail.com東邦大・理・生物
坂場三男06S4064@gmail.com東北大・院・生命科学2008-05-16(Fri)6000

というテーブルが得られることを期待している。上をみると、2番目の人は払いすぎ、4番目の人は払っていないことがわかる。

SQLiteの起動:コマンドプロンプトから起動し、テーブルを作成

エクセルにあるデータをSQLiteで処理するには、まず、SQLiteを起動してテーブルを作成し、エクセルのデータを入れなければならない。

  エクセルの表のデータをSQLiteに移す
 そのために、SQLiteを立ち上げ、エクセルの表に対応するテーブルを作る
データベース名:   ex1.db (コマンドプロンプトから「sqlite3 データベース名」で作成
    テーブル:       web   (起動後(プロンプトはsqlite> )SQL命令(create table...)を入力
    テーブル:       ginko  (起動後(プロンプトはsqlite> )SQL命令(create table...)を入力
    ※1つのデータベースは1つまたは複数のテーブルがあつまってできている
      エクセルのそれぞれの表は、データベースのテーブルのそれぞれに相当

データベースを作成する命令: Windowsのコマンドプロンプトから、次のように入力。

Z:\sqlite>sqlite3 ex1.db

sqlite3 <データベース名>は、新しいデータベースを作ったり、もしすでに作成済みのデータベースがあれば、それを開く命令。上の命令を入力すると、画面がSQLiteのコマンドプロンプト(sqlite>)に変わる。 (注意:このとき、ex1.dbというデータベースは、z:\sqlite\というフォルダの中にできている)

先ほどの操作のまとめ

上で行った操作とコマンドをまとめておこう。

SQLの最後は ; (半角セミコロン)で終わる
ドットコマンドの最初は . (半角ドット)で始まる (セミコロンは不要)
値は ' ' (シングルクォーツ)で囲む (※省略できる場合も多々ある)
  1. SQLiteの起動とデータベースを作成
    Z:\sqlite> ''sqlite3 ex1.db''
    • 意味: ex1.dbというデータベースファイルを作成(または既存の場合は開く)。OSのコマンドラインから入力された。場所はsqliteフォルダの中
  2. テーブルの作成:SQL: create table
    create table web (name, name_kana, shozoku, email);
    • 意味:name, name_kana, shozoku, email という4つのカラムを持つwebというテーブルを作成
  3. 外部ファイルの区切り文字を指定:ドットコマンド: .mode
    .mode tab
    • 意味:入出力に使われるファイルでは、カラム同士はタブで区切られていると設定する
  4. 外部データのインポート:ドットコマンド .import
    .import 'z:\sqlite\web.txt' web
    • 意味:sqliteフォルダに入っているweb.txtをテーブルwebに読み込み
  5. テーブル内容の表示:SQL: select
     select * from web;
    • 意味:webの全てのカラム(*で示されている)を選択して表示
  6. 2つのテーブルを連結して表示:SQL: select
    select name, email, shozoku, date, amount from web left outer join ginko on name_kana = ginko_name;
    • 意味:webとginkoからname, email, shozoku, date, amount を表示する。但し、webのデータは全部表示させ、ヨミガナが一致するデータがあるものについてだけ、ginkoのデータも表示させる

命令文を知りたい時は

 ここまでで説明した命令文についてもっと知りたいときは、

以上、駆け足でSQLiteの使い方を見てきたが、データベースはどのパソコンでも使えるし、大量データの一括処理という意味では、これに勝る方法は無いのだが、一般ユーザーにはあまり使われていないのが現状だろう。皆さんも、今回の挑戦で行った操作をなんとなくで良いから覚えておき、今後のデータ処理に役立てて欲しい。

ドットコマンドの説明(よく使うものだけを抜粋)

#ヘルプと現在の設定を表示
   .help                  ヘルプの表示
   .show                  様々な項目の現在の設定値を表示
#プログラムの終了
   .exit                  プログラムの終了
   .quit                  プログラムの終了
#外部ファイルからのデータ取り込み・データ書き出し
   .import FILE TABLE     TABLEにFILEの内容をインポートする
   .output FILENAME       出力結果をFILENAMEという名前のファイルに保存
#外部ファイルのデータ区切り文字を設定
   .mode MODE ?TABLE?     入力・出力ファイルの区切り文字切り替え。以下(一部のみ解説)のいずれか
                            csv      コンマ区切り(Comma-separated values)
                            column   左揃えの列
                            html     HTMLの<table>タグ
                            line     1行に1つの値
                            list     .separator(下の指定) 指定された文字で区切る
                            tabs     タブ区切り
   .separator STRING      ".mode"と".import"で使うファイルの区切り文字をSTRINGで指定されたものに設定
#画面に表示される出力文字列の設定
   .output stdout         出力結果をスクリーンに表示
   .header(s) ON|OFF      ヘッダーのオン・オフ切り替え
   .nullvalue STRING      STRING で指定された文字列を NULL(ヌル・データ無しのこと)のところで表示
   .width NUM NUM ...     "column" modeのときのカラムの幅を指定
#テーブル一覧とテーブルの設定表示
   .tables ?PATTERN?      PATTERNにマッチするテーブルを一覧
   .schema ?TABLE?        TABLEが作られた時のCREATE命令を表示
   .dump ?TABLE? ...      テーブルの内容をSQLで表示
#その他
   .prompt MAIN CONTINUE  標準プロンプトを入れ替える
   .read FILENAME         FILENAMEに書かれたSQLを実行

第13回授業の課題

課題1.意見調査

  1. http://bean.bio.chiba-u.jp/joho/index.php?joho20 に、「自分のID」/13 という新しいページを作成し、下の囲みの中にあるアンケートをコピー・ペーストして、「回答:」の後に答えを書き込むこと。
*第13回授業・基本課題 
**氏名:
**課題への回答
-今日の授業の進み方は?(はやい、丁度いい、おそい)
--回答:
-今日の授業の難しさはどう感じましたか(簡単 丁度いい 難しい):
--回答:
-難しいと答えた人は、特にどの点が難しかったですか?:
--回答:
-今日の授業は(分かった 半分ぐらいは分かった 分からなかった):
--回答:
-分からないと答えた人は、特にどの点が分からなかったですか?:
--回答:
-今日の講義で分からなかった用語があったら挙げてください:
--回答:
-授業に関する要望・質問があったらなんでもどうぞ:
--回答:
-課題2の答え
--2-1:
--2-2:
-課題3の答え:

課題2(復習):SQLiteへの挑戦の結果

課題3(予習):ウェブページの作成と公開