Yabu.log

ITなどの雑記

プログラマのためのSQL 読書会(19)に参加

「24 単純なSELECT文」から「25.3.3 自然外部結合と条件付き外部結合」まで読みました。

内容的にはSELECT文、結合などが中心です。

結合って、初心者が挫折しやすいところではないでしょうか。 この本のようにcross joinから説明を始めると、わかりやすいのかもしれません。

MySQLのExplain

MySQLではExplain extendを使うことでより詳細な実行計画を表示できる。

https://dev.mysql.com/doc/refman/5.6/ja/explain-extended.html

結合前の絞り込み件数などが見えるようです。

サブクエリのネスト

「25.1相関サブクエリ」

相関サブクエリを入れ子にできる深さに理論上の制限はない。

とありますが、勿論格RDBMS製品にサブクエリのネスト制限があります。

字句解析・構文解析

flex,yacc,バイソン

などの話題が出た。 SQLBNFを食わせることでパーサーを作れるらしい。

Cコンパイラを作ろう的な本で軽くみたことがあるので、この辺はしっかり掘り下げていきたい。

コードファースト、テーブルファースト

チームの考え方によってはテーブルをそこまで重視しない場合もあるらしい(アジャイル等) コード(クラス)から生成させるもの、という視点の現場ではテーブルの変更が運用中に入ることも多いらしい。

まぁ普通はテーブル作ってから開発入ると思いますが。*1

upc

「25.2 標準的な構文の内部結合」に突如出ていた謎のコードことupc

もし読者の使っているスキーマの中にproduct_idやproduct_nbr、あるいはupcといった列名が複数のテーブルで使われているようであれば、それぞれの要素が一意な名前を持つようスキーマ全体を変更するべきだろう。

upcってなんだ?という話題になりました。

https://www.keyence.co.jp/ss/products/autoid/codereader/basic_jan.jsp

よく探せば「4.2.3 業界標準の一位識別子」に書いてありますね。

GIIN(国際取引商品番号)は小売業の商品についている商品識別コードの総称で「ジーティン」と読む。北米では、UPCというGTINの一種がよく利用されている。

外部結合はSQL99から

外部結合の構文はSQL99で追加になった。それ以前はUNIONを使った面倒のクエリが必要。 やってることは内部結合 + 左側の行で結合できず消えた列をunionで足している。

SELECT a.valu1,a.valu2,b.valu1 FROM a LEFT JOIN b on (a.id = b.a_id)
SELECT a.valu1,a.valu2,b.valu1 FROM a,b WHERE a.id = b.a_id
UNION ALL
SELECT a.valu1,a.valu2,CAST(NULL AS INTEGER)
 FROM a
 WHERE NOT EXISTS(SELEDT * FROM b where b.a_id = a.id);

迂回するUNION句は現実には存在しない?

OUTER JOIN導入以前は律儀に上記の迂回クエリを使っていたのかと思いきや・・・ そういうことはなく、各ベンダー早めに外部結合を入れる構文を導入していたのでそちらを利用して凌いでいた、というのが実情らしい。*2

実際に上記の外部結合と同等の結果を返すクエリの例。 https://www.shift-the-oracle.com/sql/left-right-outer-join.html https://msdn.microsoft.com/ja-jp/library/ee240720(v=sql.120).aspx

JOIN禁止?

  • JOIN禁止という現場もあるらしい。
  • IBM系で多いらしい。

JOIN禁止でググったらそれらしいブログが出てきた。

http://d.hatena.ne.jp/Sikushima/20110809/1312871002

RIGHT JOINは必要なのか?

RIGHT JOINだけで良いのでは無いか、標準SQLにはなぜRIGHT JOINが入っているのかという話題が出ました。 一説によると、FROM句の順番を変えられないフレームワーク等(ORM,BIツール)用にあるのでは?という話になりました。

https://www.quora.com/Why-do-we-have-Left-Join-and-Right-Join-in-SQL-if-we-can-use-Left-Join-to-get-same-result-as-of-Right-Join-by-just-changing-the-position-of-tables

*1:時代遅れ?

*2:標準SQLを使うべきという立場のこの本からすれば標準外のベンダ拡張を使うのは好ましく無い