Spell keywords in ALL CAPS
No
select * from foo where x = 17;
Yes
SELECT * FROM foo WHERE x = 17;
Place each "clause" of a query or statement on its own line
No
SELECT * FROM foo JOIN bar ON y = z WHERE x = 17 AND y = 'hello' GROUP BY z HAVING count(*) > 0 ORDER BY y LIMIT 10;
Yes
SELECT *
FROM foo
JOIN bar ON y = z
WHERE x = 17
AND y = 'hello'
GROUP BY z
HAVING count(*) > 0
ORDER BY y
LIMIT 10;
Place spaces around =, ,, and other operators (e.g., <, >, <=, >=, !=) for better readability
No
SELECT a.title,a.year,a.producer
FROM albums AS a
WHERE a.title='Unorthodox Jukebox'
OR a.title='Doo-Wops & Hooligans';
Yes
SELECT a.title, a.year, a.producer
FROM albums AS a
WHERE a.title = 'Unorthodox Jukebox'
OR a.title = 'Doo-Wops & Hooligans';
Optional: Line up last character of all keywords at the beginning of the line.
Perhaps not
SELECT a.title, a.year, a.producer
FROM albums AS a
WHERE a.title = 'Unorthodox Jukebox'
OR a.title = 'Doo-Wops & Hooligans';
Perhaps better
SELECT a.title, a.year, a.producer
FROM albums AS a
WHERE a.title = 'Unorthodox Jukebox'
OR a.title = 'Doo-Wops & Hooligans';
Use snake case for naming variables. Opt for concise and meaningful names, while avoiding reserved keywords.
No
CREATE TABLE Course (
CourseID INT PRIMARY KEY,
NumberOfStudentsEnrolledInThisClass INT,
BuildingLocation TEXT,
MaximumNumberOfStudentCapacity INT
);
Yes
CREATE TABLE Course (
id INT PRIMARY KEY,
num_students INT,
building TEXT,
capacity INT
);
Do not use subqueries in the FROM clause. Instead, use WITH. (Subqueries
outside of the FROM clause are fine though.)
No
SELECT *
FROM (
SELECT foo, count(*) AS bar
FROM baz
GROUP BY foo
) ahh, quux
WHERE ahh.foo = quux.foo
Yes
WITH yay AS (
SELECT foo, count(*) AS bar
FROM baz
GROUP BY foo
)
SELECT *
FROM yay, quux
WHERE yay.foo = quux.foo
A more detailed and opinionated style guide can be found at
sqlstyle.guide.
VSCode extensions such as Prettier
SQL
or SQL
Formatter
act as great starting points. Similarly, there are websites such as
Poor SQL and SQL
format.