SQLite入門 西沢直木著 お勉強ノート

ネタばらしにならない範囲で、感心したことや感想や大事なことを書きとめておく。

1.バージョンに関して
  • SQLite3は2004年6月から。だとすれば、いまだにVer2を使うのはどうかと思う。
  • Ver3のDBFは同じ内容のVer2のDBFの6割程度のサイズになる。この点でもVer3だろ。

2.セキュリティーに関して
  • アクセス制限を.htaccessでかける。(P.10)

3.ファイル、データに関して
  • データベースのファイル名の拡張子は任意。なくても良い。
  • データ型は指定しないで良い。
  • そうすると例えば年齢とか数字を入れてもTEXTとなってソートがおかしくなるが、CAST文により、フィールドを数値と定義できる。(P.17)

4.コマンドラインツールに関して
  • http://www.sqlite.org/download.html の中ほどの Precompiled Binaries For Windows の下の sqlite-shell-win32-x86-3070701.zip(244.12 KiB) をダウンロード
  • 解凍すると、sqlite-shell-win32-x86-3070701フォルダにsqlite3.exeがある。これをcドライブ直下に置く。フォルダ名は長いのでsqliteにする。
  • コマンドラインからcd c:\sqlite\
  • sqlite3 db1.db
  • db1.dbというデータベースへのコマンド受付状態になる。
  • ...>何だよ。...>...>はじめこればっかりだ。文字化け以前の問題。エラーすら出ない。
  • 終わるときは.exitまたは[ctrl]+[c]キー。...>は[ctrl]+[c]キーでしか終われんぞ。暴走か、フリーズか。(後でわかったけど、これ、改行したら表示される。sqlite文は最後;セミコロンで終わるのでそれを書かずにEnterキーを押すとこのマークが出る。セミコロン打てば少なくともエラーは出てくれる。)
  • [F3]キーと↓↑で履歴表示。
  • 文字化けし過ぎ。狂ったように日本語全部文字化け!
  • http://javastring.blog55.fc2.com/blog-entry-51.html
  • プロンプトのショートカット→プロパティでフォントを日本語フォントに変更。MSゴシックあたりで。
  • さらに  C:\>chcp 65001 おーこれで見えたぞ!
  • ところで、ごちゃごちゃやってたらコマンドプロンプトがアメリカ表記になって元にもどらない。そういう時はchcp 932にすれば元に戻る。
  • しかし、毎回chcp 65001 っていうのも何か使いにくい。かといってショートカットを変更するみたいにすると米国表記になったりで…。わからん。わからん。わからん。わからん。
  • http://d.hatena.ne.jp/perlcodesample/20080706/1215291523
  • ショートカットのリンク先を%SystemRoot%\system32\cmd.exe /f:on /k "chcp 65001"にする。つまり /f:on /k "chcp 65001"を加える。
  • 文字化け以前の問題。ど素人だからコマンドラインツールを動かす以前にこれだけ悩む。...>ざっと丸1日。...>コマンドラインですらこれだよ。...>どうせまたPHPで文字化けに悩むに決まってる。...>夜の海を一人乗りのボートで行くようなもんだ。座礁と転覆の連続。本のサンプルを再現するだけでもこれだけの壁がある。あきらめなければいつかはできる。しかし、それは若いときの話。今や時間がいくらでもあるはずもない。あきらめるまえに寿命が来れば実現などできない。アミーゴに4万払えばこんな事をする必要なんてない。ケチったからか?プライドの問題か?妻は4万払えばいいという。それは現実的に正しい選択だ。しかし、俺はアミーゴの世話になったことはよくわかっているが、それゆえにそこから卒業したい。アミーゴ、これまでありがとう。でも、いつまでもあんたの世話になるわけにはいかないんだよ。Thank you and Good bye!

5.コマンド、文に関して
  • 文は;セミコロンで終わる。.コマンドの場合、.ピリオドが前につく。;セミコロンは要らない。

6.データベース作成に関して
  • データベースファイルの拡張子は任意。なくてもいい。僕は.dbにする。(ここから、SQL文などをコピペでコマンドラインツールに入れて検証。@WikiはUTF-8なので丁度いい。しかしその場合、chcp 932で元に戻さないとだめ。)
  • sqlite3 db1.db でdb1.dbデータベースファイルに接続かそれが無ければ作られて接続される。

7.テーブルに関して
  • create table tbl1(id,name,home);で3つのフィールドのテーブルができる。型指定無しだと手軽。テーブル名はアルファベットではじめる。数字からはNG。table等の予約語は""or''で囲めば使えるが使わないのが無難。
  • .schemaコマンドでテーブルを確認できる。
  • create table tbl1(id integer primary key,name,home);のようにidフィールドをinteger primary keyと定義すると自動連番が生成され、データ入力しなくていい。主キーフィールドの定義になる。
  • alter table tbl1 add column age;でageフィールドが追加される。
  • drop table tbl1;でテーブル削除。vacuum;で記録域が開放され、データベースの容量が小さくなる。

8.データの追加、変更、削除に関して
  • insert into tbl1(name,home,age) values('田中一郎','千葉県','30');のようにフィールドを指定して値をセットできる。自動連番フィールドは入れなくてよいから書くこともない。フィールドを指定しないときは、
  • insert into tbl1 values('2','加藤次郎','北海道','20');全部のフィールドを書いて1件分のデータを追加。insert into tbl1 values(null,'加藤次郎','北海道','20');とすれば、自動連番で後ろに1件追加される。
  • insert into tbl1(name,home,age) values('岡田三郎','京都府','25');
  • insert into tbl1(name,home,age) values('山田四郎','埼玉県','28');
  • insert into tbl1(name,home,age) values('野口五郎','東京都','40');
  • insert into tbl1(name,home,age) values('永六輔','山形県','30');
  • 上記ダミーデータを入れてselect * from tbl1;で全件表示。
  • update tbl1 set home='東京都' where id=1;で1番目のデータの出身地が東京。update tbl1 set home='千葉県' where id=1;まあ戻しとこう。update tbl1 set age=age*2;で全員の年齢が倍。update tbl1 set age=age/2;まあ戻しとこう。
  • データを置き換えるreplace文もある。
  • delete from tbl1 where id>6;とすれば7番目以降削除。vacuum;文実行で容量縮小。where句のないdelete文でテーブル全データ削除。

9.データの表示に関して
  • ここまでやってきて、ようやくおぼろげながらSQLがどんなもんかわかってきた。少し友達になれた。とっつきにくいやつだけどね。何でコマンドラインツールなんてやるんだとその意味もわかってなかったが、SQL文を理解するにはこれがいちばん早いでしょう。GUIでSQL文書いてもいいでしょうけどね。表示まで一通りやれば、PHPからの呼び出しに行こう。今日(9/15)はまあまあ進んだ。仕事もある程度忙しかったが忙中閑ありで。進んだり、ぶつかったり、転覆したり、流されたり、また進んだりプログラム言語の勉強にだって物語はあるんだ。
  • select * from tbl1;これまで何度もやったが「*」はワイルドカード。全件表示。
  • select name from tbl1;名前だけ、select home from tbl1;出身地だけ、select name,age from tbl1;名前と年齢、select name as 名前,age as 年齢 from tbl1;as句をつけるとフィールドの別名が表示される。
  • とここまでやってフィールド名なんて全然見たこともないことに気づく。SQLiteの設定をやる必要アリ。.showで設定一覧表示。フィールド名を表示するには.headers onでいけた。
  • select * from tbl1 order by id desc; order by句によるソート。この場合id番号降順。年齢昇順ならselect * from tbl1 order by age asc;名前昇順ならselect * from tbl1 order by name asc; 何だこれ?漢字コード順?カナだったらどうだろう。
  • alter table tbl1 add column kana; でフィールド追加して、
  • update tbl1 set kana='タナカイチロウ' where id=1;あとはidを変えながらカトウジロウ、オカダサブロウ、ヤマダシロウ、ノグチゴロウ、エイロクスケと入力後select * from tbl1 order by kana asc;
id|name|home|age|kana
6|永六輔|山形県|30|エイロクスケ
3|岡田三郎|京都府|25|オカダサブロウ
2|加藤次郎|北海道|20|カトウジロウ
1|田中一郎|千葉県|30|タナカイチロウ
5|野口五郎|東京都|40|ノグチゴロウ
4|山田四郎|埼玉県|28|ヤマダシロウ
  • こんな感じでカナはちゃんと並ぶ。
  • where句でidが4以上のデータに絞込み→select * from tbl1 where id>3;
  • in句でidが1と4のデータに絞込み→select * from tbl1 where id in(1,4);
  • between句でidが2~4のデータを取出す→select * from tbl1 where id between 2 and 4;
  • limit/offset句で2件飛ばして1件取出す→select * from tbl1 limit 1 offset 2;
  • 集約関数でフィールドの平均、件数、合計、最大、最小などいろいろわかる。
  • こりゃ、使えるようになればいいページができるね。
最終更新:2011年09月16日 18:59