Effecitve SQLを読書会で読み終わりました
全16回でした。毎度木村@meijikさんの博識ぶりには驚かされる勉強会でした。
- 作者: John L. Viescas,Douglas J. Steele,Ben G. Clothier,株式会社クイープ
- 出版社/メーカー: 翔泳社
- 発売日: 2017/12/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
プログラマのSQLと比べると、中身が優しかったり、即効性がある情報が多いので、今すぐ役立つSQLテクニックを知りたい人にオススメです。逆にプログラマのためのSQLに出てきたような、長時間みんなで悩みながら「このクエリは何をやっているんだろう...」という難解なSQLは少ない傾向があったので、そういうのが好きな人には向かないかもしれません。
いかに個人的に面白いと思った本書の内容をまとめました。
CROSS JOIN
本書は1章丸ごとCROSS JOINに割いています。(第8章 直積)直積をまる一章説明している本は珍しいのではないでしょうか。気になった人はこの章だけでも通読をおすすめします。
「項目31 GROUP BYは短く保つ」
最近はgroup byに書いていないカラムもselect句に書いても良い 昔のMySQLの話ではない(ややこしい)
一部のDBMSでは、集約に使用されない列をGROUP BYに追加しなければならない。ただい、現在のSQL企画では、そうする必要はなくなっている
SQL/99以降では関数従属性が認識されている。したがって、現在のSQL木各区に準拠するには、実際には~のクエリで十分である
SELECT c.CustomerID, c.CustFirstName, c.CustLastName, c.CustState, MAX(o.OrderDate) AS LastOrderDate, COUNT(o.OrderNumber) AS OrderCount, SUM(o.OrderTotal) AS TotalAmount FROM Customers AS c LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID GROUP BY c.CustomerID, c.CustFirstName, c.CustLastName, c.CustState;
以下のSQLではCustomersテーブルの主キーCustomerIDで集約しているため、CustomerテーブルのカラムはGroup byに書かなくてもSELECT句に書くことができます。
SELECT c.CustomerID, c.CustFirstName, c.CustLastName, c.CustState, MAX(o.OrderDate) AS LastOrderDate, COUNT(o.OrderNumber) AS OrderCount, SUM(o.OrderTotal) AS TotalAmount FROM Customers AS c LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID GROUP BY c.CustomerID;
これがSQL99で標準化されているというのはちょっとした驚きでした。がこの本のクエリが全体的にこのGroup byの中を小さく保つ書き方がされていなかったのは少し気になりました。
あまり聞かない単語
挫折結合
LEFT JOINの適用後に右側のテーブルの主キーにnullをwhere句で指定すると、右側のテーブルに対応するデータがない左側のエンティティを絞り込むことができます。
SELECT P.ProductNumber, P.ProductName FROM Products AS P LEFT JOIN Order_Details AS OD ON P.ProductNumber = OD.ProductNumber WHERE OD.ProductNumber IS NULL;
これを挫折結合(frustrated join)というそうです。この単語はこの本で初めてみました。
sargable
出自はIBMのマニュアルのようです。意味としてはWhere句の中がB-tree indexを利用できるような述語になっているか、という意味になります。(そして本書にはSQLをsargableにするテクニックが多数紹介されています)
一般的でない誤字
order by 述語という誤字がよく出てきました。こちらは木村さんが原著を確認したところorder by predicateとなっていた(多分)ので誤訳ではなく、原著からの誤字だと思います。よくwhere文やcase文という間違い(SQLでは正しくはwhere句,case式)は結構みますが、order by述語という言い間違いは初めて見ました。わざわざ「述語」なんて言い方する人は、ある程度語句の使い方には注意しているのではないでしょうか。2019年6月時点で検索してみたら、SQLの文脈だと(order by述語)の使用例はこの本くらいでした。
参考
昔に背伸びして書いた記事です
次回
次回は曽根壮大さんの「失敗から学ぶRDBの正しい歩き方」を読むそうです。
失敗から学ぶRDBの正しい歩き方 (Software Design plus)
- 作者: 曽根壮大
- 出版社/メーカー: 技術評論社
- 発売日: 2019/03/06
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
同時並行で以下のものを読む計画があるそうです。
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2018/10/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 作者: Markus Winand
- 発売日: 2015/09/14
- メディア: ペーパーバック
- この商品を含むブログを見る