*

[SQL]読みづらいSQLとさらば! SQLのインデントと改行のタイミング

公開日: : 最終更新日:2015/02/23 SQL

SQLってインデントやら改行の仕方がプログラムと違うんです。
ここら辺を適当に書かれると非常にSQLは読みづらい。

例えばこんな感じのSQLです。

select a.id, a.name, a.created, b.id, b.name from foo as a ( left join bar as b on a.bar_id = b.id ) where a.name = 'wannabe' order by a.created 

これを見て、
fooのbar_idとbarのidで結合したテーブルに名前で検索を掛けて、作成日順に並び替えている、などの情報がぱっとで読み取れる人はいるんでしょうか。

少なくとも私は、そう質問されたら、「読みづらい」と一言目に返すと思います。

たったこれだけのSQLでも読むのに辟易します。

さて、では綺麗にインデントなどの整形をしましょう。

SELECT
  foo.id,
  foo.name,
  foo.created,
  bar.id,
  bar.name
FROM
  foo as foo(
  LEFT JOIN bar as bar
    ON foo.bar_id = bar.id
  )
WHERE
  foo.name = 'wannabe'
ORDER BY
  foo.created  

いつもの書き方はこんな感じです。

解説

フィールド表記

SELECT
  foo.id,
  foo.name,
  foo.created,
  bar.id,
  bar.name

selectをするときは、改行を使うことで、どのフィールドを利用しているかが読みやすくなります。
追加をすることを考えると前カンマもありです。

SELECT
  foo.id
  ,foo.name
  ,foo.created
  ,bar.id
  ,bar.name

前カンマの場合、最初のフィールドの字下げを一つ余計にするか、次のフィールドの字下げを一つ減らさないと綺麗に並ばないので、私は後ろカンマを使っています。

大文字小文字でメリハリを

同じSQLでも大文字小文字を使った場合と使わなかった場合ではだいぶ印象が違います。

select
  foo.id,
  foo.name,
  foo.created,
  bar.id,
  bar.name
from
  foo as foo(
  left join bar as bar
    on foo.bar_id = bar.id
  )
where
  foo.name = 'wannabe'
order by
  foo.created  

小文字だけ(または大文字だけ)だと少し見づらい場合があります。
テーブルが小文字であれば、命令は大文字を、テーブルが大文字であれば命令は小文字を使うようにすると読みやすいSQLになるでしょう。

テーブルの別称は記号にしない

a.name と言われてどのテーブルのnameなのかわかりますか。
a.name, b.name, c,nameと並ぶSQLを見て怒りを覚えませんか。
やめましょう。

fooをそのまま使える場合とas fooしないと使えないDBの場合があるので、as fooになっています。
別に同じじゃなくてもいいです。わかりやすいテーブル名にしてください。

インデント幅

なぜかSQLのときは2文字のブランクです。
IDEとかでも2文字のインデントが多いみたい。
なんでなんでしょう。

こんなところでしょうか。

実際のところ、適切なところでの改行と字下げだけしてくれればかなり読みやすくなります。

ad

関連記事

logo

[SQL, DB2]FETCH FIRSTで指定した行数データを取得する(営業日計算)

営業日計算 営業日を計算するのは結構面倒です。 特に独自のテーブルだと非常に厄介です。 例

記事を読む

wannabenote

[Oracle, SQLDeveloper]Oracleの構築とSQLDeveloperを設定、GUIでテーブルを表示するまで

Oracleを使い込む必要が出来たので、その備忘録です。 とりあえずはインストールから環境構築して

記事を読む

ad

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑