はじめてのSQLite(はじめてのデータベース)

つい一週間前に,筆者がデータベース初めて使う時のメモです.自分が習いながら書いた内容なので,初心者の方は読みやすいかと思います.要点だけポンポン書いてあるので,初心者向けのわかりやすい投稿になっているといいな...

次の条件のどれかにあたはまる方は,ぜひ見ていただきたいです.

  1. 初めてデータベースを使おうとしている
  2. とりあえず一通りSQLiteの使い方を理解したい
  3. 1ページをサラッと読むだけで,ある程度理解したい
  4. 見るだけもいいけど,簡単なのを動かしながら勉強したい(ハンズオンって言うんですか?)

一般的な操作とその例を必ず書くようにしています.

注意:つまらない冗談をスルー出来ない方には,読むとイライラするかもしれません.







データベースって?

例えば,「夏 – ヴィヴァルディの四季より」という曲を考えると,

  1. ジャンル:クラシック
  2. 作者:ヴィヴァルディ
  3. 演奏タイプ:協奏曲
  4. 主旋律の楽器:バイオリン

のように,一つの曲についても様々な情報を付随させることができる.

これらを一つのまとまりとして,曲の情報を「曲名 – ジャンル – 作者 – 演奏タイプ – 主旋律の楽器」のようにまとめることができる.このような一つの情報のまとまりを作って,それを簡単に扱えるようにしてくれるのがデータベースの役割.

企業などで使われる例としては顧客情報の管理が一番考えやすい.その場合だと,例えば,「お客様の名前 – 性別 – 生年月日 – 利用回数 – …」のようなものが考えられる.

Windowsを使っている人は,エクセルをイメージしてもらうといいかも.

データベースとして,SQLite を採用した理由

SQLってのは,データベースの扱いに特化したプログラム言語の総称みたいなもんらしい.

データベースのソフト(?)にはMySQLとかMicrosoft SQL Serverとかいろいろあるけど,著作権などの問題を考えたくないので,2016年11月23日現在パブリックドメインである”SQLite”を採用した.他のSQLソフトに比べて機能は少し制限されているようだが,学習用には十分かと思った.

MySQLの著作権の問題はこちらにいろいろ書いてある.
http://anond.hatelabo.jp/20140722001658

SQLiteのインストール

Linux

Linuxだと公式リポジトリからダウンロードできるので,各自のOSに合わせたダウンロード方法を調べましょう.すぐ出てくると思います.2016年11月23日現在,apt-get, yum, (ArchLinuxの場合)pacman,どれでもあるようです.

Windows10

今回の筆者のインストール環境はWindows10でした.

STEP1:SQLiteのホームーページに行く

画像と文章に,SQLiteの公式ホームページへのリンクが張ってあります.
sqlite370
http://www.sqlite.org/

2016年11月23日現在,”Latest Release:Version 3.15.1 (2016-11-04). [Download] [Prior Releases]”と書いてあるので,そこの”[Downloadをクリック]”

STEP2:自分のコンピュータのOSと合うものをダウンロード

SQLiteを使うイメージは「コマンドプロンプトやPowerShellでSQLiteを動かす」といった感じだ.SQLiteはGUIアプリではないので,「マウスでポチポチ,簡単操作」というわけにはいかない.ということで,このコマンド用のSQLをダウンロードする.

注意すべきは,「自分のパソコン(のCPU)は64bitだから,Precompiled Binaries for Windowsのsqlite-dll-win64-x64-3150100.zipをクリックしたれー」ではイメージ通りの使い方ができない.ちなみにこちらをダウンロードして回答すると「dllファイル」というものが入っているのだが,これはSQLiteをそれ以外のプログラムから使うときに必要みたいだ.

ということでコマンドで使いたいから,64bitコンピューターであっても,”Precompiled Binaries for Windows”の”sqlite-tools-win32-x86-3150100.zip”をクリックしてダウンロードする.

STEP3:ダウンロードしてきたのを解凍

ダウンロード下のを解凍すると次の3つが入っている.

  1. sqdiff.exe
  2. sqlite3.exe
  3. sqlite3_analyzer.exe

たったこれだけがSQLiteの全部.さすが”Lite”という文字が入っているだけはある.主に使う「SQLite本体」は2番目の”sqlite3.exe”.

STEP4:念のため,ダウンロードした奴が正しく動くか確認

さっそく”sqlite3.exe”をダブルクリックして実行する.もしくは,コマンドプロンプトやシェルで”sqlite3.exe”を実行させてもよい.ダブルクリックで実行させると,次のようなメッセージが出てきて起動する.

SQLite version 3.15.1 2016-11-04 12:08:49
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

SQLiteを使ってみる

早速使ってみる.

データベースのイメージ

楽に学習するために,ある程度の先入観は助けになることもある.SQLiteを学ぶ際は次のような先入観を持っておくと,スムーズに学習できた.

まず,一つのデータベースファイルの中に,何個もデータベースファイルを作ることができる.「一つのデータベースファイルに一つのデータベース」とは限らない.

そして,その一つのデータベースの中身を見てみると,表みたいに縦と横にマス目があって,そのマスの中にデータが入っている.早い話が,データベースのデータとは表のことである(暴言).ということで,しばらくはエクセルをイメージしてもらってオッケー.

データベースの作成

まずは,SQLiteから「データベースファイル」を作ってみる.エクセルでいうところの「エクセルファイルを作成」

.open [ファイル名]

で簡単にできちゃう.

例えば,”test.db”という名前のデータベースファイル(.dbのdbはデータベース(DataBase)の略)を作りたいときは次のようにタイプする.前にある”sqlite> “というのは「今キーボードで打っている指示はコマンドラインじゃなくってSQLiteのものですよ」と言っているだけなので,今後特に気にしない.デフォで表示されるものだから,マネしてタイプしてもいけない

sqlite> .open test.db

今までの流れ通り作業が進んでいれば,”sqlite3.exe”があるフォルダに”test.db”っていうファイルができている.そんでもってこれから何かいじると,この”test.db”っていうファイルに書き込まれる.

“test.db”のdbの部分(拡張子)は別に何でもよい.”test.sqlite3″とかでもオッケー.

ちなみに,SQLiteに何か操作させたいときは「.なんちゃら」っていう形が基本.

データベースファイルが作られたか確認

自分が慎重派なので,データベースファイルが本当に作られたのか気になるところ.不安なので,次のコマンドで今扱っているデータベースを見る.

sqlite> .databases

すると次の画面が表示される.

seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             C:\SQLite_test\sqlite-tools-win32-x86-3150100\test.db

筆者の場合,SQLiteのzipファイルとをダウンロードした先が”C:\SQLite_test”で,”sqlite3.exe”があるフォルダが”C:\SQLite_test\sqlite-tools-win32-x86-3150100\”だったのでこのようなメッセージになっている.確かにfileのところに”test.db”というファイルができている.seqとnameは今のところ気にしない.

テーブルを作る

エクセルでいうところの「シートを作成する」作業に相当.「SQLでのテーブル=エクセルのシート」で問題なし.エクセルの場合,デフォルトでは新しく作ったエクセルファイルを開いたら自動的にシート(3つ)を作ってくれてたけど,SQLではそこまで自動で余計なことはせず,直接作成するイメージ.

やり方は

create table [テーブルの名前]([データ名1],[データ名2]...);

見たいにやる.”create table”は大文字”create table”でもオッケー.

言葉で伝えるのが下手だから例を見る.例えば,一番最初の曲に関してのデータの例は「曲名 – ジャンル – 作者 – 演奏タイプ – 主旋律の楽器」のような組を扱っていた.このようなデータベースを”Musics”という名前で作りたい.このときは,次のようにしてあげればよい.

create table Music(Title, Genre, Composer, Type, MelodyInst);

これでテーブル,表(エクセルでいうところのシート)が作成された.かっこの中は「曲名,ジャンル,作者,演奏タイプ,主旋律の楽器」を筆者の全力を尽くして訳した結果.

最後の”;(セミコロン)”を必ず忘れないように.忘れてしまうと次のような結果を返される.

sqlite> create table Music(Title, Genre, Composer, Type, MelodyInst)
   ...>

セミコロン(;)は「文章の終わり」を意味しているので,これがないとSQLは「まだ文章が続くのか」と認識する.流石プログラム,融通が利くはずもない.”…>”は「続きを書けよ」と煽ってきている.これを解決するには「いや,終わりだから」という意味でセミコロンを打てばよい.

sqlite> create table Music(Title, Genre, Composer, Type, MelodyInst)
   ...> ;
sqlite> 

何事もなかったかのように次の指示を待っている.プログラムは正しくしつけてあげれば大変物わかりのいい子である(むしろ,正しくしつけられているのはユーザーである人間側の気もするが...)

出来たテーブルの確認

しつこいようだが,心配性なので,ちゃんと作成されたか確認したくなる.今扱っているデータベースファイルの中のデータベース(テーブル)を確認するためには次のようにする.

.table

今の場合だと次のような応答が帰ってくる.

Music

正しく作成されているようだ.

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

さっきの音楽のデータをぶち込む.入れ方は

insert into [テーブル名] values([データ名1の値],[データ名2の値],...);

のようにする.

例として,冒頭で挙げた「夏 – ヴィヴァルディの四季より」の例だと,次のように入力すればよい.

insert into Music values('Summer','Classic','Vivaldi','Concert','Violin');

最後の”;(セミコロン)”を必ず忘れないように

データを入力すると,何もなかったかのように改行されて”sqlite> “が表示されるが,正しく追加されている.

データベースを確認

この心配性め.確認方法は

select * from [テーブル名];

とすることで,テーブルのデータ全部取ってくる.最後の”;(セミコロン)”を必ず忘れないように

“select”というのは言葉の通り「データベースの中から,ある条件を満たすものを引っ張ってくる」という操作なのだが,ワイルドカード(*)を使ってあげることでとりあえず”Music”というテーブルのデータを全部持ってきて表示してくれる.

今の例だと次のように表示される.

sqlite> select * from Music;
Summer|Classic|Vivaldi|Concert|Violin

縦棒(|)がデータの区切りをしてくれている.

しつこいようだが,前にある”sqlite> “というのは「今キーボードで打っている指示はコマンドラインじゃなくってSQLiteのものですよ」と言っているだけなので,今後特に気にしない.デフォで表示されるものだから,マネしてタイプしてもいけない
ってなっている.

もっとデータ追加

追加してみる.もっとデータを追加する際も,さっきと全く変わらない.2016年11月23日現在,世間で流行っているようである”PPAP”を追加.

insert into Music values('PPAP','EDM(?)','Pikotaroh','Dance+Music','Voice');

ちゃんと追加されたか確認する.

sqlite> select * from Music;
Summer|Classic|Vivaldi|Concert|Violin
PPAP|EDM?|Pikotaroh|Dance+Music|Voice

ガタガタして見づらいので,出力を修正

縦棒の位置がそろってないから,どこが対応しているのかすごく見づらいし,知らない人が見たら最初の列が何を言っているのかわからない.ということで出力を見やすくするおまじないを唱える.

.header on
.mode column

これを打ってからもう一回表示させると,かなり整然と表示される.

sqlite> select * from Music;
Title       Genre       Composer    Type        MelodyInst
----------  ----------  ----------  ----------  ----------
Summer      Classic     Vivaldi     Concert     Violin
PPAP        EDM(?)      Pikotaroh   Dance+Musi  Voice

あら,綺麗.注意すべきはPPAPのTypeを見てみると”Dance+Musi”となっているように,文字列が長いと後ろは切られて表示される.

データの値の変更

PPAPの主旋律の楽器の部分が”Voice”になっているが,後々考えると”Vocal”の方がしっくりくるのでに変更してみる.

データの値の変更の方法は,一般的に次のようになる.

update [テーブル名] set [データ名] = [変更後の値] where [条件文];

今のPPAPの例だと,次のようにすればよい.

update Music set MelodyInst = 'Vocal' where MelodyInst = 'Voice';

データの値の変更に当たってのの注意

whereのあとは条件式に注意が必要だ.今はデータが少なかったからよかったけど,where MelodyInst = ‘Voice’って書いたら,MedolyInstにVoiceって書いてあるやつのすべてのMelodyInstがVocalに代わるので注意.一個だけ変えたいときは,条件式をうまく設定すること.

データのカラム(列)の追加

あとになって曲のデータに「自分がどれだけ好きかを,0から5までの値の評価」を加えたいとき,カラムを加える(データを横に一つ伸ばす)必要がある.「列」の英語が”column(カラム)”だから「カラムを加える」という表現をする.

カラムを一つ追加する方法は,次のようにして行う.

alter table [テーブル名] add column [新しいカラムの名前]

例えば,今回の例では次のコマンドを入力すればいい.

alter table Music add Column Rate;

確認する.

sqlite> select * from Music;
Title       Genre       Composer    Type        MelodyInst  Rate
----------  ----------  ----------  ----------  ----------  ----------
Summer      Classic     Vivaldi     Concert     Violin
PPAP        EDM(?)      Pikotaroh   Dance+Musi  Vocal

空の”Rate”という列が追加されいる.

評価を追加する.VivaldiのSummerはかなり好きなので5を付けて,PPAPはよくわからないので0としておく.値を変更したいので,先ほど習ったupdateを利用する.

update Music set Rate = 5 where Title = 'Summer';
update Music set Rate = 0 where Title = 'PPAP';

先ほどまでは,データの値をクォテーションマーク(もしくは,ダブルクォテーションマーク)で挟んでいたが,それはデータが文字だったかである.今回の「音楽の評価」は数字(正確には整数)なので,クォテーションマークで挟む必要はない.数字だけ書けばよい.

確認する.

sqlite> select * from Music;
Title       Genre       Composer    Type        MelodyInst  Rate
----------  ----------  ----------  ----------  ----------  ----------
Summer      Classic     Vivaldi     Concert     Violin      5
PPAP        EDM(?)      Pikotaroh   Dance+Musi  Vocal       0

データのカラム(列)の削除

「やっぱり”Type”っていう項目が要らないなー」となったとき,Typeという行を丸々消したいということがある.

しかし残念なことに,SQLiteにその機能はない.

How to delete or add column in SQLITE? – Stack Overflow

SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.

カラムの削除だけでなく,カラムの名前の変更(上の例では,”Composer”を”sakkyokusha”に変えること)はできないよう.

SQLiteの終了

一通りSQLiteを使ったら,次のようにしてSQLiteを終了させましょう.

.exit

用語について

次のテーブルを例に,押さえておくべき用語をいくつか.

sqlite> select * from Music;
Title       Genre       Composer    Type        MelodyInst  Rate
----------  ----------  ----------  ----------  ----------  ----------
Summer      Classic     Vivaldi     Concert     Violin      5
PPAP        EDM(?)      Pikotaroh   Dance+Musi  Vocal       0

フィールド

列,カラムのことです.例えば,上のテーブルには”Title”,”Genre”,”Composer”,”Type”,”MelodyInst”,”Rate”という6つのフィールドがあります.それぞれのことを「フィールド名」と言います.

レコード

行のことです.上のテーブルは”Summer”に関する行と,”PPAP”に関する行があるので,二つのレコードを持ちます.

主キー

音楽データを増やしていくとジャンル(Genre)や評価(Rate)は異なるレコードで重複する可能性が十分ありますが,曲名に関しては(正しく書いてあげれば)重複することはないでしょう.このようにどのレコードかをはっきりと区別してくれるものを主キーといいます.音楽データの場合ですと「(ちゃんと区別できるように書いた)曲名」が主キーに当たります.

イントロはここまで

今まで紹介した機能だけでは,ただデータベースにデータを付け加えたり変更しただけなので,特にありがたみを感じられません.つまり,SQLの機能は十分に使えていません.

例えば,データベースから必要なデータを取ってきたりする機能は,SQLの最も大事な機能とも言えますが,それについては全く紹介していません.

これ以降については,自分のデータベースのデータの量が多くなってきたら必要になってくるかと思うので,その時にまた書きたいと思います.

このブログについて

IAtLeX です.ブログをはじめてさほど時間がたっていないので,未熟な内容が多々あるかと思いますが,それも時間が解決してくれるはず...Python系の記事を着々と充実させていきたいです.投稿主についてはこちらを参照してください.

このブログについて - http://iatlex.com/about_blog/

コメントを残す

*