So-net無料ブログ作成
SQLポケリ ブログトップ
前の10件 | -

ラズパイ pythonでSQLite3 トランザクション [SQLポケリ]



前回、ラズパイにSQLite3を導入してみた。

  ラズパイに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を行う場合は、トランザクションでまとめるべし。


[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)







関連記事
ラズパイにボタンを付けてシャットダウンさせる
ラズパイにSQLiteをインストール
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版



サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

ラズパイにSQLiteをインストール [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, in 
    import 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')




[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)







関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
第4版には電子版もあります。
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版

サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

SQLiteでのデータ型 [SQLポケリ]



本日は、SQLiteネタである。

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
);



[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)



関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版
「SQLite for Excel」 Excel VBAからSQLiteデータベースを使用する


サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

「プログラミング言語図鑑」を買ってみた結構面白かった [SQLポケリ]



本日は、仕事の関係上池袋に行ってきた。
ちょっと時間があったので、本屋さんに行ってみた。
まぁ、目的は、自分の書いた本が、どういう扱いになっているかを調べに行くのが日課...じゃなくて、どう言ったプログラミング本が人気なのかな、という市場調査なわけではあるが...

そんな中、面白そうな本を発見したので、購入してきた。

プログラミング言語図鑑

プログラミング言語図鑑

プログラミング言語図鑑

  • 作者: 増井 敏克
  • 出版社/メーカー: ソシム
  • 発売日: 2017/08/01
  • メディア: 単行本



この本は、プログラミング言語に「どう言ったものがあるのか」を紹介したもの、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を使っているので、ちょっと反則気味?ハノイの塔って基本、再起処理しないと綺麗に書けないので「しょうがないかも」だけど。

まぁ、気になった方は読んでみて下さい。

人の書籍を宣伝してどうするの、っていうことは置いておくことにするが、「プログラミング言語図鑑」を見てSQLが気になった方はSQLポケットリファレンスを読んで欲しい。お、宣伝になったか。


[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)



関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版



サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

うんこ漢字ドリルにならってSQLポケリの例文をうんこにする? [SQLポケリ]



うんこ漢字ドリルって

世の中には変なものがあるというか、その名もうんこ漢字ドリルである。
漢字ドリルって昔やったなぁ...
小学生のじぶんか。

でも、「うんこ」って何よ。と思ったら、例文が「皆うんこがらみ」っていうことらしい。

何だそれ。

まぁねぇ、小学生はうんこ好きだよね。
でも、男子ならともかく、女子的にはどうなの。女子もうんこ好きなのか?

この「うんこ漢字ドリル」売れているらしい。

日本一楽しい漢字ドリル うんこかん字ドリル 小学1年生

日本一楽しい漢字ドリル うんこかん字ドリル 小学1年生

  • 作者: 文響社(編集)
  • 出版社/メーカー: 文響社
  • 発売日: 2017/03/18
  • メディア: 単行本(ソフトカバー)


ちょっと内容を見てみると、本当に例文に皆「うんこ」が含まれている。
これって、原稿書いてる人はしんどいだろうなぁ...編集する人もだけど...
手分けしてやるにしても、毎日うんこまみれなわけでしょ?

古屋雄作という人が例文を考えているのか、なんかお笑いDVDの作家さんなのか。なら大丈夫?
でもないと思うが...

本当に、例文がうんこまみれなのか、ちょっと見てみた(amazonでちょっと見れる)。

確かに、例文はうんこばかり。

紹介記事から抜粋すると

 ・田んぼのどまん中でうんこをひろった
 ・田うえをしながらうんこをもらすおじいさん
 ・水田にうんこをなげ入れる

田の字を学習する際の例文らしい。

もう、アホかと。無理矢理うんこ入れないといけないから、とんでもない例文になってしまっている。しかし、なんか笑える。

田んぼでうんこを拾う必要なないでしょ。
どういうシチュエーションなんだろう。

田植えをしながらうんこを漏らすって、ありえそうだけど...

水田に”なぜ”うんこを投げ入れる。投げ入れるには手で持たないといけないが...

こういうのが「シュールな笑い」っていうのか?

SQLポケリの例文も思い切って「うんこ」にしてみようかしら...

SELECT COUNT(*) FROM うんこ GROUP BY 大きさ, 色


うんこテーブルから、大きさと色を集計して行数を計算。
とか...

SELECT * FROM トイレ WHERE 便器 = 'うんこ'


トイレテーブルの便器フィールドが'うんこ'である行を選択。
流し忘れかよ。

うんこドリルの場合、あくまでうんこで統一されているみたい。「うんち」とか「クソ」とかは出てこない。あくまでうんこ。
それだと例文作るの大変だよね。
論理的な例文にはできないかも。「うんこ」も「うんち」も検索したい、みたいにバリエーションを許さないとちゃんとした例文は作れなさそう。シュールな例文作ってもねぇ...

となんか、真面目に考えたりしてみたが、うんこ例文は無理だなぁ。
小学生は、SQLを学習しないしね。

関連記事
SQLポケットリファレンスが第4版になりました
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2


サイト内を検索


nice!(1)  コメント(0) 
共通テーマ:携帯コンテンツ

「SQLite for Excel」 Excel VBAからSQLiteデータベースを使用する SQLポケリ [SQLポケリ]



えーと本日は、SQLiteネタである。

Google Analyticsによると、「Androidアプリ開発 SQLiteデータベースを使用する SQLポケリ」へのアクセスが多いとのこと。SQLite関係の記事を充実させるのである。

Webアプリ全盛な時代なのに、現場ではExcel使ってデータ入力したり、帳票出力するっていうところがいまだに多いようである。特に、街の小さな工場とか、商店とか。
Oracleデータベース使って、Webサーバと連携して、JavaScriptでリッチなクライアントを作成して、というのが流行りではあるものの「それはIT業界に限った話」でしかないのかも。
そもそも、小さな工場ならデータベースを使ったシステムなんか要らないのかも。

しかし、どういうわけか「現場の人はExcel好き」だったりする。ExcelのVLOOKUPやMATCH+INDEXじゃあパフォーマンス的に限界があるから、データベースに移行してくださいよ。といってもなかなか受け入れてもらえなかったりする。
普通にシステムを作成していても、Excelシートでデータを見たいんだけど...っていう要望が多かったり...

なぜか?

VBAが苦手。ましてやSQLなんて意味不明。Excel関数でできるじゃん。

という人が多いのであろう。

Excel使っているのなら、Access入れれば結構いい感じのシステムになりそうなのに。なんでイマドキMATCHやらINDEXとかのExcel関数使うのよ。もう。

Officeのプロフェッショナルは高い

Accessは、別に買わないといけない。
Excel、Word、OutlookはOfficeのセットなのだが、ここにAccessが入っていないので、高い方のOfficeを買わないといけない。それがネックなのか...


Microsoft Access 2016 (最新)|オンラインコード版

Microsoft Access 2016 (最新)|オンラインコード版

  • 出版社/メーカー: マイクロソフト
  • メディア: Software Download



じゃあ、SQL Server Express入れてしまえばいいじゃん。と思うのだが、これはシステム屋が考えることらしい。無料で使えるといっても、データベースサーバを導入することについては「敷居が高い」と思われている。
うーん。まぁねぇ。専用のサーバマシンを導入したくなるし、運用面を考えるとなぁ...
MySQLやPostgreSQLという線もあるのではあるが、こっちは一層敷居が高くなってしまう。
データベースサーバを入れたら、複数のユーザで使えるようなシステムにできるので、かなり効率アップできると思うのだが...

ちょっと話を整理する

 Accessを買うのがもったいない
 別にデータベースサーバが欲しいわけじゃない
 ちょっと遅いけどExcelで十分じゃない

ということなのかも知れない。

じゃあ、Excel+SQLiteで万事うまくいくのでは?

そう思っている人も多いらしく「SQLite for Excel」というパッケージが存在する。
ExcelからSQLiteを使うときは、SQLiteのODBCドライバを入れる方法もある。
今回は、SQLite for Excelをやってみたい。

SQLite for Excelは以下のURLからダウンロードできる

SQLite for Excel

GitHubってよくわからないんだけど、Clone or downloadのDownload ZIPでダウンロードできる模様。

展開すると、Distributionのフォルダにsqlite3.dllとSQLite3_StdCall.dllが入っている。sqlite3.dllは、SQLiteのエンジンが入ったDLL。SQLite3_StdCall.dllは、sqliteのAPIをVBAからアクセスできるようにしたラップ関数が入ったDLLぽい。

Distributionのフォルダには、サンプルらしきExcelファイルがある。
開いてみよう。

SQLiteForExcel_64.xlsmを開いてみる

SQLite for Excel 2017-06-13 (3).png

シートにはなにも書いてない。

Visual Basic Editorを起動してみる。

SQLite for Excel 2017-06-13 (4).png

なんかあるぞ。
標準モジュールに、Sqlite3とSqliteDemoのふたつが存在している。
Sqlite3の方には、SQLITE_OKとかSQLiteのAPIでおなじみの定数定義があったりする。
おー、間違いなくSQLite用みたいだ。

Sqlite3Demoの方は、デモ用か。AllTestsでテストできるのか。
イミディエイトを開いておいて、マクロの実行からAllTestsを実行してみる。

SQLite for Excel 2017-06-13 (5).png

なんかテストした!

本日は、ここまで。


「改訂第4版SQLポケットリファレンス」は、SQLiteにも対応しています。


[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)




Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本



関連記事






サイト内を検索


タグ:Excel SQL
nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

改訂第4版 SQLポケットリファレンス電子版 [SQLポケリ]



改訂第4版 SQLポケットリファレンス電子版

みなさん、こんにちは。本日もSQLポケットリファレンスの話題である。
前にも紹介したと思うが、最近では書籍の電子化が当たり前になってきている。SQLポケットリファレンスも改訂第3版を電子化するかどうか、といった話があったが、見送られていた。当時は、電子出版したら不正コピーが横行するのではないか、という心配があったからである。

そんな心配もあったが、時代の流れは電子化される方向に動いている。今回の改訂で、電子化されることになったのである。以下のURLから購入することができる。


[改訂第4版]SQLポケットリファレンス
https://gihyo.jp/dp/ebook/2016/978-4-7741-8826-3



技術評論社では、電子版と紙の本とで価格に差がない。どちらも同じ1980円。
電子版だと、印税率が高い。なので、私としては、電子版を購入してもらった方が嬉しいのであるが、電子版の売れ行きはあまり「よろしくない」らしい。

電子版は、PCやタブレットで閲覧することになる(PDFでダウンロードできる)。リファレンス的な内容の本は「ネット検索した方が早い」という場合が多いので、わざわざ、電子版の書籍を購入しなくても...

ということみたいである。
PDFを開いて検索するっていう方法もあるのだけれど...


電子機器持ち込み禁止

システム開発の現場によっては、「電子機器持ち込み禁止」というところがあるらしい。個人情報の流出が問題になるような、データセンターに入って開発や保守作業するのであれば、当然かも知れない。
PCはもちろんのこと、携帯電話、タブレット、デジカメ、USBメモリなどなど、今やちょっとしたデジタル機器でも数ギガのデータを入れることができるので、簡単に大量のデータを持ち出すことができてしまう。

そんな時は、紙媒体の資料を持ち込んで作業する、ということをするらしい(聞いた話なので)。

ふーん、なるほどね。それならSQLポケットリファレンスは「もってこい」じゃないですか。

でも、「電子機器持ち込み禁止」な現場で働いている開発者って、そう何人も居ないよね。あまり、期待はできないが、そんな辛い立場で開発している方は、紙媒体の「改訂第4版SQLポケットリファレンス」を宜しくお願いします。

マルチディスプレイ

普段システム開発している時は、Visual StudioやEclipseなんかのIDEを立ち上げてますよね。多分、ディスプレイを占有しているはず。
SQLの文法が分からないぞ、というときにSQLポケリを取り出して見ていると思う。電子版なら、PDFを開いてディスプレイ上で閲覧できる。サブディスプレイに出しておけば、とっても便利じゃない?サブディスプレイがない?それなら、スマホやタブレットに入れて見たらどう。

DSC_0287.JPG

どちらでもお好きな方をどうぞ。


関連記事
SQLポケットリファレンスが第4版になりました
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2




サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

みなさんこんにちは、本日は、重大発表があります。SQLポケットリファレンス第4版 [SQLポケリ]



なんと、SQLポケットリファレンスが第4版になりました。
じゃーん。

DSC_0278.JPG

例によって、歴代のSQLポケットリファレンスを並べてみると。

DSC_0277.JPG

なかなか壮観である。

えーと、なんか自慢みたいでいやなのだが、増刷になると1冊だけだが、本を出版社からもらえる。増刷する際に、誤記を訂正できるので、その確認のためにくれるのだが、SQLポケットリファレンスの場合、けっこう増刷しているので、何冊もある。
机の上にあってもじゃまなので、古い版のやつは、押し入れにしまってあったりする。

刷数が違うやつも並べてみたら、机の上に乗りきらなかった。うーん、歴史を感じるなぁ。最初が1999年(平成11年)だから、もう17年か。

初版  1999年
第2版 2003年
第3版 2009年
第4版 2017年

今回の改訂では、対応データベースがひとつ増えた。SQLiteが増えている。日々、AndroidやiOSなどの携帯端末上でアプリを開発している、という開発者も多いことであろう。そんな、方々にもSQLポケットリファレンスを使ってもらおう。というのが今回の改訂の目論見のひとつでもあった。

組み込み系では、SQLなんて使わなくても、配列で十分、とか... サイズ的に重たいんじゃない?といった意見も多い。というか、「多かった」かなぁ。しかし、AndroidやiPhoneには標準で入っているし。これを使わない手はない。

それに、今や組み込みにしても、ギガ単位でストレージを持つことも珍しくない。流石にOracleをフルセットで導入、とかは無理かも知れないが、SQLiteなら数百キロくらいでOK。raspberry piなんか、メモリ1ギガも積んでるし。5000円なのに。
そういえば、昔Oracle Liteっていうのがあったなぁ。

ということで、進化を続けるSQLポケットリファレンスなのであるが、改訂する度にページ数は増えている。当然、内容を充実させてきた結果ではあるが。ちょっとまとめてみよう。

ページ数対応DB
初版  416 Oracle、SQL Server、MS Access
第2版 600 Oracle、SQL Server、DB2、PostgreSQL、MySQL、MS Access
第3版 640 Oracle、SQL Server、DB2、PostgreSQL、MySQL、MS Access
第4版 656 Oracle、SQL Server、DB2、PostgreSQL、MySQL、SQLite、MS Access


そんな感じで進化を続けてきたSQLポケットリファレンスであるが、変わっていないことがひとつある。

お気づきであろうか。
カバーの色が「緑」っていうことも、変化していないうちのひとつではあるが、それより決定的に変化していないものがある。


それは、


なんと、お値段がそのまま1980円なのである。

ページ数が増えればそれだけ、本の値段は高くなるのが普通。印刷するのにコストがかかるから。しかしながら、お値段は変わらず1980円なのである。
消費税が5%から8%になり、税込みでいうと、2079円から2138円に値上げされてしまった感があるが、本体価格は発売以来ずーと1980円なのである。

気になって、他のポケットリファレンスシリーズの価格も調べてみると、2000円台のものが多い。最近発行されたものは、2500円くらい。他の出版社さんでも2000円くらいが多いか。

いいんですかねぇ、こんなにお安くて。

まぁ、戦略としてはよいと思う。内容が充実しているのに、1980円なら「安い」と思えるでしょう。Web関係の開発者が、JavaScriptリファレンスが必要という状況で、SQLもあった方がよいか... ということになり、1980円なら、ついでに購入。っていうことが期待できそう。

なんにしても、新しくなった「改訂第4版SQLポケットリファレンス」をどうぞよろしくお願い致します。



[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)



関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
第4版には電子版もあります。
改訂第4版 SQLポケットリファレンス電子版




サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

onclick事件 [SQLポケリ]



先日、ネタになりそうな話を聞いたので、久しぶりにブログを更新してみる。

ハンディターミナルを扱っている販売代理店の方と食事をする機会があり、その中で聞いた話である。
工場が中国にあるそうで、そことのやりとりも多いそうである。やりとりは英語が中心になるそうなのであるが、たまに日本語も入ってくるらしい。

とある日のメールに「onclick事件」がどうのこうのと書いてあったらしい。担当者は、何か工場で事件があったのか?とビビったようである。

何かのボタンをクリックしたら火を噴いたとか...

オチは、どうということはない。どうやら、eventのことは「事件」と訳されているというだけの話。
向こうの担当者は普通に、OnClickEventの話をしていたようなのだが、中途半端に訳してしまったものだから、混乱してしまったようである。しかし、

onclick事件

って書かれたらなんか意味深である。
気になって、「onclick事件」で検索してみたら、出てくる出てくる。これは結構笑える。

以前に、SQLポケットリファレンスの台湾版を紹介しているが、ここにも「何たら事件」がないかパラパラとめくってみた。

DSC_0331.JPG


GUI系ではないので、イベントは出てこないか...
残念。

目次を見ていくと、面白いキーワードを発見。「物件資料表」て何だ。
物件、物件?、物件??、不動産関係の本じゃないんだけど、物件って何?

対応するページを見てみると、わかった。どうも「オブジェクト」が「物件」に訳されている。
ふーん。

「物件資料表」=「オブジェクトテーブル」

ということらしい。

関連記事
SQLポケットリファレンス 台湾版「SQL語法範例辭典」
SQLポケットリファレンスが第4版になりました



[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)





サイト内を検索


nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

CROSS APPLY (LATERAL) で関数とJOIN(結合)して見る [SQLポケリ]



本日も、SQLネタである。
少し前に、結合方法について書いてみた(INNER JOINとかの記事のことです)。
NATURAL JOINが最新の結合方法、と書いてみたりしたのだが、これよりもっと新しそうなのを発見してしまった。

CROSS APPLY」というやつである。以前からその存在は知っていた(*1)のだが、Oracle12cで採用になったのでちょっと調べてみることにした。

*1
SQL Serverのマニュアルでxml列のメソッドnodes()を使うときに、CROSS APPLYを使っている。

CROSS APPLYはMS SQL Serverでは、2005からできることになっている。マニュアルには、テーブルを戻す関数をCROSS APPLYすると便利ですよ"的な"例が載っている。
そうなのか、じゃあやってみるか。

CREATE TABLE foo (
 a INTEGER,
 b VARCHAR(10)
);

INSERT INTO foo VALUES(1,'one');
INSERT INTO foo VALUES(2,'two');
INSERT INTO foo VALUES(3,'three');


まずは、CROSS APPLYの左側に指定するテーブルを作成してみた。このテーブルfooに対してCROSS APPLYで交差適用(とでもいうのだろうか)、をやってみたいと思う。
CROSS APPLYの右側には、テーブル値を戻す関数を指定するといいよ、とのことなので、関数を作成してみる。引数でもらった値の行数分だけ連番を戻すような関数を作成する。

CREATE FUNCTION func_bar(@no int)
 RETURNS @result TABLE (a int)
AS
BEGIN
  DECLARE @i int
  SET @i = 0
  WHILE @i < @no
  BEGIN
    INSERT INTO @result SELECT @i
    SET @i = @i + 1
  END
  RETURN
END


説明しなくてもいいよね。
この関数を実行したら、以下のような結果を戻す。

SELECT * FROM func_bar(2);
a
------
0
1


これで、CROSS APPLYの左右が揃った。fooとfun_barを結合してみるわけであるが、テーブルfooと関数func_barを単純に結合するのではなく、foo.aをfunc_barの引数に渡して結合したいのである。
そんな時に、CROSS APPLYを使うとよいらしい。違うかなぁ...まぁ、やってみよう。

SELECT * FROM foo CROSS APPLY func_bar(foo.a) AS FB

a   b     a_1
---------------
1   one   0
2   two   0
2   two   1
3   three 0
3   three 1
3   three 2


func_barに渡した引数で戻りの行数が異なる。これを考慮して、交差結合した感じになった。
a=1の行 func_barの戻す行=1 (0)
a=2の行 func_barの戻す行=2 (0,1)
a=3の行 func_barの戻す行=3 (0,1,2)

まぁ、そういうもんでしょう。

CROSS APPLYの左右を逆にすることはできない。

SELECT * FROM func_bar(foo.a) AS FB CROSS APPLY foo


はエラーになる。foo.aが最初に出現するので、これがわからん、と文句をいわれる。

マニュアルには関数なら便利だよ的なことが書いてあるので、関数じゃなければいけないかというと、そうでもない。テーブル値を戻せばよいだけなので、サブクエリでも良い。
もうひとつテーブルを作成してみよう。

CREATE TABLE bar (
 a INTEGER,
 b VARCHAR(20)
)

INSERT INTO bar VALUES(1,'uno');
INSERT INTO bar VALUES(1,'一');
INSERT INTO bar VALUES(2,'due');
INSERT INTO bar VALUES(2,'二');


barテーブルを作成した。これをSELECTするサブクエリをCROSS APPLYしてみよう。

SELECT * FROM foo CROSS APPLY (
  SELECT * FROM bar WHERE foo.a = bar.a
) AS SB

a   b     a_1  a_2
--------------------
1   one   1    uno
1   one   1    一
2   two   2    due
2   two   2    二


できた。
a=3の行がなくなってしまっているが、「OUTER APPLY」にすれば取得可能となる。

SELECT * FROM foo OUTER APPLY (
  SELECT * FROM bar WHERE foo.a = bar.a
) AS SB

a   b     a_1  a_2
--------------------
1   one   1    uno
1   one   1    一
2   two   2    due
2   two   2    二
3   three null null



えーと、これって普通のINNER JOINやLEFT JOINと「どう違うのだろう?」と思いません?
INNER JOINで書くとするのなら、以下のようにすればよいと思うのだが...

SELECT * FROM foo INNER JOIN (
  SELECT * FROM bar
) AS SB ON foo.a = SB.a


結合条件をサブクエリのWHEREで書いているか、FROMのONで書いているかの違いはあるのか。
CROSS APPLYを単にINNER JOINには変更できない。以下のようにすると、エラーになる。

SELECT * FROM foo INNER JOIN (
  SELECT * FROM bar WHERE foo.a = bar.a
) AS SB 


ONで条件式を書いていない、というのは横に置いておくとしても、サブクエリの中で、fooを使うことはできない。fooはわかりません、というエラーになる。

ああ、そうか、こういう場合、SELECT句にサブクエリ書いて逃げてきたかも。でも、SELECT句に書くとスカラ値を返さなくてはいけなくなって、散々苦労した覚えが...


LATERAL

LATERALインラインビューというものがある。これを使えば、INNER JOINでもCROSS APPLYのようなことができてしまうのである。
LATERALインラインビューにするには、サブクエリの前にLATERALキーワードを付けるだけ。

SELECT * FROM foo CROSS JOIN LATERAL (
  SELECT * FROM bar WHERE foo.a = bar.a
) SB 


SQL Serverでは、LATERALをサポートしていないので、エラーになってしまったが、Oracle12c、PostgreSQLでは実行できる。

OUTER APPLYにしたい場合は、LEFT JOINを使えば良い。

SELECT * FROM foo LEFT JOIN LATERAL (
  SELECT * FROM bar WHERE foo.a = bar.a
) SB ON foo.a = SB.a


結合条件を冗長に記述しないといけないのが、ちょっと美しくないが、しょうがない。
ちなみに、LATERALはSQL標準である。CROSS APPLYばベンダ拡張。

関連記事
SQLポケットリファレンスが第4版になりました



[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)



関連記事
SQLポケットリファレンスの歴史
SQLポケットリファレンスの歴史その2
SQLポケットリファレンスが第4版になりました
改訂第4版 SQLポケットリファレンス電子版


サイト内を検索


タグ:SQL 分析関数
nice!(1)  コメント(0) 
共通テーマ:携帯コンテンツ
前の10件 | - SQLポケリ ブログトップ

AREarthroidPro ARで地球を表示するアプリ

Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本