はじめに
助教時代にデータベース演習を担当した。教材を作成したのが20年前で、参考になる資料がなかなか見つからず苦労した。教科書の例を見るとデータサンプルがお堅くなりがちで、もっとゆるいデータを使って教材を作ってもよいのではないかと感じた。そこで当時はゲームアイテムのデータなどを使ってデータを作成した。最近、「とある科学の超電磁砲」シリーズを見ていたので、このデータを使ってデータベースの教材例を作成してみた。目的は SQL の学習である。ツールとしてはお手軽そうなアプリケーション SQLite を採用した。大学の教材ではとても使えないな。
SQLite の設定
SQLite のインストールには SQLite入門 を参考にした。ダウンロードサイトhttps://www.sqlite.org/ に移動し、download ボタンをクリックすると、ソフトウエアのリストが現れたので、下の画像の赤で囲まれたファイルをダウンロードした。
ファイルを展開して、フォルダごと都合の良い場所に移せればよい。SQLite はこの扱いの手軽さが良い。フォルダ内に3つのファイルがあるはずだ。sqlite3.exe をダブルクリックすると、次のような画面が出現する。これで SQLite はもう起動している。終了には右上の x ボタンを押せば良い。
データベースの作成
SQLite の画面で(コピペで良いので) .open railgun.db と打ち込んで欲しい。すると sqlite3.exe と同じフォルダに railgun.db というファイルが出来上がるはずである。これが1つのデータベースであり、ここにテーブルという形でデータを格納する。テーブルとは、単なる表と思っていただいてよい。データベースは複数のテーブルを管理する単位である。データベースを処分したくなったら、ファイル railgun.db を削除するだけで良い。テーブルをイメージしてもらうために、作成予定のテーブル STATUS の一部を掲載する。
NAME | LEVEL | SKILL |
---|---|---|
御坂美琴 | 5 | レールガン |
上条当麻 | 0 | イマジンブレイカー |
白井黒子 | 4 | テレポート |
初春飾利 | 1 | サーマルハンド |
この表は NAME, LEVEL, SKILL という3つの属性をもった STATUS という名前のテーブルがあることを意味する。
テーブルから目的のデータを取り出すために SQL というプログラミング言語を使う。SQLを実践するためには、テーブルがなければ始まらないので、まずは STATUS とい名前のテーブルを作成する。何も考えず、次のプログラムを SQLite の画面にコピペして欲しい。
CREATE TABLE STATUS ( NAME TEXT PRIMARY KEY, LEVEL INTEGER, SKILL TEXT, CHECK( 0 <= LEVEL ), CHECK( 5 >= LEVEL ) ) ; INSERT INTO STATUS VALUES ( '御坂美琴', 5, 'レールガン' ) ; INSERT INTO STATUS VALUES ( '上条当麻', 0, 'イマジンブレイカー' ) ; INSERT INTO STATUS VALUES ( '白井黒子', 4, 'テレポート' ) ; INSERT INTO STATUS VALUES ( '初春飾利', 1, 'サーマルハンド' ) ; INSERT INTO STATUS VALUES ( '佐天涙子', 0, 'エアロハンド' ) ; INSERT INTO STATUS VALUES ( '固法美偉', 3, 'クレアボイアンス' ) ; INSERT INTO STATUS VALUES ( '婚后光子', 4, 'エアロハンド' ) ; INSERT INTO STATUS VALUES ( '泡浮万彬', 3, 'フロートダイヤル' ) ; INSERT INTO STATUS VALUES ( '湾内絹保', 3, 'ハイドロハンド' ) ; INSERT INTO STATUS VALUES ( '吹寄制理', 0, NULL ) ; INSERT INTO STATUS VALUES ( '土御門元春', 0, NULL ) ; INSERT INTO STATUS VALUES ( '土御門舞夏', 0, NULL ) ; INSERT INTO STATUS VALUES ( '一方通行', 5, 'アクセラレータ' ) ; INSERT INTO STATUS VALUES ( '打ち止め', 3, 'レディオノイズ' ) ; INSERT INTO STATUS VALUES ( '麦野沈利', 5, 'メルトダウナー' ) ; INSERT INTO STATUS VALUES ( '絹旗最愛', 4, 'オフェンスアーマー' ) ; INSERT INTO STATUS VALUES ( 'フレンダ', 0, NULL ) ; INSERT INTO STATUS VALUES ( '滝壺理后', 4, 'AIMストーカー' ) ; INSERT INTO STATUS VALUES ( '浜面仕上', 0, NULL ) ; INSERT INTO STATUS VALUES ( '食蜂操祈', 5, 'メンタルアウト' ) ; INSERT INTO STATUS VALUES ( '弓箭入鹿', 4, 'ウェイブコンダクター' ) ; INSERT INTO STATUS VALUES ( '帆風潤子', 4, 'ランペイジドレス' ) ; INSERT INTO STATUS VALUES ( '口囃子早鳥', 3, 'テレパス' ) ; INSERT INTO STATUS VALUES ( '牧上小牧', 3, NULL ) ; INSERT INTO STATUS VALUES ( '海原光貴', 4, 'テレキネシス' ) ; INSERT INTO STATUS VALUES ( '獄彩海美', 4, 'メジャーハート' ) ; INSERT INTO STATUS VALUES ( '切斑芽美', 4, 'テレキネシス' ) ; INSERT INTO STATUS VALUES ( '誉望万化', 4, 'サイコキネシス' ) ; INSERT INTO STATUS VALUES ( '丘原燎多', 3, 'パイロキネシス' ) ; INSERT INTO STATUS VALUES ( '薄絹休味', 3, 'インシュレーション' ) ; INSERT INTO STATUS VALUES ( '雲川鞠亜', 2, 'バイオレンスドーナツ' ) ; INSERT INTO STATUS VALUES ( '黄泉川愛穂', 0, NULL ) ; INSERT INTO STATUS VALUES ( '垣根帝督', 5, 'ダークマター' ) ; INSERT INTO STATUS VALUES ( '藍花悦', 5, NULL ) ; INSERT INTO STATUS VALUES ( '削板軍覇', 5, NULL ) ;
これでテーブル STATUS は作成された。動作確認をする前に表示設定をする。次のコマンドを入力する。
- .mode column ( または .mode tabs )
- .headers on
動作確認として、SELECT * FROM STATUS WHERE LEVEL=5; と入力すると、(表示はもっと汚いだろうが)次の7人のレベル5の名前が表示される。SQL は大文字で記載されているが、大文字、小文字の区別はなく、単なる習慣である。
NAME | LEVEL | SKILL |
---|---|---|
御坂美琴 | 5 | レールガン |
一方通行 | 5 | アクセラレータ |
麦野沈利 | 5 | メルトダウナー |
食蜂操祈 | 5 | メンタルアウト |
垣根帝督 | 5 | ダークマター |
藍花悦 | 5 | |
削板軍覇 | 5 |
このテーブルを用いていくことになるので、意味を解説しておこう。STATUS は「とある科学の超電磁砲」シリーズに出てくる登場人物のデータを格納している。テーブル名は CHARACTER としたかったが、予約語っぽいので避けて STATUS とした。主要登場人物の多くは能力者であり、能力でレベル分けされている。テーブルの定義部分を再掲する。
CREATE TABLE STATUS ( NAME TEXT PRIMARY KEY, LEVEL INTEGER, SKILL TEXT, CHECK( 0 <= LEVEL ), CHECK( 5 >= LEVEL ) ) ;
定義の文法を理解する必要はないが、ここでは NAME, LEVEL, SKILL の3つの属性が定義されている。それぞれの意図は次の通りである。
- NAME は登場人物の名前であり、文字列で表されている。
- LEVEL は能力のレベルを 0~5 の数値で表している。レベル 0 は無能力者と評価されている。
- SKILL は能力名を文字列で登録している。上の結果でも空欄になっているものがあるが、無能力または能力名が不明の場合である。なぜか無能力者でも登録されている場合がある。空欄には(内部的には) NULL という値らしきものが入っている。
このデータは SQL の課題を作成するのに有意義な構造を持っている。例えば、数値属性と文字列属性があることである。整数値だけでなく実数値属性もある方が望ましかった。NULL値を扱っている点も良い。
SQL 問い合わせの初歩
SQL 問い合わせの基本構文は SELECT (表示したいもの) FROM (テーブル名) WHERE (条件) ; である。上で使った SELECT * FROM STATUS WHERE LEVEL=5; と比較しよう。(表示したいもの) は属性を列挙することが多い。属性全部を列挙したい場合に * で代用できる。問い合わせるテーブル名がSTATUS なので、上の SQL 文でもそうなっている。条件には LEVEL=5 を指定したので、LEVEL が 5 のデータのみが抽出された。条件部に利用できる簡単なルールをあげておく。
- 等しい(=)、等しくない(<>) といった比較演算が可能である。TEXT の場合は文字列を ‘ ‘ で囲む必要がある。
- 数値の場合には、大小比較 (>=, <=, >, < ) が可能である。
- 論理演算 NOT, AND, OR が使用できる。
最後に簡単な課題を解いて SQL に慣れておこう。
課題
(1) レベルが4以上の人物を検索し、 名前 と レベル を表示せよ。
(2) レベルが 1~3 の人物を検索し、 名前 と レベル を表示せよ。
(3) 能力名が「エアロハンド」である人物の名前を表示せよ。
(4) 能力者(レベルが 0 でない)人物の全項目を表示せよ。
解答例
(1) SELECT NAME, LEVEL FROM STATUS WHERE LEVEL >= 4 ;
(2) SELECT NAME, LEVEL FROM STATUS WHERE ( 1 <= LEVEL ) AND ( LEVEL <= 3 ) ;
(別解)SELECT NAME, LEVEL FROM STATUS WHERE ( LEVEL=1 ) OR ( LEVEL = 2 ) OR ( LEVEL = 3 ) ;
(3) SELECT NAME FROM STATUS WHERE SKILL=’エアロハンド’ ;
(4) SELECT * FROM STATUS WHERE LEVEL <> 0 ;
(別解)SELECT * FROM STATUS WHERE NOT ( LEVEL = 0 ) ;
(別解)SELECT * FROM STATUS WHERE LEVEL > 0 ;