2018年09月22日

SQLの正規化を考察して疲れたから古川麦のGreen Turquoiseに癒されて湘南に思いを馳せる真夜中

今週はマジで疲れた。3行で済むwhere句を使ったSQL文なんかでは、現場では通用しなかったな…。
テーブルが何十個に分かれたデータを、小難しいSQL文書いて、結合させたり、条件に該当するデータだけを抽出して一覧表示とかさせてたが。
Excelの世界で生きてきた自分にとってはどうも、RDBMSの世界についていけなかったりする。
一番、理解しがたいのは「SQLの正規化」とかいうのを行って、やたら表を増やしたがる感じだ。
だがその風潮に俺はアゲインストしていきたいな。
判りやすく正規化の弱点、単純なモデルでそれを提示してやるとだな。

店名郵便番号住所
とんかつまい泉守谷下り線302-0117茨城県守谷市野木崎97−3

みたいなデータがあるとするよ。
ほんでこれを正規化するとなると、まあ住所だな。
住所をDividedして、県名と住所に分けるとするわ。

店名郵便番号県名住所
とんかつまい泉守谷下り線302-0117茨城県守谷市野木崎97−3

ってなる。正規化はこれで終わりじゃないんだよ。
セル、値を別のテーブル(表)から定義するから、こんな感じでデータが分かれる。

表1(本体テーブル)

店名郵便番号県名コード住所
とんかつまい泉守谷下り線302-01171守谷市野木崎97−3

表2(県名テーブル)

県名コード県名
1 茨城県

そしたらどうよ!?
余計な列が増えてるやろ。正規化には共通項、2つのテーブルを紐づけるための共通の列が必要だからな。
まさに「正規化の失敗」というやつではないだろうか。
だって列が4から5に、表だって1から2に増えてるんだから。
データが肥大化して複雑化したってことだからな。
しかも、しかもですよ。ここから何と、データを確認するときは、

select * from 本体テーブル h
lelft outer join 県名テーブル k
on h.県名コード=k.県名コード

みたいな小難しい文を入れてだな。したら、

店名郵便番号県名コード県名住所
とんかつまい泉守谷下り線302-01171茨城県守谷市野木崎97−3

みたいにデータが全部出てくるってことで、

select 店名,郵便番号,県名,住所 from 本体テーブル h
lelft outer join 県名テーブル k
on h.県名コード=k.県名コード

ってな感じで書き換えて、ようやく…

店名郵便番号県名住所
とんかつまい泉守谷下り線302-0117茨城県守谷市野木崎97−3

みたいに、正規化する前の最初の状態を表示させて、確認するのよ。
ちなみにleft outer joinってのは「左表で結合相手が見つからず、NULLであっても必ず出力せよ」みたいな感じだ。
こんな単純なモデルならjoin句でもよかったのかもな。

閑話休題。

最初から分けなくてよかっただろ?
わざわざ表を2つに分けて、確認するときは小難しいコード打ち込んで、何をやってるんだと。

だがここでメリットが見える場合もある。
これをやることで県名が入ってない住所をあぶりだせることだってある。

店名郵便番号住所
とんかつまい泉守谷下り線302-0117茨城県守谷市野木崎97−3
とみかつ古市店536-0001大阪市城東区古市3丁目21−19

みたいにな、「"大阪府"が無い」ってことが、正規化する過程で見つかったりするだろ。
まあ他にも、こんな単純なモデルでは見えてこないメリットもあるっぽいんだがな。
あと主キーがどうこう、っていうのも大事みたいだが。


集中力切れた、もう今日は勉強しねえぞ。
そんな感じで、仕事に疲れた時、癒されたい時に最近これを聴いてる。


う〜ん、何と甘美な。
美しいヴァイオリンの調べとともに、それに相反するまではいかないまでも、哀愁と郷愁を掻き立てるような繊細なギターとヴォーカルが調和してる。コントラバスが少しだけ重厚感を与えて、響き渡るというか寄り添うような乾いたドラム、プリミティブな口笛で生み出すメロディも、更にこの音楽に奥行きを付与してる感じだ。
しかもこれ、野外でやってるんだよ。"anpuragudo"(アンプラグド)だよ。
この文明社会、電力に依存した生活を過ごしている中で、それ無しでこんな素晴らしい音楽を創り出せるってのは、すごいことよほんとに。
ロケ地が東京?(クレジットに「national astronomical observatory of japan」と出てる)なのか、どこか判らんけども「こんな美しい緑が残っている場所があったなんて!」と、音楽の良さで周りの風景まで引き立ってる。
もっと評価されるべき。5万回再生なんてじゃなくて、俺からすれば、500万回再生されてほしいぐらいの音楽だな。

何がアム活だよほんとに。安室奈美恵の音楽は確かに、「Don't wanna cry」とか「Baby Don't Cry」とかよ、いい曲もあるよ。
でも神聖化されすぎだろ、と思うんですわ。紅白の時だって、違和感があった。
笑顔はあったか、感情表現は豊かだったか?90年代の青春時代が沸き上がるような、思い出を喚起してくたか?
我々の人生に寄り添うようなステージだったか?
俺は「否!」だと言いたいね。

安室ちゃんと同じぐらい素晴らしい音楽創ってる人もいる。
単に運悪くメディアに取り上げられなかったり、宣伝がうまくいかなかったり、口コミで広がらなかったりとかね。
探せばあるんだよ。好奇心が欠如してると思ってる、俺は。
音楽が好きならば、もっといろんな音楽をdigするだろうし、そしたら安室ちゃんへのリスペクトは、他のアーティストにも向くだろうから。
決して一アーティストだけ、とはならないはずなんですわ。

とか何とか思うに至ったのは、安室ちゃんにちなんだこんな記事を見つけたからよ。


こんなクビの言われ方ってあるか…湘南のイメージ変わるなぁ。
でも行ってみたくなったな、湘南国際村。
葉山のマーロウのプリンも食べてみたい。
オンラインでも売ってるみたいだけどな、知らんかった。


古川麦のGreen Turquoiseは本当にアンプラグド音楽の2010年代のアンセムだわ、是非聞いてちょうだい。

古川麦 FAR/CLOSE(「Green Turquoise」収録)

posted by DJしかばね at 06:17 | Comment(0) | 美味い店(国内) | このブログの読者になる | 更新情報をチェックする

2018年09月18日

指定の文字列を含むレコードを表示するためのSQL文

昨日はちゃんと勉強した。
タイトルのSQL文について。


がわかりやすかった。
コードはこんな感じよ。

select 住所
from とんかつ野郎
where 住所 like '%札幌市%'

これで、「とんかつ野郎」っていうテーブルの、「住所」列から、"札幌市"を含むデータだけを抽出することができたな。
一応、本も読んで体系的に覚えとくと。
大事なのはwhere句だな。
これがないと「すべての行が処理対象になってしまう」から、検索にすごい時間を要するみたいよ。
「where 住所」とすることで、「住所」列に属する行だけから検索をかけることができる。
あとこの句は、select、update、delete文だけしか使用することができないみたいだな。

そしてwhere句の後には条件式が来る。
それが、ここでいうlike演算子。
これを使うと"パターンマッチング"(●●●という文字列を一部に含むか?という判定)ができらしく、likeの後ろに来るパターン文字列では「%(任意の0文字以上の文字列)」と「_(アンダースコア:任意の1文字)」が使えるんだと。
よし、今日はこれでいいか。

posted by DJしかばね at 00:32 | Comment(0) | SQL | このブログの読者になる | 更新情報をチェックする

2018年09月17日

Excelで作ったcsvファイルをOracle DatabeseにSQL Editor経由でインポートして新規テーブルとして迎え入れようと試みた

ヤバいな迷走王ボーダー、面白すぎる。
1巻の感想2巻の感想と書いたが。
迷走王 ボーダー 3(下)にも何か、気になる描写がったな。"あちら側"の女の子は"アルフィー"のCD買ってるだの。
"あちら側"の女は遊びの相手と結婚の相手をキッチリ分けて 上手に楽しめるんだよな なにもかも未来の見当がついちゃってるんだ」「そんなの ちっとも"自由"じゃないぜ 古くさ〜い気がしないか?営業ロックの連中と同じノリだと思わない?」みたいな、社会への違和感を吐露する久保田の話が興味深かった。
つまり、

遊びたい人と結婚したい人を分けて付き合う=面白くない、ロックじゃない

ってことらしい。
遊びたい人、が結婚したい人、だったらそれは最上級にいいことだと思うし、楽しい日々を過ごせそうだけど。
いんや、楽しいこととロックであることは同義ではないわな。
「A rolling stone gathers no moss(転がる石に苔むさず)」って諺は、ロックを解釈するのに判りやすいし、この漫画でもこの諺は出てくる。蜂須賀の生き方がまさにそれ。何にも属さず、無軌道に、無頼に生きる感じ。
つまり「安牌を選ぶな」ってことか、麻雀でいうと。
誰かの顔色を窺って生み出す営業ロックではなくて、自分の内側からこみ上げる純粋なロック(があるかはさておいて)を優先させる、それで転がり落ちたとしても、それを恐れるなというメッセージ。が、この漫画にはあるな。

まあそんな風に漫画ばっか読んでるわけにもいかねえからな、今日の夜中はデータベースと格闘することにしたのよね。
SQL Developer使った、ExcelのデータをOracleのデータベースに入れる、それをやるということで。
さっそく得意のググりんぐで調べたところ、判りやすい説明をしている記事を発見した。


これは図解で判りやすい!この通りに進めてみたのよ。

(1)まずはこんな感じで_20180917_020435.jpg
(1)まずは俺の手持ちのデータ「とんかつ野郎.csv」を、Oracleデータベースに入れるべく、「データ・ファイルのインポート」から参照。楽勝だね。
(2)既にテーブルが作ってあったから、それに追加、挿入する形でデータを取り込む.jpg
(2)何かすでに「三重グルメ」みたいなテーブルがあったから、インポート方法は「挿入」を選んだ。他の3つの選択肢「挿入スクリプト」「ステージング外部表」「SQL*Loaderユーティリティ」は意味不明で、何か選ぶのも恐ろしいからな。

(3)どっちに入れたらいいか判らんかったが使用可能な列に入れるべき.jpg
(3)「選択済の列」なのか「使用可能な列」なのか、どっちに入れたらいいか判らんかったから、使用可能な列の方にとりあえず入れた。

(4)ターゲット表列が既にあったのはおかしかったかもしれない_20180917_020636.jpg
(4)「ターゲット表の列」には、既に入ってあったテーブル「三重グルメ」のカラム(列)が何かいろいろ入ってた。そこに「ソース・データの列」を入れるっていうか、インポートする表のどの列と、既にある表(テーブル)のどの列が対応してるのか、ここでしっかり指定しないといけなかったのかな?

(5)エラーメッセージ_20180917_020655.jpg
(5)行1の挿入に失敗しました…無慈悲なエラーメッセージ。「コンピュータは頭よくないので、しっかり指示しないと動かないんですよ」という、誰かが言ってた言葉を思い出したね。

(6)いいえを連打_20180917_020718.jpg
(6)やけくそで「いいえ」を連打だ、どや!

(7)インポートがコミットされた_20180917_020726.jpg
(7)全然応えてくれてないな…データのインポート.タスクが正常に実行され、インポートがコミットされました。…ってどこがや!?
これを正常と言えるのか!?
勢いでデータベースは何とかならんってことか…。

(8)もはやデータベースの形を成してない 2018-09-17 02-50-53-665.jpg
(8)殺伐としたデータベース、秩序なし。関係データベース管理システム(RDBMS)としての体裁を保ててないな。

ちょっと適当にやりすぎた。
もう1回よく考えると。
まず(2)の段階で、既にあるテーブルに、また表を加えようとするのがまずかったかもしれん。テーブルにテーブルを入れる、みたいなことだからな。
インポートする表は新規扱いで、それ単体で入れられるようにしてみるか。
(3)の段階で、各列を「使用可能な列」の方に移動させなかったのも怪しい。移動させるべきだったかもしれんな。
(4)だって、ちゃんとターゲット表の列の指定とかせんかった。ここでも間違ってる可能性あるな。

そんな感じで、とりあえず各プロセスを検証してもう1回インポートを試みたら。
できたんだよな、さすが俺だわ。まあ偶然うまくいった、だけだけど…いや、うまくいってないか…。
結果的に(3)は関係なかった、正しかった。

・SQL Editorの「表(フィルタ対象)」の箇所で右クリック→
・データをインポート→
・csvファイル選択→
・インポートの際「date」がエラーになってるから、名前を付けてやった。※(4)の段階→
・Varchar2(SQLの型名のこと)のバイト数が初期値26だから100とかデカい値にしてやる→
・そうするとインポート失敗を避けることができてデータを入れられる…。

って流れ。まあ雑に書いちまっが、図解はまた気が向いたらということで。
しかしなぜか、Excelのcsvデータの方は4400行ぐらいあるのに。
インポートしたデータは2514行しかない。
けど最後の数行はどっちも大体一致してた。
だから途中でデータのインポートが止まったのではないってことで、csvの方でインポートされなかったデータは、密集してるんじゃなくて点在してるってことになる。
何か不備があるデータは、インポートされんかったかもしれんな。
あるいは、データに不備はないが条件に合致しなかったからインポートされずにはじかれた。

何で入るデータと入らないデータがあるのか、excelのcsvファイルの各行の中身と、インポートした際の条件を照らし合わせて、調べないかん。が、今日は面倒臭いから、とりあえず今度にするかな。
posted by DJしかばね at 04:23 | Comment(0) | 美味い店(国内) | このブログの読者になる | 更新情報をチェックする