LoginSignup
11
13

More than 5 years have passed since last update.

個人的にわかりやすいSQLの書き方

Last updated at Posted at 2014-12-30

最初は1行で書いていたんですが、内容が複雑になっていくにつれ煩雑になるので
どう書けば分かりやすいのかを自分なりにまとめてみます。


  • ひよっこなのでできる限り分かりやすいのが良い
  • インデントの幅は統一したい
  • 分かりやすいからといって、SQL一文でやたらと行数取るのはなんとなく嫌

…で、書き進めると以下のようになりました。

  • 予約語・関数などは大文字
  • 主に、それぞれの句で行を分ける
  • 各句の内容が長くなってきたら、インデントしつつ複数行にしてもOK
  • ANDやらORやらが増えて()が分かりにくくなったら、インデントしつつ複数行にしてもOK
てきとうなサンプル
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~が長い場合は、そこも改行しても良いかもしれません。

てきとうなサンプル(LEFT_JOIN複数行版)
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一文でやたらと行数取るのはなんとなく嫌

こことの兼ね合いが徐々に苦しくなっていますが、
個人的にはこの程度の区切り方が好みです。

11
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
13