SQL分析関数 median 中央値 メディアンフィルターでノイズ除去 [SQLポケリ]
最近の私といえば、某大手デジタコメーカーの管理サイトをAWS上で構築中である。
そのためブログの更新はサボり気味であったので、広告が強制表示されてしまった。なんかSo-netブログのユーザー登録もしないといけないらしいし。
そのせいか、Google検索にも引っかからなくなってしまった感があるので、ここいらで「更新しなくては」という気持ちでこの記事を朝から書いている。ネタ的には、SQLかな。
先日、
センサーから得たデータがなんか変なんだけど、これって何とかならない?
といった相談を受けた。まぁ、デジタコなんてセンサーあってナンボでしょうから。
センサーからの数値って意外にノイズがのってしまうんです。「カメラのしくみ」の「ノイズ」でも触れているようにノイズ除去をするような仕組みがカメラには備わっている。photoshopなんかにもノイズ除去フィルターがあるよね。
カメラのしくみ「ノイズ」
Androidの加速度センサーも例外ではない、そのまま生データを使うと動きがギクシャクするということがあるから、デジタルフィルターをかけてデータを平滑化する、といったことが行われている。
Androidアプリ センサーの値を取得する
Androidの場合は「ローパスフィルター」をかけることが多い。
そういったわけで、質問を受けたときは、軽い感じで
と回答しておいたのではあるが、実際のデータを見たら移動平均とか中央値(メジアンフィルター)の方が良さそうだった。移動平均や中央値ならSQLの分析関数で計算できるじゃない。
SQL分析関数 PERCENTILE_CONT PERCENTILE_DISC 中央値(MEDIAN)
というわけでデータを持ってきてSQLでやってみるのであるが、もう仕事を始めないといけない時間である。また今度やろうと思う。
サイト内を検索
そのためブログの更新はサボり気味であったので、広告が強制表示されてしまった。なんかSo-netブログのユーザー登録もしないといけないらしいし。
そのせいか、Google検索にも引っかからなくなってしまった感があるので、ここいらで「更新しなくては」という気持ちでこの記事を朝から書いている。ネタ的には、SQLかな。
先日、
センサーから得たデータがなんか変なんだけど、これって何とかならない?
といった相談を受けた。まぁ、デジタコなんてセンサーあってナンボでしょうから。
センサーからの数値って意外にノイズがのってしまうんです。「カメラのしくみ」の「ノイズ」でも触れているようにノイズ除去をするような仕組みがカメラには備わっている。photoshopなんかにもノイズ除去フィルターがあるよね。
カメラのしくみ「ノイズ」
Androidの加速度センサーも例外ではない、そのまま生データを使うと動きがギクシャクするということがあるから、デジタルフィルターをかけてデータを平滑化する、といったことが行われている。
Androidアプリ センサーの値を取得する
Androidの場合は「ローパスフィルター」をかけることが多い。
そういったわけで、質問を受けたときは、軽い感じで
センサーからの数値データをローパスフィルターをかけて滑らかにすれば「ノイズ除去できるのでは?」
と回答しておいたのではあるが、実際のデータを見たら移動平均とか中央値(メジアンフィルター)の方が良さそうだった。移動平均や中央値ならSQLの分析関数で計算できるじゃない。
SQL分析関数 PERCENTILE_CONT PERCENTILE_DISC 中央値(MEDIAN)
というわけでデータを持ってきてSQLでやってみるのであるが、もう仕事を始めないといけない時間である。また今度やろうと思う。
関連記事
分析関数percentile_cont 中央値でノイズ除去
SQL分析関数 ROW_NUMBER RANK DENSE_RANK
SQL分析関数 FIRST_VALUE LAST_VALUE NTH_VALUE LAG LEAD
SQL分析関数 PERCENT_RANK パーセンタイル
SQL分析関数 PERCENTILE_CONT PERCENTILE_DISC
SQL分析関数 CUME_DISTとCOUNT OVER SQLポケリ
WITH 再帰クエリ その2
SQLポケリには、分析関数も載ってますよ。よかったらどうぞ。
分析関数percentile_cont 中央値でノイズ除去
SQL分析関数 ROW_NUMBER RANK DENSE_RANK
SQL分析関数 FIRST_VALUE LAST_VALUE NTH_VALUE LAG LEAD
SQL分析関数 PERCENT_RANK パーセンタイル
SQL分析関数 PERCENTILE_CONT PERCENTILE_DISC
SQL分析関数 CUME_DISTとCOUNT OVER SQLポケリ
WITH 再帰クエリ その2
SQLポケリには、分析関数も載ってますよ。よかったらどうぞ。
サイト内を検索
「イラストで理解 SQL はじめて入門」が発売されました [SQLポケリ]
タイトルの通り「イラストで理解 SQL はじめて入門」が発売されました
実は、ペンタブもコードサイニング もこの本のためでした。
もちろんペンタブはイラストを描くのに使用した。使用したソフトはCLIP STUDIOとPhoto Shop。
PhotoShop要らないんじゃない?と思われるかも知れない。でも必要になった、その経緯はこう。
最初は以下のような「すべて手書きのイラスト」をCLIP STUDIOで描いていた。
上のイラストは本文中では使用されていない。CLIP STUDIOの使い方の勉強を兼ねて作成したものである。丸山君は「イラストで理解 SQL はじめて入門」に出てくる女性のキャラクターである。
こんな感じのイラストでどうでしょう?
と編集に見せて聞いたところ
読みずらいので文字のところだけはフォントにしませんか?
とのこと。手書き風フォントなら違和感ないかも、ということで吹き出しのセリフのところなどは手書きをやめて、テキストデータにした。
CLIP STUDIOでもテキストを入れられるので問題なし。だったのではあるが...
CLIP STUDIOでpngファイルに出力すると、テキストデータはラスタ画像に変換されてしまう。十分に解像度を上げれば問題ないのかも知れないが、ファイルサイズがあまりにも大きくなり過ぎる。
それに、編集の方でも調整したいようだったので「イラスト原稿をPSD形式で入稿する」ということになった。
PSD形式はPhotoShopのファイル形式。CLIP STUDIOからはPSDに出力できるので、CLIP STUDIOでイラストを作って、PSD形式で出力 -> テキストデータがラスタライズされてしまうので -> PhotoShopでテキストの部分を修正。という割と面倒な作業になってしまった。
でも、入力したテキストがレイヤの名前になっているので、作業としてはテキスト貼って、レイヤ名のところからコピペでテキストを入力といった感じで、割と何も考えずに機械的にできる。
CLIP STUDIOではテキストの四角を斜めにしたり、変形させたりはできない(ラスタに変換すれば可能ではあるが)。PhotoShopはテキストデータのまま斜めにしたり変形させることができる。
湾曲しているのがわかるだろうか。
ということで、イラストを描くのに結構苦労しました。っていうお話でした。
サイト内を検索
タイトル通りイラスト満載の楽しい本です。内容はSQLの教科書になっております。
みなさんどうぞ宜しくお願いします。
実は、ペンタブもコードサイニング もこの本のためでした。
もちろんペンタブはイラストを描くのに使用した。使用したソフトはCLIP STUDIOとPhoto Shop。
PhotoShop要らないんじゃない?と思われるかも知れない。でも必要になった、その経緯はこう。
最初は以下のような「すべて手書きのイラスト」をCLIP STUDIOで描いていた。
上のイラストは本文中では使用されていない。CLIP STUDIOの使い方の勉強を兼ねて作成したものである。丸山君は「イラストで理解 SQL はじめて入門」に出てくる女性のキャラクターである。
こんな感じのイラストでどうでしょう?
と編集に見せて聞いたところ
読みずらいので文字のところだけはフォントにしませんか?
とのこと。手書き風フォントなら違和感ないかも、ということで吹き出しのセリフのところなどは手書きをやめて、テキストデータにした。
CLIP STUDIOでもテキストを入れられるので問題なし。だったのではあるが...
CLIP STUDIOでpngファイルに出力すると、テキストデータはラスタ画像に変換されてしまう。十分に解像度を上げれば問題ないのかも知れないが、ファイルサイズがあまりにも大きくなり過ぎる。
それに、編集の方でも調整したいようだったので「イラスト原稿をPSD形式で入稿する」ということになった。
PSD形式はPhotoShopのファイル形式。CLIP STUDIOからはPSDに出力できるので、CLIP STUDIOでイラストを作って、PSD形式で出力 -> テキストデータがラスタライズされてしまうので -> PhotoShopでテキストの部分を修正。という割と面倒な作業になってしまった。
でも、入力したテキストがレイヤの名前になっているので、作業としてはテキスト貼って、レイヤ名のところからコピペでテキストを入力といった感じで、割と何も考えずに機械的にできる。
CLIP STUDIOではテキストの四角を斜めにしたり、変形させたりはできない(ラスタに変換すれば可能ではあるが)。PhotoShopはテキストデータのまま斜めにしたり変形させることができる。
湾曲しているのがわかるだろうか。
ということで、イラストを描くのに結構苦労しました。っていうお話でした。
関連記事
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
コードサイニングするために独自ドメインを取った話
コードサイニングをするために公証人役場に行って書類を作った話
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
コードサイニングするために独自ドメインを取った話
コードサイニングをするために公証人役場に行って書類を作った話
サイト内を検索
SQLやC言語でのNULLって何? [SQLポケリ]
本日は、NULLの話題である。SQLやC言語をやっている人にはお馴染みのNULL。JavaやJavaScriptにもnullがあるね。そのヌルのお話である。
WikiによるとNULLの語源はドイツ語であるみたい。詳しくはWikiに行って読んで欲しいのだが、私は何となく英語なんじゃない?って思ってた。ふーん意外。
NULLは値じゃない
Wikiを見てみると、NULLは値じゃないみたいなことが書いてある。NULL値って言うのは変、みたいなことも書いてある。
そうなのか、この際だちょっとよく考えてみよう。
C言語のヌルポインタ
C言語やっているときは、ヌルポインタとかよく言う。ポインタ変数にNULLを代入するとヌルポインタができあがる。ヌルポインタを参照すると即エラーになる。某掲示板で有名になったヌルポである。ヌルポインタを略したのがヌルポだけど、正確にはJavaのNullPointerExceptionを略したものなのでちょっと違うかもだがそう遠くはない。
で、C言語で言うところのヌルポインタはちゃんと値を持っている。
だってNULLはマクロだし。
って書いてあるよ。
だから、以下のコードではポインタ変数がヌルポインタとして初期化される。
普通にやってますよね。
ヌルポインタで初期化する とか
ヌルポインタで戻ってきた とか
ヌルポインタを参照した とか
ヌルポインタでSEGVくらった とか
ヌルポ とか
よく言うと思います。
ここで、C言語におけるヌルって何?と言う疑問を投げてみようと思う。
後でSQLにおけるヌルって何?もやるのでその前振りです。
C言語でヌルっていえば、stdio.hにマクロ定義されている「NULL」がヌルだよね、やっぱり。
C言語ではポインタにしかNULLは代入しない。普通はね。
intの変数に代入できなくもないが、あまり見たことがない。0に初期化したいだけなら普通にint i=0;って書くし。
ヌルポインタにおけるヌルはstdio.hで定義されているマクロのNULL。
ちゃんと値もある、そう0がヌルの正体である。
そう断言しよう...本当か?...それでいいのか...
ヌル文字列
そういえば、C言語には「ヌル文字列」って言うのもあるなぁ。他の言語でも空文字列のことをヌル文字列って言うかも?C言語だけだったか。
まぁ、よしとしよう。この場合のヌルは「空っぽ」であることを意味するものだよね。
確かに、C言語はヌルターミネートの文字列形式なので、文字列データの最後には「ヌル文字」が入っていることがお約束である。ヌル文字は数値としては0の文字。数値0はビットが全部0になるので、2進数でも000000...になる。
何にせよ「C言語のヌル文字は0である」って言うことは間違いない。
ヌルターミネート 文字列の最後に0を入れて終端させる
ヌル文字 コードで書けば'¥0' やっぱり0なんじゃない
と言うことはヌルは0なのか?
C言語においてはだけどね。
さて、ここからはSQLに頭を切り替える。SQLはリレーショナルデータベースを操作するプログラミング言語である。SQLにはポインタは無いが、NULLはある。しかも、ちゃんとした(?)NULLがあるのである。
SQLを使っている人達は、
データがNULL とか
結果がNULLだよ とか
NOT NULL制約 とか
NULLは検索できない? とか
計算結果が表示されないよ? とか
プライマリキーにはNULLは含められない! とか
よく言ってます。というかよく言ってましたし、今はよく書いてます。
SQLやデータベースにおけるNULLっていうのは特別なんです。SQLの生みの親であるE.F.コッドさんが「こだわったところ」なんでしょうね多分。
E.F.コッドさんとは友達ではないし、よくわからないので「多分」って付いていますが、多分合ってます。
SQLでのNULLは0と同じではない。C言語でのヌルポインタはアドレス0を指すようなポインタだし、ヌル文字はコード0の文字だし、マクロのNULLは0で定義されているし...
というわけでC言語においては「ヌルは0だ」と考えてもそう問題にはならない。
ところが、SQLでNULLを0と考えてはいけないのである。その根拠を列挙していきたいと思う。
NULLは計算できない
SQLでは、NULLを計算することができない。NULLが0であればNULL+1の計算結果は1になるはず。実際やってみるとNULL+1の計算結果はNULLになる。
NULLは検索できない
SQLでは、比較演算子を使ってNULLを検索することができない。WHERE column=NULLのようにしてもcolumnがNULLである行を検索することはできない。NULLが0であればなんか検索できそう。
ちなみにそれでは困ることもあるので「IS NULL」を使えば検索できるようになっている。WHERE column IS NULLと書けば検索可能。
C言語の場合はヌルポインタであるかどうかを==演算子で比較することができるし、エラーチェックなんかでやたらにやっているはず。やはり、この点が大きく違う。
NULLはNULLと等しくない
これは「検索できない」と同じかも知れないが、条件式NULL=NULLの結果はUNKNOWNである。NULLが0ならTRUEになりそうなもの。
NULLは小さくも大きくもない
比較演算子で大小関係を調べることができる。しかしNULLと比較しても大小関係はわからない。NULLが0ならとりあえずは比較できそう。
ソートすれば先頭か末尾にNULLが出てくるが、これはデータベース依存。大小関係が決定できないので便宜上しょうがなく先頭か末尾にまとめて出しているだけ。
NULLは集計時に無視される
SUMで合計を集計するときにNULLを0としても結果は変わらない。しかし、AVGで平均を計算する際にNULLを0としたら微妙に結果が違ってくる。
他にもありそうではあるが、ここまでとしよう。
SQLでのNULLは「空っぽ」を意味するもので0ではない。SQLではテーブルのセルや演算を行うときの一時変数に「有効なデータが格納されているかどうかのフラグ」を持っていると考えれば理解しやすいと思う。
SQLにおいてNULLは値ではなく状態を意味するもの。データが格納されていない状態がNULL。なのでやはり「NULL値」っていう表現はSQLの場合は適切ではない。
C言語では変数にそんなフラグを持たせるのは無駄と考えたのであろう。当時はメモリ容量だって少なかったからね。しょうがないのでヌルポインタやヌル文字は0とすることでごまかした。
なので、C言語においては
NULL値を便宜的に0としている
みたいなフレーズがあってもおかしくない気がする。マクロのNULLは0で定義されていて値があるわけだし。
でも「NULL値」ってよく言ってるような気もするなぁ。
本日は以上とする
サイト内を検索
WikiによるとNULLの語源はドイツ語であるみたい。詳しくはWikiに行って読んで欲しいのだが、私は何となく英語なんじゃない?って思ってた。ふーん意外。
NULLは値じゃない
Wikiを見てみると、NULLは値じゃないみたいなことが書いてある。NULL値って言うのは変、みたいなことも書いてある。
そうなのか、この際だちょっとよく考えてみよう。
C言語のヌルポインタ
C言語やっているときは、ヌルポインタとかよく言う。ポインタ変数にNULLを代入するとヌルポインタができあがる。ヌルポインタを参照すると即エラーになる。某掲示板で有名になったヌルポである。ヌルポインタを略したのがヌルポだけど、正確にはJavaのNullPointerExceptionを略したものなのでちょっと違うかもだがそう遠くはない。
で、C言語で言うところのヌルポインタはちゃんと値を持っている。
だってNULLはマクロだし。
#define NULL (0)
って書いてあるよ。
だから、以下のコードではポインタ変数がヌルポインタとして初期化される。
#include <stdio.h> int main() { int *pointer = NULL; return 0; }
普通にやってますよね。
ヌルポインタで初期化する とか
ヌルポインタで戻ってきた とか
ヌルポインタを参照した とか
ヌルポインタでSEGVくらった とか
ヌルポ とか
よく言うと思います。
ここで、C言語におけるヌルって何?と言う疑問を投げてみようと思う。
後でSQLにおけるヌルって何?もやるのでその前振りです。
C言語でヌルっていえば、stdio.hにマクロ定義されている「NULL」がヌルだよね、やっぱり。
C言語ではポインタにしかNULLは代入しない。普通はね。
intの変数に代入できなくもないが、あまり見たことがない。0に初期化したいだけなら普通にint i=0;って書くし。
ヌルポインタにおけるヌルはstdio.hで定義されているマクロのNULL。
ちゃんと値もある、そう0がヌルの正体である。
そう断言しよう...本当か?...それでいいのか...
ヌル文字列
そういえば、C言語には「ヌル文字列」って言うのもあるなぁ。他の言語でも空文字列のことをヌル文字列って言うかも?C言語だけだったか。
まぁ、よしとしよう。この場合のヌルは「空っぽ」であることを意味するものだよね。
確かに、C言語はヌルターミネートの文字列形式なので、文字列データの最後には「ヌル文字」が入っていることがお約束である。ヌル文字は数値としては0の文字。数値0はビットが全部0になるので、2進数でも000000...になる。
何にせよ「C言語のヌル文字は0である」って言うことは間違いない。
ヌルターミネート 文字列の最後に0を入れて終端させる
ヌル文字 コードで書けば'¥0' やっぱり0なんじゃない
と言うことはヌルは0なのか?
C言語においてはだけどね。
C言語 ポインタが理解できない理由 [改訂新版] (プログラミングの教科書)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2011/04/08
- メディア: 単行本(ソフトカバー)
SQLでのヌル
さて、ここからはSQLに頭を切り替える。SQLはリレーショナルデータベースを操作するプログラミング言語である。SQLにはポインタは無いが、NULLはある。しかも、ちゃんとした(?)NULLがあるのである。
SQLを使っている人達は、
データがNULL とか
結果がNULLだよ とか
NOT NULL制約 とか
NULLは検索できない? とか
計算結果が表示されないよ? とか
プライマリキーにはNULLは含められない! とか
よく言ってます。というかよく言ってましたし、今はよく書いてます。
SQLやデータベースにおけるNULLっていうのは特別なんです。SQLの生みの親であるE.F.コッドさんが「こだわったところ」なんでしょうね多分。
E.F.コッドさんとは友達ではないし、よくわからないので「多分」って付いていますが、多分合ってます。
SQLでのNULLは0と同じではない。C言語でのヌルポインタはアドレス0を指すようなポインタだし、ヌル文字はコード0の文字だし、マクロのNULLは0で定義されているし...
というわけでC言語においては「ヌルは0だ」と考えてもそう問題にはならない。
ところが、SQLでNULLを0と考えてはいけないのである。その根拠を列挙していきたいと思う。
NULLは計算できない
SQLでは、NULLを計算することができない。NULLが0であればNULL+1の計算結果は1になるはず。実際やってみるとNULL+1の計算結果はNULLになる。
NULLは検索できない
SQLでは、比較演算子を使ってNULLを検索することができない。WHERE column=NULLのようにしてもcolumnがNULLである行を検索することはできない。NULLが0であればなんか検索できそう。
ちなみにそれでは困ることもあるので「IS NULL」を使えば検索できるようになっている。WHERE column IS NULLと書けば検索可能。
C言語の場合はヌルポインタであるかどうかを==演算子で比較することができるし、エラーチェックなんかでやたらにやっているはず。やはり、この点が大きく違う。
NULLはNULLと等しくない
これは「検索できない」と同じかも知れないが、条件式NULL=NULLの結果はUNKNOWNである。NULLが0ならTRUEになりそうなもの。
NULLは小さくも大きくもない
比較演算子で大小関係を調べることができる。しかしNULLと比較しても大小関係はわからない。NULLが0ならとりあえずは比較できそう。
ソートすれば先頭か末尾にNULLが出てくるが、これはデータベース依存。大小関係が決定できないので便宜上しょうがなく先頭か末尾にまとめて出しているだけ。
NULLは集計時に無視される
SUMで合計を集計するときにNULLを0としても結果は変わらない。しかし、AVGで平均を計算する際にNULLを0としたら微妙に結果が違ってくる。
他にもありそうではあるが、ここまでとしよう。
SQLでのNULLは「空っぽ」を意味するもので0ではない。SQLではテーブルのセルや演算を行うときの一時変数に「有効なデータが格納されているかどうかのフラグ」を持っていると考えれば理解しやすいと思う。
SQLにおいてNULLは値ではなく状態を意味するもの。データが格納されていない状態がNULL。なのでやはり「NULL値」っていう表現はSQLの場合は適切ではない。
C言語では変数にそんなフラグを持たせるのは無駄と考えたのであろう。当時はメモリ容量だって少なかったからね。しょうがないのでヌルポインタやヌル文字は0とすることでごまかした。
なので、C言語においては
NULL値を便宜的に0としている
みたいなフレーズがあってもおかしくない気がする。マクロのNULLは0で定義されていて値があるわけだし。
でも「NULL値」ってよく言ってるような気もするなぁ。
本日は以上とする
関連記事
SQLポケットリファレンスが第4版になりました
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus) が発売されます
SQLポケットリファレンスが第4版になりました
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus) が発売されます
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
サイト内を検索
SQLポケットリファレンス 台湾版「最新SQL語法範例辭典」 [SQLポケリ]
So-netブログのリンクを付け替えまくった。
けっこうな数の記事があるので、ちょっと疲れた。
そんな中リンク切れを発見。
「SQL語法範例」
http://www.books.com.tw/exep/prod/booksfile.php?item=0010356474
台湾版のSQLポケットリファレンスの本屋さんへのリンクであったのだが、どうもなくなってしまったらしい。
そういえば、台湾版も改訂するみたいなことを聞いたぞ。
SQL語法範例で検索してみると
あった。
「最新SQL語法範例字典」
http://www.books.com.tw/products/0010772670
"最新"になってる。
台湾のみなさん、新しくなった「最新SQL語法範例辭典」をどうぞよろしく。
日本の方は、「SQLポケットリファレンス」をよろしく。
サイト内を検索
けっこうな数の記事があるので、ちょっと疲れた。
そんな中リンク切れを発見。
「SQL語法範例」
http://www.books.com.tw/exep/prod/booksfile.php?item=0010356474
台湾版のSQLポケットリファレンスの本屋さんへのリンクであったのだが、どうもなくなってしまったらしい。
そういえば、台湾版も改訂するみたいなことを聞いたぞ。
SQL語法範例で検索してみると
あった。
「最新SQL語法範例字典」
http://www.books.com.tw/products/0010772670
"最新"になってる。
台湾のみなさん、新しくなった「最新SQL語法範例辭典」をどうぞよろしく。
日本の方は、「SQLポケットリファレンス」をよろしく。
関連記事
SQLポケットリファレンス 台湾版「SQL語法範例辭典」
onclick事件
SQLポケットリファレンスが第4版になりました
SQLポケットリファレンス 台湾版「SQL語法範例辭典」
onclick事件
SQLポケットリファレンスが第4版になりました
サイト内を検索
「SQLite ODBC」 Excel AccessからSQLiteデータベースを使用する SQLポケリ [SQLポケリ]
本日のネタは、SQLite ODBCである。
ExcelからSQLiteを使う場合の手段としてSQLite for Excelは試してみたのだが、本日はSQLite ODBCをやってみたいと思う。
ODBCドライバなら汎用性が高い。ExcelだけでなくAccessやその他のソフトウェアと連携することができる。
まずは、以下のサイトからsqliteodbc.exeをダウンロードしてくる。
ちょっと怪しげな海外のサイトではある。まぁ大丈夫でしょう。カスペルスキー入ってるし。
で、もってきたsqliteodbc.exeを実行する。
こんな感じであっという間にインストールは終了
Oracleだとかはこうはいかない。いいねぇ軽量データベースは。
ODBCって本当は、Open Database Connectivity (コネクティビティの綴りあってる?)なのでサーバに接続するための仲介用ソフトウェアしか用意されていないはず、なんだけどSQLite ODBCの場合はSQLiteエンジンも含まれているので、ODBCだけでデータベースが使えるようになる。
Oracleに接続する用のODBCドライバを入れても、Oracleデータベースがなければ「話にならない」のとは別でSQLite ODBCドライバを入れたら、「それだけでデータベースが使える」ようになるわけである。これはお手軽。
Program Files (x86)\SQLite ODBCにインストールされているらしいので、そのフォルダを覗いてみると、sqlite3.exeを発見。PATH環境変数を切ってやる。
コマンドプロンプトからsqlite3コマンドを実行してみる
おっ ちゃんと動くじゃない。
ODBCの設定をして、データベースを作ってみる。
ODBCのDSN「SQLite ODBC」が作成できた。
これでExcelからでもAccessからでもSQLiteデータベースが使えるはず。
データベースファイルのパスは、「C:\Users\asai\testsqlite.db」とした。
まずは、からっぽなのでsqlite3コマンドでテーブルだけ作ってやる。
次に、MS Accessでテーブルをリンク(アタッチ)する。
[外部データ]タブ -> [新しいデータソース] -> [他のソースから] -> [ODBCデータソース]をクリックしていく。
インポートじゃなくて、テーブルにリンクするの方を選択。
コンピュータデータソースでさっき作ったSQLite ODBCを選択。
テーブルの一覧が表示された。
fooしかテーブル作ってないからOK。
fooを選択して、OKボタンを押す。
プライマリキーの選択になったが、とりあえずのテストなので無選択でOK。
テーブルfooがリンクできた。
開いてみたが編集できず。リンクテーブルってそういうものなんだっけ?
プライマリキーを設定していないからか?しまった。
もう一回リンクテーブルを作って、プライマリキーをa列にしてみた。
入力できるようになった。
ちゃんと入ってる!
MS Accessの記事についてはこちらを参照されたし
サイト内を検索
ExcelからSQLiteを使う場合の手段としてSQLite for Excelは試してみたのだが、本日はSQLite ODBCをやってみたいと思う。
ODBCドライバなら汎用性が高い。ExcelだけでなくAccessやその他のソフトウェアと連携することができる。
まずは、以下のサイトからsqliteodbc.exeをダウンロードしてくる。
ちょっと怪しげな海外のサイトではある。まぁ大丈夫でしょう。カスペルスキー入ってるし。
で、もってきたsqliteodbc.exeを実行する。
こんな感じであっという間にインストールは終了
Oracleだとかはこうはいかない。いいねぇ軽量データベースは。
ODBCって本当は、Open Database Connectivity (コネクティビティの綴りあってる?)なのでサーバに接続するための仲介用ソフトウェアしか用意されていないはず、なんだけどSQLite ODBCの場合はSQLiteエンジンも含まれているので、ODBCだけでデータベースが使えるようになる。
Oracleに接続する用のODBCドライバを入れても、Oracleデータベースがなければ「話にならない」のとは別でSQLite ODBCドライバを入れたら、「それだけでデータベースが使える」ようになるわけである。これはお手軽。
Program Files (x86)\SQLite ODBCにインストールされているらしいので、そのフォルダを覗いてみると、sqlite3.exeを発見。PATH環境変数を切ってやる。
コマンドプロンプトからsqlite3コマンドを実行してみる
C:\Users\asai>sqlite3 testsqlite.db SQLite version 3.22.0 2018-01-22 18:45:57 Enter ".help" for usage hints. sqlite>
おっ ちゃんと動くじゃない。
ODBCの設定をして、データベースを作ってみる。
ODBCのDSN「SQLite ODBC」が作成できた。
これでExcelからでもAccessからでもSQLiteデータベースが使えるはず。
データベースファイルのパスは、「C:\Users\asai\testsqlite.db」とした。
まずは、からっぽなのでsqlite3コマンドでテーブルだけ作ってやる。
C:\Users\asai>sqlite3 testsqlite.db SQLite version 3.22.0 2018-01-22 18:45:57 Enter ".help" for usage hints. sqlite> create table foo (a integer, b text); sqlite> .quit
次に、MS Accessでテーブルをリンク(アタッチ)する。
[外部データ]タブ -> [新しいデータソース] -> [他のソースから] -> [ODBCデータソース]をクリックしていく。
インポートじゃなくて、テーブルにリンクするの方を選択。
コンピュータデータソースでさっき作ったSQLite ODBCを選択。
テーブルの一覧が表示された。
fooしかテーブル作ってないからOK。
fooを選択して、OKボタンを押す。
プライマリキーの選択になったが、とりあえずのテストなので無選択でOK。
テーブルfooがリンクできた。
開いてみたが編集できず。リンクテーブルってそういうものなんだっけ?
プライマリキーを設定していないからか?しまった。
もう一回リンクテーブルを作って、プライマリキーをa列にしてみた。
入力できるようになった。
えっプライマリキーの付け方がわからないって?そんなあなたには「SQLポケットリファレンス」ですよ。
C:\Users\asai>sqlite3 testsqlite.db SQLite version 3.22.0 2018-01-22 18:45:57 Enter ".help" for usage hints. sqlite> select * from foo; 1|いち 2|二 3|さん sqlite>
ちゃんと入ってる!
MS Accessの記事についてはこちらを参照されたし
「改訂第4版SQLポケットリファレンス」は、SQLiteにも対応しています。
関連記事
「SQLite for Excel」 Excel VBAからSQLiteデータベースを使用する
SQLiteでのデータ型
Androidアプリ開発 SQLiteデータベースを使用する
SQLポケットリファレンス 台湾版SQLポケットリファレンス 台湾版の紹介
SQLポケリが第4版になりました
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
関連記事
「SQLite for Excel」 Excel VBAからSQLiteデータベースを使用する
SQLiteでのデータ型
Androidアプリ開発 SQLiteデータベースを使用する
SQLポケットリファレンス 台湾版SQLポケットリファレンス 台湾版の紹介
SQLポケリが第4版になりました
サイト内を検索
ラズパイ pythonでSQLite3 トランザクション [SQLポケリ]
前回、ラズパイにSQLite3を導入してみた。
ラズパイにSQLiteをインストール
SQL命令「SELECT * FROM foo」の実行には成功した。
今回は、テーブルにINSERTで行を作成してみたいと思う。
withの使用
その前に、pythonのwith命令を使って、closeを行わないように改造する。
前回、紹介したpythonスクリプトは以下のようなものであった。
connect()して作成したconオブジェクトは使用後、close()を呼び出して接続を解放する必要があるが、with命令を使うとclose()を自動的に呼び出してくれるので便利なわけである。
withを使って書き直したものが以下である。
トランザクションの分離レベル
次に、オートコミットを止める設定にする。オートコミットとなっているとSQLite側で自動的にトランザクション制御が行われる。色々実験したいので、オートコミットは切ってしまう。
connect()の第二引数で、isolation_levelをNoneに指定するとオートコミットを切ることができる。
ここまでの時点では、SELECT命令しか実行していないので、オートコミットを切っても影響なし。
上記のスクリプトをコピーして、INSERTを行うスクリプトを2種類作成する。
最初は、トランザクション内で1件ごとに行をINSERTするスクリプトを作成する。
これだと結構時間がかかる。timeコマンドで時間を計測して見た。
1000行INSERTするのに、37秒もかかっている。
ちょっとかかり過ぎ。
トランザクションのかけ方を以下のように変更する。
pythonだとインデントでループの範囲が変わってくるのでちょっと注意。
forループの前でトランザクションをかけて、ループ終了後にCOMMITする。
かなり速くなった。
SQLiteで大量のINSERTを行う場合は、トランザクションでまとめるべし。
関連記事
ラズパイにボタンを付けてシャットダウンさせる
ラズパイにSQLiteをインストール
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
サイト内を検索
ラズパイにSQLiteをインストール
SQL命令「SELECT * FROM foo」の実行には成功した。
今回は、テーブルにINSERTで行を作成してみたいと思う。
withの使用
その前に、pythonのwith命令を使って、closeを行わないように改造する。
前回、紹介したpythonスクリプトは以下のようなものであった。
import sqlite3 con = sqlite3.connect('/home/pi/test.db') cur = con.cursor() cur.execute('SELECT * FROM foo') for row in cur: print(row[0], row[1]) con.close()
connect()して作成したconオブジェクトは使用後、close()を呼び出して接続を解放する必要があるが、with命令を使うとclose()を自動的に呼び出してくれるので便利なわけである。
withを使って書き直したものが以下である。
import sqlite3 with sqlite3.connect('/home/pi/test.db') as con: cur = con.cursor() cur.execute('SELECT * FROM foo') for row in cur: print(row[0], row[1])
トランザクションの分離レベル
次に、オートコミットを止める設定にする。オートコミットとなっているとSQLite側で自動的にトランザクション制御が行われる。色々実験したいので、オートコミットは切ってしまう。
connect()の第二引数で、isolation_levelをNoneに指定するとオートコミットを切ることができる。
import sqlite3 with sqlite3.connect('/home/pi/test.db',isolation_level=None) as con: cur = con.cursor() cur.execute('SELECT * FROM foo') for row in cur: print(row[0], row[1])
ここまでの時点では、SELECT命令しか実行していないので、オートコミットを切っても影響なし。
上記のスクリプトをコピーして、INSERTを行うスクリプトを2種類作成する。
最初は、トランザクション内で1件ごとに行をINSERTするスクリプトを作成する。
import sqlite3 import random with sqlite3.connect('/home/pi/test.db',isolation_level=None) as con: for i in range(0,1000): param = (int(random.random()*1000000), i) con.execute('BEGIN') con.execute('INSERT INTO foo VALUES(?,?)', param) con.execute('COMMIT')
これだと結構時間がかかる。timeコマンドで時間を計測して見た。
pi@raspberrypi:~ $ time ./testsqlite3.py real 0m37.104s user 0m0.518s sys 0m1.003s
1000行INSERTするのに、37秒もかかっている。
ちょっとかかり過ぎ。
トランザクションのかけ方を以下のように変更する。
import sqlite3 import random with sqlite3.connect('/home/pi/test.db',isolation_level=None) as con: con.execute('BEGIN') for i in range(0,1000): param = (int(random.random()*1000000), i) con.execute('INSERT INTO foo VALUES(?,?)', param) con.execute('COMMIT')
pythonだとインデントでループの範囲が変わってくるのでちょっと注意。
forループの前でトランザクションをかけて、ループ終了後にCOMMITする。
pi@raspberrypi:~ $ time ./testsqlite3-2.py real 0m0.225s user 0m0.169s sys 0m0.019s
かなり速くなった。
SQLiteで大量のINSERTを行う場合は、トランザクションでまとめるべし。
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
関連記事
ラズパイにボタンを付けてシャットダウンさせる
ラズパイにSQLiteをインストール
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
サイト内を検索
ラズパイにSQLiteをインストール pythonからアクセスしてみた [SQLポケリ]
買ったは良いが、色々忙しくて、ほったらかしの「ラズパイ」である。
本日は、ラズパイにSQLiteを導入してみようという話題である。
普通に、raspbianをインストールしただけなら、SQLiteは入っていない。
まずは、パッケージとしてSQLiteが存在しているかどうかを検索してみる。
yumならyum searchとしてリポジトリにあるかを検索できるのだが、apt-getにはsearchコマンドがないので、apt-cacheで検索することになる。
apt-getにあまり慣れていないので、apt-get search sqlite3とかやってエラーになり、apt-getでのパッケージの検索ってどうやってやるんだっけ?と毎回調べているような気がする。
検索するときは、apt-cacheでやる。
sqlite3で検索しているので、なんか沢山出てきた。
これだけ入れとけばOKか。
apt-getでインストールしてみる(sudo suでroot権限取ってからやってます)。
無事にインストールできた。
manのインデックスを作るのに時間がかかる感じ。数分でインストールが終了した。
sqlite3コマンドで動作確認してみる。
よし、動いている(rootでやることなかったかも)。
ラズパイといえば、Pythonだよな。ということで、pythonからsqlite3を使ってみる。
でsqlite3モジュールをインポートして、
で接続を作って、
で、カーソルを作って、
で、カーソルのexecuteメソッドでSQL命令を実行できるらしい。
カーソルから実行結果を得るには、以下のように
for文を回せばOKらしい。
最後に、con.close()で接続を切っておしまい。
以下は、作成したpythonスクリプトである。
しかし、ここに大きな落とし穴が。
完成したので、実行すると、エラーが。
sqlite3やconnectの綴間違えてないよなぁ。
sqlite3は標準モジュールに入っているから別途インストールする必要なしって書いてあるし。
「AttributeError: 'module' object has no attribute 'connect'」
で検索してみたら、謎が解けた。
スクリプトのファイル名がまずかったようである。
sqlite3.py -> testsqlite3.py
sqlite3モジュールをインポートして使いたい場合は、ファイル名にsqlite3は使っちゃダメ、ということらしい。
実行したら、ちゃんとSELECT命令が実行できた。
関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
第4版には電子版もあります。
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
サイト内を検索
本日は、ラズパイにSQLiteを導入してみようという話題である。
普通に、raspbianをインストールしただけなら、SQLiteは入っていない。
まずは、パッケージとしてSQLiteが存在しているかどうかを検索してみる。
yumならyum searchとしてリポジトリにあるかを検索できるのだが、apt-getにはsearchコマンドがないので、apt-cacheで検索することになる。
apt-getにあまり慣れていないので、apt-get search sqlite3とかやってエラーになり、apt-getでのパッケージの検索ってどうやってやるんだっけ?と毎回調べているような気がする。
検索するときは、apt-cacheでやる。
root@raspberrypi:/home/pi# apt-cache search sqlite3 akonadi-backend-sqlite - SQLite storage backend for Akonadi aolserver4-nssqlite3 - AOLserver 4 module: module for accessing SQLite 3 databases bacula-common-sqlite3 - network backup service - SQLite v3 common files 以下略
sqlite3で検索しているので、なんか沢山出てきた。
sqlite3 - Command line interface for SQLite 3
これだけ入れとけばOKか。
apt-getでインストールしてみる(sudo suでroot権限取ってからやってます)。
root@raspberrypi:/home/pi# apt-get install sqlite3 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: libsqlite3-0 提案パッケージ: sqlite3-doc 以下のパッケージが新たにインストールされます: sqlite3 以下のパッケージはアップグレードされます: libsqlite3-0 アップグレード: 1 個、新規インストール: 1 個、削除: 0 個、保留: 134 個。 1,203 kB のアーカイブを取得する必要があります。 この操作後に追加で 1,991 kB のディスク容量が消費されます。 続行しますか? [Y/n] y 取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf libsqlite3-0 armhf 3.16.2-5+deb9u1 [493 kB] 取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian stretch/main armhf sqlite3 armhf 3.16.2-5+deb9u1 [709 kB] 1,203 kB を 2秒 で取得しました (486 kB/s) changelog を読んでいます... 完了 (データベースを読み込んでいます ... 現在 129121 個のファイルとディレクトリがインストールされています。) .../libsqlite3-0_3.16.2-5+deb9u1_armhf.deb を展開する準備をしています ... libsqlite3-0:armhf (3.16.2-5+deb9u1) で (3.16.2-5 に) 上書き展開しています ... libsqlite3-0:armhf (3.16.2-5+deb9u1) を設定しています ... 以前に未選択のパッケージ sqlite3 を選択しています。 (データベースを読み込んでいます ... 現在 129121 個のファイルとディレクトリがインストールされています。) .../sqlite3_3.16.2-5+deb9u1_armhf.deb を展開する準備をしています ... sqlite3 (3.16.2-5+deb9u1) を展開しています... sqlite3 (3.16.2-5+deb9u1) を設定しています ... libc-bin (2.24-11+deb9u1) のトリガを処理しています ... man-db (2.7.6.1-2) のトリガを処理しています ...
無事にインストールできた。
manのインデックスを作るのに時間がかかる感じ。数分でインストールが終了した。
sqlite3コマンドで動作確認してみる。
root@raspberrypi:/home/pi# sqlite3 test.db SQLite version 3.16.2 2017-01-06 16:32:41 Enter ".help" for usage hints. sqlite> create table foo (a integer,b text); sqlite> insert into foo values(1,'test'); sqlite> select * from foo; 1|test sqlite>
よし、動いている(rootでやることなかったかも)。
ラズパイといえば、Pythonだよな。ということで、pythonからsqlite3を使ってみる。
import sqlite3
でsqlite3モジュールをインポートして、
con = sqlite3.connect('/home/pi/test.db')
で接続を作って、
cur = con.cursor()
で、カーソルを作って、
cur.execute('SELECT * FROM foo')
で、カーソルのexecuteメソッドでSQL命令を実行できるらしい。
カーソルから実行結果を得るには、以下のように
for row in cur: print(row[0], row[1])
for文を回せばOKらしい。
最後に、con.close()で接続を切っておしまい。
以下は、作成したpythonスクリプトである。
import sqlite3 con = sqlite3.connect('/home/pi/test.db') cur = con.cursor() cur.execute('SELECT * FROM foo') for row in cur: print(row[0], row[1]) con.close()
しかし、ここに大きな落とし穴が。
完成したので、実行すると、エラーが。
pi@raspberrypi:~ $ python sqlite3.py Traceback (most recent call last): File "sqlite3.py", line 1, inimport sqlite3 File "/home/pi/sqlite3.py", line 3, in con = sqlite3.connect('/home/pi/test.db') AttributeError: 'module' object has no attribute 'connect'
sqlite3やconnectの綴間違えてないよなぁ。
sqlite3は標準モジュールに入っているから別途インストールする必要なしって書いてあるし。
「AttributeError: 'module' object has no attribute 'connect'」
で検索してみたら、謎が解けた。
スクリプトのファイル名がまずかったようである。
sqlite3.py -> testsqlite3.py
sqlite3モジュールをインポートして使いたい場合は、ファイル名にsqlite3は使っちゃダメ、ということらしい。
実行したら、ちゃんとSELECT命令が実行できた。
pi@raspberrypi:~ $ python testsqlite3.py (1, u'test')
Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab
- 出版社/メーカー: TechShare
- メディア: エレクトロニクス
関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
第4版には電子版もあります。
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
サイト内を検索
SQLiteでのデータ型 [SQLポケリ]
本日は、SQLiteネタである。
SQLiteには、データ型があってないようなものとなっている。
普通のデータベースシステムには、データ型が存在する。
OracleやSQL Serverには、CHARやVARCHAR、NUMBERやINTEGER、DATEやらDATETIMEなんていう型が存在している。MS Accessにだってある。
CHARとVARCHARは「文字列型」
NUMBER、INTEGERは「整数型」
DATE、DATETIMEは「日付時刻型」
データ型は「列(フィールド)」に対して設定できる。数値型に設定された列には、数値が記録できる。文字列は記録できない。文字列を記録しようと思ったら、文字列型に設定しなければならない。
データ型には許容できる数値の大きさが付き物となっている。
データベースが大容量のストレージを持っていたとしても、無制限にデータを記録できるものではないし、記憶領域の大きさを決めた方が、効率的である。
例えば、以下のようなテーブルをOracleに作成したとする。
fooテーブルの、text列には、最大で10バイトの文字列データを記録できる。
num列は、NUMBER型なので、数値を記録可能ではあるが、(8)となっているので、最大8桁の整数値を記録可能となっている。
text列に、数字から構成される文字列を記録することはできる。例えば、以下のようなINSERT命令はOKである。
num列に対して、文字列を記録するような命令は、エラーとなり実行できない。
これと同じことをSQLiteでやってみると
どちらのINSERT命令も成功する。
こんな感じでちゃんと記録できる。
便利なんだか、ルーズなんだか。
ちなみに、CREATE TABLEでの列定義でデータ型を省略できる。
サイト内を検索
SQLiteには、データ型があってないようなものとなっている。
普通のデータベースシステムには、データ型が存在する。
OracleやSQL Serverには、CHARやVARCHAR、NUMBERやINTEGER、DATEやらDATETIMEなんていう型が存在している。MS Accessにだってある。
CHARとVARCHARは「文字列型」
NUMBER、INTEGERは「整数型」
DATE、DATETIMEは「日付時刻型」
データ型は「列(フィールド)」に対して設定できる。数値型に設定された列には、数値が記録できる。文字列は記録できない。文字列を記録しようと思ったら、文字列型に設定しなければならない。
データ型には許容できる数値の大きさが付き物となっている。
データベースが大容量のストレージを持っていたとしても、無制限にデータを記録できるものではないし、記憶領域の大きさを決めた方が、効率的である。
例えば、以下のようなテーブルをOracleに作成したとする。
CREATE TABLE foo ( text VARCHAR2(10), num NUMBER(8) );
fooテーブルの、text列には、最大で10バイトの文字列データを記録できる。
num列は、NUMBER型なので、数値を記録可能ではあるが、(8)となっているので、最大8桁の整数値を記録可能となっている。
text列に、数字から構成される文字列を記録することはできる。例えば、以下のようなINSERT命令はOKである。
INSERT INTO foo(text) VALUES('123');
num列に対して、文字列を記録するような命令は、エラーとなり実行できない。
INSERT INTO foo(num) VALUES('text');
これと同じことをSQLiteでやってみると
CREATE TABLE foo ( text TEXT, num NUMERIC ); INSERT INTO foo(text) VALUES('123'); INSERT INTO foo(num) VALUES('text');
どちらのINSERT命令も成功する。
SELECT * FROM foo text num ----------------------- 123 text
こんな感じでちゃんと記録できる。
便利なんだか、ルーズなんだか。
ちなみに、CREATE TABLEでの列定義でデータ型を省略できる。
CREATE TABLE foo ( text, num );
SQLポケリにはデータ型についても載ってますよ。
関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
「SQLite for Excel」 Excel VBAからSQLiteデータベースを使用する
関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
「SQLite for Excel」 Excel VBAからSQLiteデータベースを使用する
サイト内を検索
「プログラミング言語図鑑」を買ってみた結構面白かった [SQLポケリ]
本日は、仕事の関係上池袋に行ってきた。
ちょっと時間があったので、本屋さんに行ってみた。
まぁ、目的は、自分の書いた本が、どういう扱いになっているかを調べに行くのが日課...じゃなくて、どう言ったプログラミング本が人気なのかな、という市場調査なわけではあるが...
そんな中、面白そうな本を発見したので、購入してきた。
プログラミング言語図鑑
この本は、プログラミング言語に「どう言ったものがあるのか」を紹介したもの、ABC順なので、アセンブラから始まって、BASIC、CとかDとか、F#とかCOBOL、FORTRAN、Java、PHP、Perl、Ruby、PL/I、SQL、Visual Basicと懐かしの、いやいやまだ使っているから、といった言語がズラリと並んでいる本である。図鑑と言っても、分厚い辞典のようなものではない。
今流行りのPythonも載ってるし。
中には、AWKとかsedっていう、それって言語?的なものもある。Bashなら立派な言語かも知れない。AWKも構文があるから、言語って言ってもいいか。sedはなんか微妙?
Luaとかマイナーな言語もあるし。
PostScriptって、まぁ言語って言えば言語かも。
最近出たやつは知らないものもあるなぁ...
でも見ていて面白い。40〜50代のシステム関係の方なら、多分半分は「あっ知ってる」っていう言語が半分はあると思う。そういう言語は「そうそう、そうだった」とニヤリとすることができるし。知らない言語は、「はぁ、そうなのか、そう言った言語もあるのか」ということでそれはそれで、面白い。
さて、私的には、「SQL」のページが気になったりして、見てみた。
各言語で、ハノイの塔を解くプログラムが掲載されているのだが、SQLのページを見て思わず「笑ってしまった」
他の言語では、関数的なものがあり、インデントされていたりしてプログラムっぽいが、SQLの所は、CREATE TABLEやらINSERT INTO、SELECTが並んでいるし...意味わからん。インデントもあるがなんかとっても異質。
他にも、Scratchやらアセンブラなんかは異質だけれども、SQLはなんか「頑張ってプログラム作ってみた」な感じがあってなんか素敵。
でも、WITH RECURSIVEを使っているので、ちょっと反則気味?ハノイの塔って基本、再起処理しないと綺麗に書けないので「しょうがないかも」だけど。
WITH RECURSIVEの記事
まぁ、気になった方は読んでみて下さい。
人の書籍を宣伝してどうするの、っていうことは置いておくことにするが、「プログラミング言語図鑑」を見てSQLが気になった方はSQLポケットリファレンスを読んで欲しい。お、宣伝になったか。
関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
SQL WITH句 再帰クエリー SQLポケリ
サイト内を検索
ちょっと時間があったので、本屋さんに行ってみた。
まぁ、目的は、自分の書いた本が、どういう扱いになっているかを調べに行くのが日課...じゃなくて、どう言ったプログラミング本が人気なのかな、という市場調査なわけではあるが...
そんな中、面白そうな本を発見したので、購入してきた。
プログラミング言語図鑑
この本は、プログラミング言語に「どう言ったものがあるのか」を紹介したもの、ABC順なので、アセンブラから始まって、BASIC、CとかDとか、F#とかCOBOL、FORTRAN、Java、PHP、Perl、Ruby、PL/I、SQL、Visual Basicと懐かしの、いやいやまだ使っているから、といった言語がズラリと並んでいる本である。図鑑と言っても、分厚い辞典のようなものではない。
今流行りのPythonも載ってるし。
中には、AWKとかsedっていう、それって言語?的なものもある。Bashなら立派な言語かも知れない。AWKも構文があるから、言語って言ってもいいか。sedはなんか微妙?
Luaとかマイナーな言語もあるし。
PostScriptって、まぁ言語って言えば言語かも。
最近出たやつは知らないものもあるなぁ...
でも見ていて面白い。40〜50代のシステム関係の方なら、多分半分は「あっ知ってる」っていう言語が半分はあると思う。そういう言語は「そうそう、そうだった」とニヤリとすることができるし。知らない言語は、「はぁ、そうなのか、そう言った言語もあるのか」ということでそれはそれで、面白い。
さて、私的には、「SQL」のページが気になったりして、見てみた。
各言語で、ハノイの塔を解くプログラムが掲載されているのだが、SQLのページを見て思わず「笑ってしまった」
他の言語では、関数的なものがあり、インデントされていたりしてプログラムっぽいが、SQLの所は、CREATE TABLEやらINSERT INTO、SELECTが並んでいるし...意味わからん。インデントもあるがなんかとっても異質。
他にも、Scratchやらアセンブラなんかは異質だけれども、SQLはなんか「頑張ってプログラム作ってみた」な感じがあってなんか素敵。
でも、WITH RECURSIVEを使っているので、ちょっと反則気味?ハノイの塔って基本、再起処理しないと綺麗に書けないので「しょうがないかも」だけど。
WITH RECURSIVEの記事
まぁ、気になった方は読んでみて下さい。
人の書籍を宣伝してどうするの、っていうことは置いておくことにするが、「プログラミング言語図鑑」を見てSQLが気になった方はSQLポケットリファレンスを読んで欲しい。お、宣伝になったか。
関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
SQL WITH句 再帰クエリー SQLポケリ
サイト内を検索
うんこ漢字ドリルにならってSQLポケリの例文をうんこにする? [SQLポケリ]
うんこ漢字ドリルって
世の中には変なものがあるというか、その名もうんこ漢字ドリルである。
漢字ドリルって昔やったなぁ...
小学生のじぶんか。
でも、「うんこ」って何よ。と思ったら、例文が「皆うんこがらみ」っていうことらしい。
何だそれ。
まぁねぇ、小学生はうんこ好きだよね。
でも、男子ならともかく、女子的にはどうなの。女子もうんこ好きなのか?
この「うんこ漢字ドリル」売れているらしい。
ちょっと内容を見てみると、本当に例文に皆「うんこ」が含まれている。
これって、原稿書いてる人はしんどいだろうなぁ...編集する人もだけど...
手分けしてやるにしても、毎日うんこまみれなわけでしょ?
古屋雄作という人が例文を考えているのか、なんかお笑いDVDの作家さんなのか。なら大丈夫?
でもないと思うが...
本当に、例文がうんこまみれなのか、ちょっと見てみた(amazonでちょっと見れる)。
確かに、例文はうんこばかり。
紹介記事から抜粋すると
・田んぼのどまん中でうんこをひろった
・田うえをしながらうんこをもらすおじいさん
・水田にうんこをなげ入れる
田の字を学習する際の例文らしい。
もう、アホかと。無理矢理うんこ入れないといけないから、とんでもない例文になってしまっている。しかし、なんか笑える。
田んぼでうんこを拾う必要なないでしょ。
どういうシチュエーションなんだろう。
田植えをしながらうんこを漏らすって、ありえそうだけど...
水田に”なぜ”うんこを投げ入れる。投げ入れるには手で持たないといけないが...
こういうのが「シュールな笑い」っていうのか?
SQLポケリの例文も思い切って「うんこ」にしてみようかしら...
うんこテーブルから、大きさと色を集計して行数を計算。
とか...
トイレテーブルの便器フィールドが'うんこ'である行を選択。
流し忘れかよ。
うんこドリルの場合、あくまでうんこで統一されているみたい。「うんち」とか「クソ」とかは出てこない。あくまでうんこ。
それだと例文作るの大変だよね。
論理的な例文にはできないかも。「うんこ」も「うんち」も検索したい、みたいにバリエーションを許さないとちゃんとした例文は作れなさそう。シュールな例文作ってもねぇ...
となんか、真面目に考えたりしてみたが、うんこ例文は無理だなぁ。
小学生は、SQLを学習しないしね。
関連記事
SQLポケットリファレンスが第4版になりました
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
サイト内を検索
世の中には変なものがあるというか、その名もうんこ漢字ドリルである。
漢字ドリルって昔やったなぁ...
小学生のじぶんか。
でも、「うんこ」って何よ。と思ったら、例文が「皆うんこがらみ」っていうことらしい。
何だそれ。
まぁねぇ、小学生はうんこ好きだよね。
でも、男子ならともかく、女子的にはどうなの。女子もうんこ好きなのか?
この「うんこ漢字ドリル」売れているらしい。
ちょっと内容を見てみると、本当に例文に皆「うんこ」が含まれている。
これって、原稿書いてる人はしんどいだろうなぁ...編集する人もだけど...
手分けしてやるにしても、毎日うんこまみれなわけでしょ?
古屋雄作という人が例文を考えているのか、なんかお笑いDVDの作家さんなのか。なら大丈夫?
でもないと思うが...
本当に、例文がうんこまみれなのか、ちょっと見てみた(amazonでちょっと見れる)。
確かに、例文はうんこばかり。
紹介記事から抜粋すると
・田んぼのどまん中でうんこをひろった
・田うえをしながらうんこをもらすおじいさん
・水田にうんこをなげ入れる
田の字を学習する際の例文らしい。
もう、アホかと。無理矢理うんこ入れないといけないから、とんでもない例文になってしまっている。しかし、なんか笑える。
田んぼでうんこを拾う必要なないでしょ。
どういうシチュエーションなんだろう。
田植えをしながらうんこを漏らすって、ありえそうだけど...
水田に”なぜ”うんこを投げ入れる。投げ入れるには手で持たないといけないが...
こういうのが「シュールな笑い」っていうのか?
SQLポケリの例文も思い切って「うんこ」にしてみようかしら...
SELECT COUNT(*) FROM うんこ GROUP BY 大きさ, 色
うんこテーブルから、大きさと色を集計して行数を計算。
とか...
SELECT * FROM トイレ WHERE 便器 = 'うんこ'
トイレテーブルの便器フィールドが'うんこ'である行を選択。
流し忘れかよ。
うんこドリルの場合、あくまでうんこで統一されているみたい。「うんち」とか「クソ」とかは出てこない。あくまでうんこ。
それだと例文作るの大変だよね。
論理的な例文にはできないかも。「うんこ」も「うんち」も検索したい、みたいにバリエーションを許さないとちゃんとした例文は作れなさそう。シュールな例文作ってもねぇ...
となんか、真面目に考えたりしてみたが、うんこ例文は無理だなぁ。
小学生は、SQLを学習しないしね。
関連記事
SQLポケットリファレンスが第4版になりました
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
サイト内を検索
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本