DEV Community

Snappy Tools
Snappy Tools

Posted on

SQL Formatting Is Not Optional: Here's Why and How

Unformatted SQL is a time sink. You spend more time parsing what a query does than understanding whether it's correct. Here's why consistent SQL formatting matters and how to do it without friction.

The Problem With Unformatted SQL

This is real SQL pulled from production code:

SELECT u.id,u.name,o.total,p.name as product FROM users u JOIN orders o ON u.id=o.user_id JOIN order_items oi ON o.id=oi.order_id JOIN products p ON oi.product_id=p.id WHERE u.created_at>'2025-01-01' AND o.status='completed' ORDER BY o.total DESC LIMIT 50
Enter fullscreen mode Exit fullscreen mode

Questions you can't answer at a glance:

  • How many tables are joined?
  • What's the filtering condition?
  • What are we ordering by?

Formatted:

SELECT
  u.id,
  u.name,
  o.total,
  p.name AS product
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE
  u.created_at > '2025-01-01'
  AND o.status = 'completed'
ORDER BY o.total DESC
LIMIT 50;
Enter fullscreen mode Exit fullscreen mode

Now you can see the structure immediately: 4 tables, 2 filters, ordering by order total, capped at 50 rows.

Why SQL Formatting Gets Ignored

  1. ORMs hide it. Developers using ActiveRecord, SQLAlchemy, or Hibernate rarely write raw SQL. When they do, it's usually urgent.

  2. One-off queries. SQL in a REPL feels temporary. No one formats throwaway code.

  3. Copy-paste from StackOverflow. The query works; cleaning it up feels unnecessary.

  4. No enforced linter. Most CI pipelines check Python, JavaScript, and CSS formatting. SQL rarely has a linter in the chain.

Formatting Rules That Actually Matter

These 5 rules cover 90% of cases:

1. One clause per line

-- Wrong
SELECT id, name FROM users WHERE active = 1 ORDER BY name;

-- Right
SELECT id, name
FROM users
WHERE active = 1
ORDER BY name;
Enter fullscreen mode Exit fullscreen mode

2. Indent ON conditions

JOIN orders o
  ON u.id = o.user_id
Enter fullscreen mode Exit fullscreen mode

3. Uppercase reserved words

-- Wrong
select * from users where id = 1

-- Right
SELECT * FROM users WHERE id = 1
Enter fullscreen mode Exit fullscreen mode

4. One column per line for wide SELECTs

-- Readable
SELECT
  first_name,
  last_name,
  email,
  created_at
FROM users;
Enter fullscreen mode Exit fullscreen mode

5. Align WHERE conditions

WHERE
  status = 'active'
  AND created_at > NOW() - INTERVAL 30 DAY
  AND role IN ('admin', 'editor')
Enter fullscreen mode Exit fullscreen mode

SQL in Code: Formatting Within String Literals

When SQL lives inside application code, the formatting challenge is harder. Some approaches:

Python (multi-line strings)

query = """
    SELECT
        u.id,
        u.email,
        COUNT(o.id) AS order_count
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.status = 'active'
    GROUP BY u.id, u.email
    HAVING COUNT(o.id) > 0
    ORDER BY order_count DESC
"""
Enter fullscreen mode Exit fullscreen mode

JavaScript (template literals)

const query = `
  SELECT
    user_id,
    SUM(amount) AS total
  FROM transactions
  WHERE created_at >= $1
  GROUP BY user_id
  ORDER BY total DESC
  LIMIT $2
`;
Enter fullscreen mode Exit fullscreen mode

Stored procedures: Keep the SQL in .sql files and import them. Much easier to format, review, and diff than inline strings.

Formatting Dialects

Not all SQL is the same. MySQL, PostgreSQL, SQLite, SQL Server, and Oracle each have dialect differences:

Feature MySQL PostgreSQL SQL Server
String quoting 'string' or "string" 'string' 'string'
Identifier quoting `name` "name" [name]
Limit syntax LIMIT 10 LIMIT 10 TOP 10 or FETCH FIRST
Boolean TINYINT(1) BOOLEAN BIT

A formatter that understands dialects will handle these correctly rather than applying a one-size-fits-all style.

When to Minify SQL

Minified SQL (no whitespace) saves a tiny amount of bandwidth in query strings, but the difference is negligible for most applications. Only minify when:

  • Embedding SQL in environment variables or config files where whitespace causes parsing issues
  • Logging queries to a monitoring service with character limits
  • Debugging by comparing two query strings character-by-character

For formatting SQL in the browser — supporting MySQL, PostgreSQL, SQL Server, SQLite, and Spark dialects, with both beautify and minify modes — try the SQL Formatter & Beautifier on SnappyTools. Paste your query, pick your dialect, and get clean formatted output in one click. No signup required.

Top comments (0)