『達人に学ぶSQL徹底指南書 第2版』を読んだ

[2020-12-20-1] にも書いた通り、去年の 4 月から SQL と格闘する毎日です。もっとも全部自分で書くわけではなく、Looker が出力する SQL を理解したり、発生したエラーやデータ不正の原因を SQL 視点で調査したり、検証用の使い捨ての SQL を書いたりといった感じです。 つまりは SELECT 文しか書かないです。しかし、SELECT 文こそが SQL そのものと言っても良いため、現在のデータアーキテクト(データ整備人)という立ち位置での学習教材を探していました。そんな中思い出したのが本書になります。 LookML 開発者としてはこの本に書かれた全てが「優先度高」ではないため、敢えて流し読みを心がけました。 その中で重要だと思ったのはこのあたりでしょうか。 ・1 CASE 式のススメ ・2 必ずわかるウィンドウ関数 ・4 3値論理と NULL ・7 ウィンドウ関数で行間比較を行なう ・8 外部結合の使い方 ・18 GROUP BY と PARTITION BY Looker が出力する SQL で見かけない気がする EXISTS, HAVING あたりは流し読みしたので、正直まだ理解していません。近いうちに読み返すと思います。 それとは別に、「第1部 9 SQL での集合演算」は興味深かったです。すなわち、和(UNION)、差(EXCEPT)、積(CROSS JOIN)です。商(DIVEDE BY)は「諸事情」により標準化が遅れているそうです。今まで雰囲気で UNION ALL を使うくらいだったので、集合演算は自分のスコープが広がった気がしました。 「15 関係に始まり関係に終わる」に SQL の関係閉包性が UNIX のパイプの概念とよく似ているという記述も興味深かったです。 UNIX ではファイルがさまざまなコマンドの入力・出力になるため、(標準)出力をパイプで次々と渡すことが出来ます。SQL では UNIX のファイルはテーブルに相当します。SELECT 文はテーブルを引数にとってテーブルを返すため、UNIX と同じように次々と出力を渡すことが出来ます。これを関係の閉包性と呼ぶそうです。これを知って、SQL に一気に親近感が湧きました。...

2021-02-22 (Mon) · masutaka

『理論から学ぶデータベース実践入門』を読んだ

4 月から Looker という BI ツールを使って、ウェブ広告の媒体数値や計測数値などの分析や可視化をすべく、日々取り組んでいます。 ちょうど先月社内勉強会でそんな話をしました。 現在扱っているデータは Web アプリケーションで扱うような、正規化されたきれいなデータではありません。NULL は頻繁に出てきますし、サブクエリ等でゴリッときれいにしてキャッシュする処理も書いたりします。いつの間にか想定外のレコードが入っていて、定義を変更することもあります。 今までこのようなデータに向き合ったことはなかったので、こんなスキーマで良いのかなあ?とか思いながらの毎日でした。 そんな中、数年前に 94 ページ目まで読んで挫折したこの本が頭にちらついていました。 以前はふわっと読み始めたと記憶していますが、今回は割と明確な課題があります。今回は挫折しなさそうな気がしたのと、何かのヒントを期待して読むことにしました。 結論から書くと P155 に明確な答えが書いてありました。 リレーショナルモデルに適合しないデータをテーブルを用いて格納する場合は、リレーショナルモデルの原理原則に従う必要はまるでありません。そのようなテーブルでは、NULLを用いてもかまいませんし、正規化をする必要すらないでしょう。 ここを読むまでは、仮にリレーショナルモデルの原理原則に従うのだとしたら、すべてのカラムで NULL を許容しているテーブルを ETL 等でリレーショナルモデルに適合したテーブルにクリーニングするのかなあ?でも現実的ではないなあ?など考えながら読んでいました。なので、急に答えが降ってきたようでした。 SQL はリレーショナルモデルを扱うことが得意ですが、そうでないものも扱って良いと力強く書いてあります。もちろん用法用量を守って。 特に目の前の課題が解決したわけではありませんが、なにか光が見えた気がしました。 他の話も一応書いておくと、理論だけあって全部を理解するのはかなり難しく、特に第2〜4章は全く頭に入ってきませんでした。数年前はここで挫折…。 ただし、第1章の SQL と集合の関係については比較的容易で、私が数年前に読んだ時は SQL への向き合い方が変わりました。気になる人は第1章だけでも読むと良いかもしれません。他も第9章の履歴データや第13章のリファクタリングなども。 なにか課題を抱えている人は、あまり気負わずに流して読むと良いかもしれません。

2020-11-10 (Tue) · masutaka

『SQLアンチパターン』を読んだ

SQL との接点は Rails を使う時くらいで、Explain でテンポラリテーブ ルが作られるようなクエリを極力発行しない注意くらいしかしておらず、 危機感があったので読んでみました。あ、監訳者の @t_wada さんのツイ ートにももちろん影響されました。 実は 3 月には手に入れていたのですが、ずっと積読していて読み始めた のが先月からだったという…。とは言え、各章が 10 ページほどで収まっ ているので、なるべく毎日 2 章読むようにしたら、20 日ほどで読み終え ることが出来ました。 第 1 章は名前はさておき知っている人も多いジェイウォーク(信号無視)。 VARCHAR 型にカンマ区切りのテキストを入れてしまうアレです。さすがに 私も知っているので、ニヤリとしたのを覚えています。出だしのアンチパ ターンとしては難易度低目で良かったです。 読む前は上記のようなテーブル設計(本書ではデータベース論理設計とあ る)のアンチパターンがほとんどかと思っていましたが、クエリのアンチ パターンにも言及していたのが意外でした。そりゃそうか。 データベース論理設計のアンチパターン 全 8 章 データベース物理設計のアンチパターン 全 4 章 クエリのアンチパターン 全 6 章 アプリケーション開発のアンチパターン 全 7 章 付録: 正規化のルール 全 1 章 個人的には Rails が所々で言及されていたのが助かりました。ポリモー...

2016-08-17 (Wed) · masutaka

MySQL の主要なコマンド

# 接続("mysql>" プロンプトに移行する。) % mysql -u root -p # データベースの一覧 mysql> show databases; # 文字コードの確認 mysql> show create database データベース名; # データベースの作成 mysql> create database データベース名; # 文字コードに utf-8 を指定したデータベースの作成 mysql> create database データベース名 character set utf8; # ユーザの追加 mysql> grant all privileges on データベース名.* to ユーザ名@localhost identified by 'パスワード'; # データベースの削除 mysql> drop database データベース名; # サーバのステータス情報確認。"mysqladmin -u root -p status" はこれの簡易版。 mysql> status; # サーバの詳細なステータス情報確認。"mysqladmin -u root -p extended-status" と同様。 mysql> show status; # 終了 mysql> exit; # 変数の確認 % mysqladmin -u root -p variable # 存在するデータを全てバックアップ % mysqldump -u root -p -x --all-databases > alldump....

2009-10-10 (Sat) · masutaka