前回授業ではDNAデータベースを検索して、自分が必要とするデータを取り出し(検索・ダウンロード)、加工し(アラインメント)、目的とする解析(系統解析)を行った。アンケートでの結果「理解できた」という人が多かったのは、皆さんが、インターネットを使って何かを検索し、データを取り出すという作業に慣れているからだろう。
では、授業で使ったDNAデータベースやYahoo、Amazonなどのサイトで、キーワードを入力して検索をかけた時、どんなソフトウェアが働いて、データが取り出されているか想像したことはあるだろうか?DNAデータベースの場合、数1億件以上のデータ(配列にすると数百億!)という、ちょっと実感がわかないほど大量のデータが、インターネットを介して処理されていることになる。
自分の実験で沢山のデータを処理する場合も、データの量が多くなるほど目的のものを取り出すのが大変になってきて、1つ1つ手作業で処理するということは難しくなる。そんなとき役に立ってくれるのが「データベース」だ。先週使ったDNAデータベースでも、Yahooでも、Amazonでも、いずれもリレーショナルデータベースというシステムを利用することで、塩基配列、生物情報、文献情報などのものすごく大量のデータから、一瞬にして必要な情報を検索し、抽出し、並び替えるという処理をおこなっている。この、
大量のデータの検索・抽出・並び替え |
と
複数のデータ(テーブル)を結合 |
というのが、データベースには簡単にできて、テキストエディタやワープロには簡単にできないことだ。
おそらく、今現在の時点でデータベースを使うことはあまりないだろうが、この技術を知っておくと、将来的にいろんな得をする場面に出会うことは間違い無い(あるいは、授業を聞いておくだけでも、楽をすることができるチャンスに気づくことができる)。さらに、自由に使えるようになれば、心と時間に余裕が生じるだろう。
せっかく情報処理を勉強するのだから、こういう便利な方法があることはぜひ知って欲しい。今日の授業の前半部分ではとにかく、データベースを使って簡単なデータ処理に挑戦してみる。
データベースという言葉は、保存されたデータのまとまりそのものを指すことも、データを管理するシステムのことを指すこともある。この授業でも特に厳密な定義はしない。授業で使うのは、リレーショナルデータベースというシステム(RDBS: Relational Data Base System)を無料で簡単に構築できるソフトウェア、SQLiteだ。このソフトウェアを使って、実際のデータからデータベースを構築し、必要なデータを検索・抽出・並び替えすることを学ぶ。その過程でSQL言語という、データベースとお話するための言葉を使う。
昨年までの授業では、自分のパソコンにフリーソフトウェアSQLiteをインストールして、コマンドラインからデータベースを操作していた。
ちょっとデモしてみるが、コマンドラインからの
という点は、なかなか皆さんには馴染みの無いことらしく、あきらめてしまう人も多かったようだ。そこで今年からは、いつも使っているFireFoxにデータベース利用機能のアドオンを追加して、SQLiteを利用することにする。
なお、皆さんが大学で使っているコンピュータにはAccessというデータベースソフトも入っているが、無料で、自分のパソコンでも使えるという点を重視して、フリーソフトウェアであるSQLiteを使うことにした。
では、今から、SQLiteを使って、データベースとお話ししてみる。
「お話し」などという言い方をすると、なんだか曖昧に聞こえるかもしれないが、これからやるのは、
「データベースから生物学科の先生の名前だけを抜き出して下さい」 とか、 「データベースから教授の名前だけを抜き出して下さい」
などという命令を、コンピュータが理解できるように簡単な英語でデータベースに伝えることだ。
ここから先は、簡単な英語を使って、データベースとお話しする。これから使う英語の意味をまとめておくと、
select :選び出して表示しなさい from 〜 : 〜というデータベースから where : ・・・という条件で
というものだ。
命令の形式さえ守っていれば、コンピュータは内容を分かってくれるので 変更できるところは自由に変更して楽しんでみよう
書式: select <カラム名,,> from <テーブル名,,> where <カラム名>='<値>' order by <カラム名>;注意: 命令文の最後は必ず ;(セミコロン)で終わらなければならない。
もしも、
sqlite> select * from rigakuとセミコロンを抜かして入力してしまうと
...>と表示される。そんなときは、セミコロンを1つだけ入力すると、命令が実行される。
...>;
含まれるテーブル: rigaku テーブル rigaku のカラム shimei, heya, gakka, kouza, shoku, kenmu, kenmu_flag このように、データベースの中にどういうテーブルが入っているか知りたいときは、 sqlite> .tables と入力すると、 rigaku と表示される。また、rigakuの構造を知りたいときは、 sqlite> .schema rigaku と入力すると、rigakuというテーブルのカラム名(列の名前)が( )の中に表示される。 CREATE TABLE rigaku (shimei,heya,gakka,kouza,shoku,kenmu,kenmu_flag);
1. 千葉大学理学部生物学科の教員全員を、分野(kouza)ごとに並び替えてで選び出す 2. 生物学科の教員の氏名と職名と講座名を、講座ごとに選び出し、職名ごとに並べる 3. 理学部の教授の氏名だけを10件だけ表示させる
いま使っている meiboというデータベースには、rigakuというテーブルが入っていることは上でも述べた。
ここで、
テーブル というのは 表 のこと
であることを、理解しておこう。先ほどの rigaku というテーブルは、エクセルを使うと、次のようなテーブルとして表せる。
また、
1つのデータベースファイルの中には、複数のテーブルをしまっておける (エクセルで、複数のワークシートを使うようなもの)
では、エクセルを使わずに、SQLiteを使ってテーブルを操作することの利点は何か?それは、
大量のデータを含んだ、 複数のテーブルを、 1つの命令で簡単に処理できること
だろう。何千、何万ものデータが入ったテーブルを、エクセルで開いて、並べ替えたり、データを抽出したりするのがどれだけ大変なことか、想像してみるといいだろう。
これから実際にSQLiteを使って何ができるかを体験してもらう。目標とするのは、次のようなケースを簡単にSQLiteで簡単に処理することだ。
まず、テーブルを確認しておく。テーブルには、上の例で示したようなカラム名が必要になる。それぞれ、タイプしやすいようなカラム名にしておくといいだろう。
テーブル | テーブル名 | カラム |
名簿 | meibo | gakuseki, namae, yomi |
国語 | kokugo | gakuseki,score |
数学 | sugaku | gakuseki,score |
英語 | eigo | gakuseki,score |
meibo.txt kokugo.txt sugaku.txt eigo.txtという名前で保存しておく。名簿の方はもともとタブ区切りになっているが、点数の方は空白で区切られているし、行頭に空白が入っているので、次の正規表現検索置換をして、テキストファイルにするのを忘れないように。
検索文字列: ^ + 置換文字列<指定しない> 検索文字列: + 置換文字列: ¥t
つぎに、seisekiという名前でデータベースを作成して、上の4つのテーブルを作成して、データを取り込んでみよう
Z:\sqlite>sqlite3 seiseki
sqlite> .mode tab
sqlite> create table meibo (gakuseki, namae, yomi); sqlite> create table kokugo (gakuseki,score); sqlite> create table sugaku (gakuseki,score); sqlite> create table eigo (gakuseki,score);
sqlite> .import meibo.txt meibo sqlite> .import kokugo.txt kokugoこれを、他の科目のについても繰り返す
sqlite> .import sugaku.txt sugaku sqlite> .import eigo.txt eigo
.mode tabや、今行った
.import <テキストファイル名> <テーブル名>というコマンドは、ドットコマンドと言って、データベースのシステムと、データベース以外のファイルの間でデータのやり取りをする命令。一番最後に;(セミコロン)は不要なので、注意。
sqlite> select * from meibo; sqlite> select * from kokugo;
meibo (gakuseki, namae, yomi); kokugo (gakuseki,score);そこで、select文で条件をしていするときに、「学籍番号が共通するものだけを選べ」という命令を入れてみる。このとき、meiboの学籍番号は、meibo.gakusekiで、kokugoの学籍番号はkokugo.gakusekiで表される。
プログラムを正常に終了すると、データは自動的にデータベースファイルに保存される。
sqlite>.quit
これを忘れると、データは消えてしまうので、注意。
上で行った操作とコマンドをまとめておこう。
SQLの最後は ; (半角セミコロン)で終わる ドットコマンドの最初は . (半角ドット)で始まる (セミコロンは不要) 値は ' ' (シングルクォーツ)で囲む (※省略できる場合も多々ある)
Z:\sqlite> ''sqlite3 ex1.db''
create table web (name, name_kana, shozoku, email);
.mode tab
.import 'z:\sqlite\web.txt' web
select * from web;
select name, email, shozoku, date, amount from web left outer join ginko on name_kana = ginko_name;
#ヘルプと現在の設定を表示 .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を実行
Macユーザの人はsqlite3をダウンロードする必要はありません。Macには最初から、sqliteが入っています。
lsと入力すると、ホームディレクトリの一覧が表示される
Shift_JIS CR+LF(Windows)と表示されているので、これをMacのターミナル(UNIX)用に変更する
UTF-8 LF(UNIX)
sqlite3 seisekiと入力すると、seisekiという名前のあたらしいデータベースが作られる。
Macは最初からUNIX系のソフトウェアが入っているので、とても便利ですね。
以下2題とも-http://bean.bio.chiba-u.jp/moodleから提出して下さい。