私が思う「美しいSQL」の条件

公開:2020/09/20
更新:2020/09/22
4 min読了の目安(約2400字IDEAアイデア記事
Likes11

はじめに

コーディングには、大きく2つの楽しみがあると感じます。
1つは「物を作り上げる楽しみ」、そしてもう1つは「美しさを探究する楽しみ」です。

どう書けば美しいのか? 読みやすいのか?

初心者の頃から、プログラマーとなり何年経っても、この探究は終わりません。

私が思う「美しいSQL」の条件

好きなSQL

今の私は、こんなSQLが好きです。

SELECT staff.staffcd       AS '社員CD',
       staff.name         AS '社員名',
       trwork.startingtime AS '始業日時',
       trwork.endingtime   AS '終業時間' 
   FROM msstaff staff
   JOIN trworkinglog trwork ON staff.staffcd = trwork.staffcd
  WHERE staff.code = 100
ORDER BY staff.code,
        trwork.staringtime

(みなさまのブラウザでも綺麗に表示されていることを祈ります)

「私が思う美しいSQLの条件」を主観に基づいてまとめます。

1. 綺麗なインデント

「インデント」とは、行頭にタブや空白を入れて先頭文字を揃え、コードを読みやすくする行為です。後から読む自分のため、引き継いでくれる次の誰かのため、人間が見やすい配置にします。

さて。
では、タブを入れるのか?スペースか?何文字分か?

私は「SQLならスペース、その他プログラミングならタブ」です。

SQLは行頭よりも、各句の項目名を揃えた方が美しいからです。タブでは行頭が揃ってしまうため、スペースで項目名を揃えます。

インデントはタブか、スペースか。
様々な宗派があり、この論争が決着することはないでしょう。

コーディングはインデントに始まり、インデントに終わるのかもしれません。

2. 予約語はすべて大文字、項目名はすべて小文字

「予約語」とは、SELECTやWHEREなど、SQL内で意味を持つ命令文です。
私は、予約語はすべて大文字が好きです。

ツールによっては逆(予約語が小文字、項目名が大文字)を推奨しているものもあるようですが、予約語が大文字の方が読みやすいように感じます。

3. JOIN句に結合条件を書き、Where句の抽出条件と区別する

JOIN句で、複数の表を結合することができます。

JOIN…ONに結合条件を書き、どの項目で2つの表を関連付けしているのか明確にします。
WHERE句には、データを絞り込むための抽出条件を書き、それぞれの役割を区別します。

4. テーブルには「コンパクトで意味を持つ別名」をつける

テーブル名の後ろにスペースを開けて、別名をつけることができます。

テーブル名はSQLの中に頻繁に登場するので、別名をつければSQL自体もコンパクトにまとまります。(コンパクトと言っても、「a, b, c」のような意味のない別名はいけません。SQLを再利用することが難しくなってしまいます。)

5. Where句は、インデックスを使うように記述する

データベースには、インデックス(索引)という仕組みがあり、索引で検索すれば速く抽出できます。

美しさだけではなく、速さの問題です。

フルスキャンするSQLに数分待たされ…。適切にインデックスを使うように直した途端、数秒で終わるSQLになる!なんていうのは、よく見る風景でしょう。

6. UNION句やDISTINCT句は、多用しない

UNION句は、2つのSQLをまとめて実行できる命令、
DISTINCT句は、結果から重複行を取り除いてくれる命令です。

開発者が使うツールや調べごとの範囲では自由に使って良いと思いますが、製品に組み込むSQLには多用するべきではないと思います。

UNION句やDISTINCT句を多用せねばならないような製品は、テーブル設計の時点で何かが間違っている可能性があります。

SQLが美しくあるためには、その土台であるテーブル設計にも美しさが必要だと思います。

7. ローマ字よりも簡単な英単語を選ぶ

ローマ字で命名したテーブルや変数は好きではありません。表記が揺れやすいからです。

あなたは「社員コード」をローマ字でどう書きますか?

…syainkodo? …shaincode? …shainncd?

シンプルに「staffcd」なら、平和ではないでしょうか。
私は英語が得意ではありませんが、コーディングでよく使う英単語なら覚えられるものです。

8. カンマ , は行末が好き

SELECT句やORDER句には、複数の項目をカンマで区切ります。1行1項目でインデントすることが一般的です。

この時のカンマの位置は、行頭か。行末か。
これも宗派が分かれるかと思いますが、私は行末派です。

行頭の方がメンテナンス性が高いだろうことはわかります。
しかし、日本語の句読点を行頭には打たないように、SQLのカンマも行末に置きたいものです。

さいごに

私の主観に満ちた意見を読んでいただき、ありがとうございます。

夏は夜。
月のころはさらなり、闇もなほ、
ほたるの多く飛びちがひたる。
また、ただ一つ二つなど、
ほのかにうち光りて行くもをかし。