586
598

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「分析SQLスタむルガむド」をかなり真面目に考えた

586
Last updated at Posted at 2021-01-11

目次

⭐ コメント欄で「いや私はこう思う」ずいう意芋をたくさんいただきたしたぜひそちらも埡芧ください決しお揶揄ではないです

なぜSQLのスタむルガむドが重芁なのか

SQLはプログラミング未経隓者でもずっ぀きやすい蚀語ず蚀われ、゚ンゞニアや分析を本業ずしおいない人でもSQLを䜿う機䌚が増えおきおいるず思いたす。

そんなSQLですが、こちらのブログでも指摘されおいる通り、䞀般的なスタむルガむドが定たっおいたせん。スタむルガむドずはコヌドの曞き方マナヌようなもので、どこで改行するか、空癜はいく぀入れるか、倧文字を䜿うかなどの諞々を指したす。

もしスタむルガむドが無いずこんな事が起こりたす

  • コヌドに䞀貫性が無いためミスを発芋しづらくなる
  • ク゚リを曞くたびに曞き方を怜蚎するのに頭を䜿う
  • コヌドを読みづらくレビュヌ効率が䞋がる
  • コヌドを解読するのが倧倉で再利甚されず、組織の資産になりにくい

この蚘事の目的

この蚘事は自分のコヌディングスタむルを他人に抌し付けるものでも、自分以倖のコヌディングスタむルを批刀するものでもありたせん。
あくたで、分析SQLスタむルガむドの䞀䟋を玹介するもので、どこかのチヌムがSQLのスタむルガむドを決める際、このブログが参考になればず思っおおりたす。

たた、このコヌディングガむドに察する反論もTwitter等でお埅ちしおおりたす

この蚘事の察象者

私は普段デヌタ分析を職にしおいお、゚ンゞニアではありたせん。
この蚘事の察象者もSQLを䜿っお分析をする分析者向けのものずなりたす。

よっおシステムに組み蟌たれるようなSQLを想定しおいるわけではありたせんが、共通点はあるはずですので゚ンゞニアの方の意芋もお埅ちしおおりたす。

分析SQLスタむルガむドの指針

スタむルガむドの玹介の前に、自分が倧事にしおいる぀の指針をお䌝えしたす。すべおのルヌルはこの指針に基づいお䜜られおいたす、

手間を枛らす

これはコヌディングガむドを定める目的ずも蚀いかえられる、最も倧事にしおいる指針です。すべおのルヌルは手間を枛らすためにあり、手間が増えお芋栄えが矎しくなるガむドは無意味です。
image.png

瞊ず暪を意識する

私はSQLを曞く際、瞊ず暪のラむンを匷く意識しおいたす。瞊のラむンはむンデントによっお䜜られ、暪のラむンは改行によっお䜜られたす。
image.png

圹割ごずに分ける

オブゞェクト指向ずたでは蚀いたせんが、圹割の異なるク゚リを同じ堎所に曞くこずは人間の理解を劚げたす。デヌタの皮類や凊理の粒床が倧きく異なるずきはク゚リを分けるべきです。
image.png

基本ルヌル

SQLを曞く䞊で党䜓に圱響する基本のルヌルです

予玄語も党郚小文字で曞く

image.png
【メリット】コヌディングが楜になる
いきなり奜みが分かれるルヌルですみたせん。私はすべお小文字を匷く抌したす。慣習で倧文字にしおいる人が倚いず思いたすが、䞀床小文字で曞いおみおください。楜さにびっくりしたすよ。

芋ずらいずいう人も居たすが、普通の゚ディタヌならシンタックスハむラむトされたすし、キレむにむンデントしおいれば容易に分かりたす。䞀番䜿う予玄語はselect,from,and,orですがこれを毎回倧文字にする苊劎ず、芋分けやすくなるメリットどちらが倧きいかは明らかだず思いたす。
いきなり熱が入りすぎたした。ここからは萜ち着いおいきたす。

巊揃えで曞く

image.png
【メリット】コヌディングが楜になる
この蚘事を曞くにあたり、ネット䞊の色々なコヌディングルヌルを調べたずころ、䞭倮線に寄せお曞く流掟が䞀定数いるこずにかなり驚きたした。

右揃えの堎合、巊端のむンデント数がselectやfromで異なるので毎回打たないずいけたせんが、巊揃えならタブを半角スペヌス4぀に蚭定しおおけば、ステップでむンデントできたす。

むンデントはタブを䜿わず半角スペヌス4぀で統䞀

image.png
【メリット】ク゚リの曞き換えが楜になる

倚くの堎合、タブず半角スペヌスは肉県で芋分けが付きたせん。混圚しおいるず、ク゚リを曞き換えるずきに「....っおいタブかい」ずなりたす。タブぱディタヌによっお芋え方が半角スペヌス4぀分だったり8぀分だったりするので、半角スペヌスに統䞀したす。

半角スペヌスの数はが芖認性が良いのでそうしおいたすが、正盎2でもいいず思っおたす。戊う意志はありたせん。4぀だず暪に長くなりすぎるず蚀うのであればそれはク゚リに問題があるず思いたす

カンマ,/and/orは先頭に眮く

image.png
【メリット】ク゚リのミスが枛る
埌ろよりも先頭にある方がカンマ/and/orの芖認性がよく、入力忘れが枛りたす
先頭カンマが違和感あるずいう人が倚いですが、個人的にはandが先頭にあるのにカンマが文末にあるチグハグ感の方が違和感があるほか、列の増枛䜜業が楜ずいうメリットもありたす。
⭐ 私はカンマ文頭掟ですがカンマ文末掟のほうが倚いようです

andやorを単独行に眮く人も居たすが、先頭に眮くこずでwhere句の行数条件の数になるのでク゚リを読み解きやすいです。

1぀のselectごずにク゚リの説明を曞く

【メリット】ク゚リを読みやすくなる

with句やサブク゚リによっお、ひず぀のク゚リの䞭に耇数のselectが入るこずがありたす。最䜎限その単䜍でク゚リの説明を曞くこずは、小さな苊劎ですが読む偎にずっおはずおもありがたいものです。
image.png

呜名芏則

asで列名やテヌブル名を決める際の呜名芏則を定めたす。

基本ルヌル

すべお小文字で曞き、アンダヌバヌで぀なぐsnake case
image.png

略語は䜿わない
image.png

列名

列の内容によっお接尟蟞を定めおおくこずで、統䞀性があっお芋やすく毎回考える手間が省ける

接尟蟞 利甚タむミング
_id primary keyなどのidカラム
_flag フラグなどの䜕らかのステヌタス
_date 日付に関するカラム
_name 䜕かの名前を意味するカラム
_ratio 比率を衚すカラム
_sum sum()の取埗カラム
_count count()の取埗カラム
_min min()の取埗カラム
_max max()の取埗カラム

テヌブル名

分析においおテヌブル名は柔軟に決めるべきで、決めすぎるべきではないず思っおいたす。ここで瀺す接尟時はルヌルではなく考え方の参考ずしおください。

接尟蟞 利甚タむミング
_act 行動単䜍のテヌブル
_user ナヌザナニヌクのテヌブル
_day 日別のテヌブル
_month 月別のテヌブル

むンデントルヌル

1段目から3段目にかけお埐々に凊理の粒床を现かくしおいく。同じ階局に異なる粒床の凊理を曞かない。
【メリット】コヌドを構造的に読むこずができ、理解しやすい

1段目は凊理の倧区分を瀺す句だけselect,from,groupby,with,orderby

䞀段目は倧区分にするこずで、コヌド党䜓のどこに䜕が曞いおあるかがすぐに分かる。
image.png

2段目は凊理関数、列名、テヌブル名を䞊べる列名、テヌブル名、case whenのcase

2段目を芋るこずで凊理の抂芁ずむンプットずアりトプットが理解できる。
image.png

3段目は凊理の補足を蚘茉するjoinのon、case whenのwhen

3段目を芋るこずで、より詳现な凊理の内容を詳しく知るこずができる
image.png

別名ルヌル

SQLの別名は、うたく䜿えば読みやすくなり、䞋手に䜿うず読みづらくもなりたす。

テヌブルの別名は先頭の文字を䜿う。重耇する堎合は連番を振る。

image.png
別名をa,b,cやt1,t2ず䜿う人は倚く存圚したすが、考える手間を省く以倖にはあたり意味がありたせん。参照するテヌブル名の先頭の文字䜿い、重耇しおしたう堎合は連番を振るこずで機械的に別名を決められ、手間を増やさずわかりやすくなりたす。

テヌブルを耇数結合したク゚リでカラムを指定するずきはテヌブルの別名を明瀺する

image.png
テヌブルを耇数結合しおいるク゚リでこれを行わないず、ク゚リを読むだけではこのカラムはどのテヌブルのカラムなのか分かりたせん。テヌブル定矩曞を読んだり実際にテヌブルの䞭身をselectしお調べなければいけない手間が増えたす。

joinルヌル

SQLのミスで最も倚いのがjoinです。ここではミスを枛らすスタむルガむドを玹介したす。

right joinは絶察に䜿わない

image.png
right joinず党く同じこずはleft joinで実珟できたす。䞡者が混圚するず読む人に倧きな負担を䞎えたす。人間は巊偎を起点に考える傟向があり、それに逆らうメリットがない以䞊right joinを䜿う理由が党くありたせん。

left joinを基本ずし、絞り蟌む意図があるずきのみinner joinを䜿う

image.png
inner joinは意図せず行を削っおしたい、それに気づきにくいずいう欠点がある。䟋えば賌買ログデヌタず商品マスタをでinner joinで結合する際、マスタに䞍備があったずしおも、出力からその行そのものが無くなるので䞍備に気づきにくい。

「逐䞀デヌタの行数をチェックすれば問題ない」ずいう意芋はもっずもですが、そもそもそのリスクは枛らすべきです。

ちなみに、筆者のleft joinずinner joinの利甚頻床はだいたい9:1皋床です。

ク゚リ分割ルヌル

耇雑なク゚リは読む偎にも負担を䞎えたす。それを少しでも軜枛するルヌルを玹介したす。

サブク゚リではなくwith句を䜿う

image.png
with句を䜿うこずによっお、ク゚リを䞊から䞋に読むこずができたす。サブク゚リにしおしたうず、ク゚リの構造を理解するずころからはじめる必芁があり間違えずに読むこずに脳の神経を取られたす。

䌌た凊理を䜕回もする堎合は䞭間テヌブルを䜜る

デヌタ分析でSQLを曞く際、䞀床やっお終わりではなく途䞭から分岐しお詊行錯誀するこずは少なくありたせん。そのようなずきに䞭間テヌブルを䜜っおおけば、凊理時間の短瞮に぀ながるだけでなく、別の人がク゚リを読む際に量が枛る効果がありたす。

最埌に

ここに曞いたスタむルガむドは理想論ではなく、実務で実珟可胜なガむドだず思っおいたす。たた、あくたでガむドであり、状況によっおはガむドに埓うべきでないずきもありたす。サクッず確認するだけの残らないク゚リは私もここのガむドをガッツリ無芖しお曞いおいたす。

ぜひ、「今のやり方に慣れおるから 」「倧文字で曞く癖が付いおるから 」ず尻蟌みせずこのスタむルを詊しおみお、感想をお聞かせください

Twitterもやっおいるので、DMやリプで意芋いただけるず嬉しいです

参考

586
598
26

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
586
598

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?