見やすい、読みやすいSQL

こんにちは!
ブランドオフィシャル」というサービスを開発するチームに所属している2年目エンジニアのsasaharayです!!アイスタイルAdvent Calender2020の12/12投稿を担当させていただきます😄

去年のアドカレは、1年目で学んだ「社会人に本当に必要なもの」について書かせていただきました。
この記事を書いてから1年、入社してもう少しで2年、、、あっという間ですね…

そんな私はこの一年、抽出業務を担うことが多かったので、先輩方のアドバイスやレビューをもとに、今回の記事は読みやすいSQLについて書きます😃🙌
人によって、読みやすい読みにくいは分かれるかもしれませんが…「SQLがきれいに書けない」「SQLのレビューがいつも大変」「修正箇所がすぐにわからない」など困っている方に少しでも届けばよいなと思います😂
(※この記事ではエイリアス指定しています)

SQLとは

SQLとは、データベースを操作するための言語です。データベースにデータを挿入したり、変更したり、欲しいデータを検索して抽出したりすることができます。

見やすく、読みやすいSQLとは

そもそも読みやすいSQLの定義を考えましょう。

  • 大文字、小文字に規則がある
  • 改行や空白が統一されている
  • 命名規則にルールがある

上記の点を気を付けるだけで、

  • 可読性が高まる
  • 修正箇所の発見が容易になる
  • 細かなミスが少なくなる

のようなメリットを生むことができます!
また、スタイルがルール化されると、他の人が書いたSQLも読みやすくなりレビューしやすくなる、つまり保守・運用がしやすくなります。

では、実際に紹介していきたいと思います🙂
今回は、以下の悪い例のクエリを見やすく読みやすくしていきたいと思います!

悪い例(見にくい、読みにくいクエリの例)

select c.name, count(b.id) as a from users as b
inner join jobs as c on c.id=b.id
group by c.id order by c.id

今回の例の(連想していた)テーブル

usersテーブル
id job_id last_name first_name age
1 1 ono kensho 31
2 2 hashimoto kanna 21
3 3 kano eiko 38
4 3 degawa tetsuro 56
5 2 aragaki yui 32
jobsテーブル
id job_name
1 声優
2 女優
3 芸人

予約語は大文字にする

予約語とは、SELECTやINSERT、ORDERやGROUPなどのことです。予約語を大文字にすることで、テーブル名やカラム名との区別がつきやすくなります👌

-- 予約語を大文字にする
SELECT c.name, COUNT(b.id) AS a FROM users AS b
INNER JOIN jobs AS c ON c.id=b.id
GROUP BY c.id ORDER BY c.id

カラムごとに改行する

SELTCT文でたくさんカラムを抽出する場合、悪い例のように一列に並べて書いてしまうと、とても見にくいと思います。ですが、カラムごとに改行することでとても見やすくなります。また、ASがどのカラムに対してかかっているのかがわかりやすくなります。

-- カラムごとに改行する
SELECT 
c.name, 
COUNT(b.id) AS a FROM users AS b
INNER JOIN jobs AS c ON c.id=b.id
GROUP BY c.id ORDER BY c.id

予約語は改行する

今回の場合、SELECT/FROM/INNER JOIN/ON/GROUP BY/ORDER BYで改行すると以下のようになります。
さらに字下げをすると、だいぶ読みやすくなりましたね👌

-- 予約語は改行して、インデントする
SELECT
  c.name,
  COUNT(b.id) AS a
FROM users AS b
  INNER JOIN jobs AS c
    ON c.id=b.id
GROUP BY c.id
ORDER BY c.id

JOIN句は字下げして、ONはさらに字下げをしてあげるともっと良いかと思います🙆

演算子の前後は空白を入れる

ここが意外と大切で、演算子の前後に空白を入れるとかなり見やすくなります。

-- 予約語は改行して、インデントする
SELECT
  c.name,
  COUNT(b.id) AS a
FROM users AS b
  INNER JOIN jobs AS c
    ON c.id = b.id
GROUP BY c.id
ORDER BY c.id

INNER JOINのON句の部分を変更してみました。
悪い例では結構詰まっていて見にくかったかと思いますが、、、、こちらだとどうでしょう?

命名規則の統一

最後は、命名規則です。ASの後に別の名前をつけることができます。これが一番大事だと思っています。
例はまだ短いクエリですが、これが長いクエリとなった場合どうでしょうか。また、結果を表示させた場合今の状態ですと、カウントしたものがaというカラム名で表示されてしまいます。何を表している結果なのかわかりませんよね…
このように適当に名前をつけては、わかりにくいことこの上ないのです😱
ですので以下のようにしてみます。

--命名規則の統一
SELECT
  j.name,
  COUNT(u.id) AS jobs_count
FROM users AS u
  INNER JOIN jobs AS j
    ON j.id = u.id
GROUP BY j.id
ORDER BY j.id

これで見やすく読みやすいクエリができました!!
悪い例から比べると読みやすさが全く違うと思います。

おまけ

何気なくつけていたものですが‥‥SQLに限らずコードを書く際は、”コメント”をつけてあげましょう!どんなクエリを書いているのか明示してあげることは、相手へのやさしさです。

まとめ

今回は、見やすく読みやすいSQLについて書かせていただきました。小さなことでも、見やすさを工夫することでこれだけの違いが出ます。
見やすく読みやすいコードを書くことは、自分だけでなくレビューする人、保守する人、学ぶ人、、、たくさんの人を幸せにします!
ぜひこの記事がたくさんの人に届きますように…

2年目です。趣味は、ボードゲームと麻雀です!好きな人は、声優の小野賢章さんという方で世界で一番愛しています。