In my last job, we worked on a very database-heavy application, and I developed some formatting standards so that we would all write SQL with a common layout. We also developed coding standards, but these are more platform-specific so I'll not go into them here.
I'm interested to know what other people use for SQL formatting standards. Unlike most other coding environments, I haven't found much of a consensus online for them.
To cover the main query types:
select
ST.ColumnName1,
JT.ColumnName2,
SJT.ColumnName3
from
SourceTable ST
inner join JoinTable JT
on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
on ST.SourceTableID = SJT.SourceTableID
and JT.Column3 = SJT.Column4
where
ST.SourceTableID = X
and JT.ColumnName3 = Y
There was some disagreement about line feeds after select
, from
and where
. The intention on the select line is to allow other operators such as "top X" without altering the layout. Following on from that, simply keeping a consistent line feed after the key query elements seemed to result in a good level of readability.
Dropping the linefeed after the from
and where
would be an understandable revision. However, in queries such as the update
below, we see that the line feed after the where
gives us good column alignment. Similarly, a linefeed after group by
or order by
keeps our column layouts clear and easy to read.
update
TargetTable
set
ColumnName1 = @value,
ColumnName2 = @value2
where
Condition1 = @test
Finally, an insert
:
insert into TargetTable (
ColumnName1,
ColumnName2,
ColumnName3
) values (
@value1,
@value2,
@value3
)
For the most part, these don't deviate that far from the way MS SQL Server Managements Studio / query analyser write out SQL, however they do differ.
I look forward to seeing whether there is any consensus in the Stack Overflow community on this topic. I'm constantly amazed how many developers can follow standard formatting for other languages and suddenly go so random when hitting SQL.
Late answer, but hopefully useful.
My experience working as part of the larger development team is that you can go ahead and define any standards you like, but the problem is actually enforcing these or making it very easy for developers to implement.
As developers we sometimes create something that works and then say “I’ll format it later”, but that later never comes.
Initially, we used SQL Prompt (it was great) for this, but then switched to ApexSQL Refactor, because it’s a free tool.
Uses much more lines than a lot of the examples here, but I feel it's a lot easier to understand, enables quick removal of columns/clauses/tables. It helps to take advantage of a vertically-oriented monitor.
I'm late to the party, but I'll just add my preferred formatting style, which I must've learned from books and manuals: it's compact. Here's the sample
SELECT
statement:In short: 8-space indentation, keywords in caps (although SO colours them better when in lowercase), no camelcase (pointless on Oracle), and line wraps when needed.
The
UPDATE
:And the
INSERT
:Now, let me be the first to admit that this style has it's problems. The 8-space indent means that
ORDER BY
andGROUP BY
either misalign the indent, or split the wordBY
off by itself. It would also be more natural to indent the entire predicate of theWHERE
clause, but I usually align followingAND
andOR
operators at the left margin. Indenting after wrappedINNER JOIN
lines is also somewhat arbitrary.But for whatever reason, I still find it easier to read than the alternatives.
I'll finish with one of my more complex creations of late using this formatting style. Pretty much everything you'd encounter in a
SELECT
statement shows up in this one. (It's also been altered to disguise its origins, and I may have introduced errors in so doing.)This abomination calculates whether a student is full-time or part-time in a given term. Regardless of the style, this one's hard to read.
Nice. As a Python programmer, here are my preferences:
Newlines after
select
,from
andwhere
only when it is needed for readability.When code can be more compact and equally readable, I usually prefer the more compact form. Being able to fit more code in one screenful improves productivity.
Ultimately, this will be a judgment call that will be made during code review.
For
insert
, I would place the parenthesis differently:The reasoning for this formatting is that if SQL used indentation for block structure (like Python), the parenthesis would not be needed. So, if indentation is used anyway, then parenthesis should have the minimum effect on the layout. This is achieved by placing them at the end of the lines.
I agree whole heartily with your effort to standardize SQL formatting within your project and in general.
I also very much agree with your formatting choices. I have come up with nearly the same one, save I also indent the 'join' statements, and with them the 'on' statements one more indent.
Very much like the fact that you go for lower case on keywords - Who want's those SHOUTED OUT at you. I also prefer to lower case table aliases - makes for better readability
Very much like the fact that you use small indentation (4). I go with (3).
I nix the terms 'inner' and 'outer' as then are unnecessary.
Here is how would have formatted your select statement:
Thanks for discussing this.
This is my personal SQL style guide. It is based on a couple of others, but has a few main stylistic features - lowercase keywords, no extraneous keywords (e.g.
outer
,inner
,asc
), and a "river".Example SQL looks like this: