# SQL formatting > One shortcut reflows the statement, or just the lines you've selected, in the mode and keyword case you choose. Source: https://docs.querylab.io/writing-sql/sql-formatting/ **before** ```sql select u.user_id,u.country,count(*) as total from `ace-analytics.warehouse.users` u join `ace-analytics.warehouse.events` e on u.user_id=e.user_id where u.is_active=true and e.event_date>='2024-01-01' group by u.user_id,u.country order by total desc limit 100 ``` **after Format (Pretty, defaults)** ```sql SELECT u.user_id, u.country, count(*) AS total FROM `ace-analytics.warehouse.users` u JOIN `ace-analytics.warehouse.events` e ON u.user_id = e.user_id WHERE u.is_active = true AND e.event_date >= '2024-01-01' GROUP BY u.user_id, u.country ORDER BY total DESC LIMIT 100 ``` ## Formatting a query - Press `⇧ ⌘ F` (`Ctrl Shift F` on Windows and Linux). - Open the ⋮ menu at the top right of the editor and choose **Format**. The same command is **Format SQL** in the command palette and the right-click menu. **editor ⋮ menu** Formatting is one undo step: `⌘ Z` puts the original back. The cursor stays where it was. If the SQL is invalid, nothing changes. ### Formatting only a selection Select part of the statement and press the same shortcut: only the selection is reformatted, the rest is untouched. ```sql WITH active AS ( «hl:select * from `ace-analytics.warehouse.users` where is_active=true» ), recent AS ( SELECT * FROM `ace-analytics.warehouse.events` ) SELECT * FROM active ``` becomes ```sql WITH active AS ( SELECT * FROM `ace-analytics.warehouse.users` WHERE is_active = true ), recent AS ( SELECT * FROM `ace-analytics.warehouse.events` ) SELECT * FROM active ``` ### Changing keyword case only The two _Convert keywords to …_ items in the ⋮ menu change keyword case without touching layout. Shortcuts: `⇧ ⌘ U` for UPPERCASE, `⌥ ⌘ L` for lowercase. Function names are left as written either way: `count(*)` stays `count(*)`. ## Choosing a formatting mode Settings → Editor → SQL Formatting → Formatting Mode. | Mode | Result | | -------------------- | --------------------------------------------------------------------------------- | | **Pretty** (default) | One clause per line, lists indented (the example at the top) | | **Compact** | Single line, minimal whitespace; for logs and chat | | **Preserve** | Keeps your layout; only the options below (keyword case, quoting, AS) are applied | **Compact** ```sql SELECT u.user_id,u.country,count(*) AS total FROM `ace-analytics.warehouse.users` u JOIN `ace-analytics.warehouse.events` e ON u.user_id=e.user_id WHERE u.is_active = true AND e.event_date >= '2024-01-01' GROUP BY u.user_id,u.country ORDER BY total DESC LIMIT 100 ``` ## Tuning the output All in Settings → Editor → SQL Formatting.