SQL/コーディングスタイル

SQL/コーディングスタイル

フォーマットというか、コーディング規約というか、インデントというか・・・

SQLってメインでやるよりもちょこっとやるって感じの人のほうが多いからあんまりみなさま思い入れがないせいで様々なスタイルが・・・ぐちゃぐちゃになっている

俺流メモ

今のところこんな感じがわかりやすくかつ読みやすいのではないのかと。 コレに近い SQLスタイルガイド - Qiita, 分析SQLのコーディングスタイル - クックパッド開発者ブログ カッコ位置に関しては再考の余地あり。

後からの見たときの視認性、後から編集するときの容易性、を重視しているつもり。

結果として行数がかなり増える記述となるが、通常のプログラミングに比べれば全然少ないので特に問題無いと考えている

  • 全般
    • すべてのフィールド指定でテーブル名を省略しない
    • インデントは4スペース
    • 予約語関数は大文字表記
  • SELECT句
    • SEELCT キーワードは独立させてこの行にはそれ以外書かない
    • SQL 全体が非常に短い場合は1行に書くこともアリ。ケースバイケース。
    • カラム指定は一段インデントする
    • カラム指定は1カラム毎全部折る
    • コンマは行末
  • FROM句
    • FROM キーワードは独立させてこの行にはそれ以外書かない
    • テーブル指定は1段インデント(4 space)する
    • 副問合せでさらに SELECT が続く場合
      • FROM 句の次の行にさらにインデントして開始括弧をつける
      • SELECT を開始括弧に対してさらに1段インデント(FROMから見ると2段)して書く
      • 閉じ括弧は開始括弧と同一レベルのインデントに書き、その同一行に別名記述を行う
  • JOIN ON句
    • 結合は基本的に JOIN ON を用いて FROM に複数 + WHERE 句で結合条件という記述をしない
    • 結合対象の FROM 句と同一インデントレベルで始める(これは下げてもよい気もする)
    • JOIN キーワードは独立させてこの行にはそれ以外書かない
    • LEFT JOIN を用いて RIGHT JOIN は使わない
    • INNER JOIN は INNER JOIN と記述する
    • テーブル指定は1段インデントする
    • ON キーワードは独立させてこの行にはそれ以外書かない
    • ON キーワードは JOIN に対して一段インデントする
    • 結合条件は ON に対してさらに一段インデントする
    • 副問合せの記述は FROM 句と同様
  • WHERE 句
    • 条件指定は一段インデントする
    • AND OR キーワードは独立させてこの行にはそれ以外書かない
    • 括弧があった場合中をさらに一段インデントする。括弧閉じで戻る
    • 括弧は独立させてこの行にはそれ以外書かない
  • CASE
    • CASE は View のために行うことが多くそれはデータの本質でなくアプリで頑張ればよいというスタンスなのでそもそもあまり書かない
  • ORDER BY
    • ORDER BY キーワードは独立させてこの行にはそれ以外書かない
    • カラム指定は1カラム毎全部折る
    • 明示的に ASC DESC を全カラムに書く

この条件を加味するとこのようになる。

SELECT
    hogehoge.id AS hoge,
    hogehoge.name AS piyo,
    piyopiyo.age AS fuga
FROM
    hogehoge
LEFT JOIN
    piyopiyo
    ON
        hogehoge.id = piyopiiyo.id
LEFT JOIN
    (
        SELECT
            fugafuga.id
        FROM
            fugafuga
        WHERE
            fugafuga.name = 'tanaka'
    ) AS f
    ON
        hogehoge.id = f.id
WHERE
    hogehoge.name = 'Yamada'
    AND
    (
        piyopiyo.name = 'ya'
        OR
        piyopiyo.name = 'ma'
        OR
        piyopiyo.name = 'da'
    )
    AND
    piyopiyo.age > 10
GROUP BY
    hogehoge.address,
    piyopiyo.mail
HAVING
    hogehoge.address = 'tokyo'
ORDER BY
    hogehoge.id ASC,
    piyopiyo.age DESC

様々な流派

縦穴式住居人式

各句のキーワードのケツとパラメータの頭を揃えるスタイル。キーワード右揃えスタイルとも言うか。 古いタイプのプログラマに多い感じ。

結構昔から一定人数意味不明に存在している。結果的にスペースの位置がまっすぐ下までズボっと揃う縦穴スタイルになる。 英語ではこの間を水が流れるようなので「リバー」と言うらしい。

書きにくいし読みにくいのになぜ支持されているか不明なスタイル。 単なる思考停止の惰性と思われる。

非常に短い単純な SQL がなんとなく綺麗に書ける以外にメリットが無いので今後は廃れていくだろう。

SELECT *
  FROM hoge AS a
 WHERE a.id = 1
   AND a.name = "あああ"

問題として

  • 短く単純な SQL の場合は、見た目は美しいが頭から書いていって一発で全部揃えるのが難しい
  • LEFT JOIN 等のSELECTよりも長い文字の句が入ると初っ端のSELECTから整形しないといけないので面倒
  • 副問い合わせが混じってくると結局見た目がガッタガタになってに醜い

SQLスタイルガイド · SQL style guide by Simon Holywell ここにもちゃんとしたスタイルとして乗っている

百歩譲って各句で揃えるのはわかるが AND とかが左側に来るのはそれはいいの?

挙げ句の果てには、BY だけが右側に飛び出るとか、何を考えているのか?理由はキーワードにスペースが入っているからのみ。

SELECT *
  FROM hoge AS a
 WHERE a.id = 1
   AND a.name = "あああ"
 GROUP BY a.age

「何がリバーだ、右揃えだ、読みやすい?、このクソばか野郎!あいつら死ね! あいつらが死んだら俺が墓に糞ぶっかけてやる!」

セクション流独立派

各句をセクションとして分断し、そのパラメータをインデントして列挙していく流派

SELECT
    id, name
FROM
    hoge AS a
WHERE
    a.id = 1 AND a.name = "あああ"

セクション流同一派

独立派と同じように句ごとで分けるのだが、句と最初のパラメータを同一行に書く流派。

SELECT id,
       name
FROM hoge AS a
WHERE a.id = 1 AND
      a.name = "あああ"

パラメータの開始位置がガタガタするのであまりすきじゃないな

細かい

大文字小文字のゆらぎ

コンマ前インデント揃え流

このように前に書くけど、インデントのレベルは他と揃える派。

SELECT
    hogehoge.id AS hoge
    , hogehoge.name AS piyo
    , piyopiyo.age AS fuga
FROM
    hogehoge

コンマ前穴ぼこ流

縦穴式住居に済む右揃え人に多いやり方で このように前に書くけど、コンマがキーワード側に行く派

SELECT hogehoge.id AS hoge
     , hogehoge.name AS piyo
     , piyopiyo.age AS fuga
  FROM hogehoge

少ないインデントで書けるもんこじらせ派

穴ぼこ流の人間が、インデントが深くなるから使えないに反論する記述

SELECT hogehoge.id AS hoge
     , hogehoge.name AS piyo
     , piyopiyo.age AS fuga
  FROM hogehoge
  LEFT JOIN piyopiyo
    ON hogehoge.id = piyopiyo.id

キーワードの1単語分だけ揃えるという・・・馬鹿だと思うが結構やるやつが居るから困る。

タグ

db/sql/coding_style.txt · 最終更新: 2021-08-03 19:13 by ore