個人的にわかりやすいSQLの書き方
最初は1行で書いていたんですが、内容が複雑になっていくにつれ煩雑になるので
どう書けば分かりやすいのかを自分なりにまとめてみます。
- ひよっこなのでできる限り分かりやすいのが良い
- インデントの幅は統一したい
- 分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌
…で、書き進めると以下のようになりました。
- 予約語・関数などは大文字
- 主に、それぞれの句で行を分ける
- 各句の内容が長くなってきたら、インデントしつつ複数行にしてもOK
- ANDやらORやらが増えて()が分かりにくくなったら、インデントしつつ複数行にしてもOK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT b.value FROM table_a AS a INNER JOIN table_b AS b ON b.value = a.value1 LEFT JOIN table_c AS c ON c.value1 = 'hoge1' AND c.value2 = 'hoge2' AND c.value3 = 0 AND c.value4 = b.value LEFT JOIN table_d AS d ON d.value1 = 'hoge1' AND d.value2 = 'hoge2' AND d.value3 = 0 AND d.value4 = b.value WHERE a.value2 = 'hogehoge' AND b.status = 1 AND ( (c.date IS NULL AND ADDDATE(d.date, INTERVAL 86399 SECOND) > NOW()) OR (c.date IS NULL AND d.date IS NULL) OR ADDDATE(c.date, INTERVAL 86399 SECOND) > NOW() ) LIMIT 10; |
上記のようにLEFT JOIN~が長い場合は、そこも改行しても良いかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT b.value FROM table_a AS a INNER JOIN table_b AS b ON b.value = a.value1 LEFT JOIN table_c AS c ON c.value1 = 'hoge1' AND c.value2 = 'hoge2' AND c.value3 = 0 AND c.value4 = b.value LEFT JOIN table_d AS d ON d.value1 = 'hoge1' AND d.value2 = 'hoge2' AND d.value3 = 0 AND d.value4 = b.value WHERE a.value2 = 'hogehoge' AND b.status = 1 AND ( (c.date IS NULL AND ADDDATE(d.date, INTERVAL 86399 SECOND) > NOW()) OR (c.date IS NULL AND d.date IS NULL) OR ADDDATE(c.date, INTERVAL 86399 SECOND) > NOW() ) LIMIT 10; |
分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌
こことの兼ね合いが徐々に苦しくなっていますが、
個人的にはこの程度の区切り方が好みです。