超電磁砲でデータベース(準備編)

はじめに

助教時代にデータベース演習を担当した。教材を作成したのが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 の一部を掲載する。

NAMELEVELSKILL
御坂美琴5レールガン
上条当麻0イマジンブレイカー
白井黒子4テレポート
初春飾利1サーマルハンド
テーブル STATUS

この表は 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 は大文字で記載されているが、大文字、小文字の区別はなく、単なる習慣である。

NAMELEVELSKILL
御坂美琴5レールガン
一方通行5アクセラレータ
麦野沈利5メルトダウナー
食蜂操祈5メンタルアウト
垣根帝督5ダークマター
藍花悦5
削板軍覇5
SELECT * FROM STATUS WHERE LEVEL=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 ;