Skip to content

SQL editor

The main window: schema tree, SQL editor and results grid

Running SQL

What you want How
Run the whole tab Ctrl+Enter or F5
Run just the statement the cursor is in Shift+Enter
Run just the selection Select it, then Ctrl+Enter
Stop a running query Esc

Esc genuinely stops the query mid-flight. It cancels on the server rather than only detaching the UI.

Results start rendering before the full set has arrived. Rows stream back in batches, so the first screenful of a large SELECT appears immediately.

Scripts

Several ;-separated statements run in order on one connection, so session state carries across them. BEGIN … COMMIT, SET, and temporary tables all behave as they would in psql. Each statement gets its own result section and timing, and the script stops at the first error.

Schema tree

The sidebar reads pg_catalog directly, so it shows what Postgres actually has: tables, views, materialized views and partitioned tables, with primary keys and column types. Double-click a table to browse it. Drag any node into the editor to drop in its quoted name.

The filter box above the tree searches the whole database, not just the part you have expanded. Type any part of a schema or table name and the tree narrows to what matches, opening a schema to show a table inside it. Clear the box, or click the x, to get the full tree back.

Right-click gives each kind of object the few actions that make sense for it. A schema offers:

Item What it does
New Table… Opens a CREATE TABLE starter statement for that schema in a new tab
Copy Name Puts the schema name on the clipboard
Refresh Reloads just that schema's contents
Exclude from Autocomplete See below
Drop Schema… Drops it, after a confirmation. Fails if the schema still holds objects
Drop Schema (Cascade)… Drops it together with everything inside, after a confirmation that says so

A table, view or materialized view offers Browse Rows (what a double-click does), Copy Name and its reconstructed DDL; a table also offers the Alter Table dialog. A function offers its source, and an extension offers install or drop.

Completion

Completion triggers as you type, or on demand with Ctrl+Space (literal Ctrl on every platform, because Cmd+Space is Spotlight on macOS).

Typing FROM and a partial table name, then JOIN with an FK-ranked suggestion, then ON auto-completing the whole join condition

It reads the live catalog, so it knows about:

  • schema-qualified tables after FROM and JOIN
  • columns scoped to the tables actually in the statement, in WHERE, ON and ORDER BY
  • alias. member access
  • CTE output columns, including a CTE whose body is SELECT *, resolved through the catalog
  • user-defined functions, with signature tooltips
  • the jsonb function family

It reads names the way the server does

Completion works on the statement the cursor is in, not the whole tab. Inside it, a name means what PostgreSQL would take it to mean:

  • A bare name is folded to lowercase and a quoted one is kept exact. A short table name is looked up along search_path, so users finds public.users and not audit.users.
  • A subquery only sees what it can legally see. A FROM subquery can't reach its siblings, a LATERAL one can, and EXISTS (…) sees every level around it. Columns from an outer level come qualified, like u.name.
  • When two joined tables share a column name, you get both, as u.id and o.id.
  • Some places take exactly one table's columns: the column list of INSERT INTO t (…), ON CONFLICT (…), the left side of SET col = and JOIN … USING (…). Only those columns are offered there, minus the ones you've already written. excluded. shows up in ON CONFLICT … DO UPDATE.
  • After :: or CAST(… AS, the list holds only types, your own included.

When a DDL statement you run changes the catalog, the lists refresh on their own. Inside an open transaction they wait for it to finish, because the change isn't visible to other connections until then.

Argument hints

Type ( after a function name, or accept a function from the list, and a hint shows its parameters with the current one marked. It follows the cursor across arguments and nested calls and knows named arguments (name => value). When a function has several overloads, it shows the ones that still fit. Bring it back with Ctrl+Shift+Space and dismiss it with Esc.

Enter vs Tab

Tab always takes the highlighted suggestion. Enter takes it only when you chose it: you opened the list with Ctrl+Space, moved to a row with the arrows or the mouse, or typed the start of its name. Otherwise Enter just starts a new line, so finishing a line never inserts a column you didn't ask for. A row that Enter would skip is drawn with an outline instead of a solid fill.

JOIN magic

Two touches that save the most typing. After JOIN, tables connected to what you already have by a foreign key rank first. After ON, the complete join condition, oi.order_id = o.id, is the top suggestion, one keystroke away.

Leaving a schema out

A database with dozens of schemas usually has a few that belong to another team, and their tables only ever get in the way of yours. Right-click the schema in the sidebar and pick Exclude from Autocomplete. Its tables, columns and functions stop appearing in every suggestion list, and the refresh gets a little faster too, because those catalog queries are skipped.

The schema stays in the tree, dimmed, with a crossed-out eye next to its name. Right-click it again to bring it back. The choice is remembered per connection, so excluding billing on one database says nothing about a billing schema on another.

Auto-alias

With auto-alias on, completing a table also gives it a short alias (orders becomes orders o) so the columns you complete next are already scoped. Toggle it with Ctrl+Shift+A; the status bar confirms the new state.

Formatting

Ctrl+Shift+F (or Alt+Shift+F, if that is the muscle memory you brought) pretty-prints the statement under the cursor, following sqlstyle.guide's "river" layout: root keywords right-aligned to a common column, content to their right.

The formatter re-tokenizes its own output and compares it to the input, so a format can only ever change whitespace. If the check fails, it leaves your SQL alone.

Editing

Beyond the usual, the editor carries the line operations you expect from a code editor:

Action Shortcut
Toggle line comment Ctrl+/
Duplicate line or selection Ctrl+Shift+D
Move line up / down Alt+↑ / Alt+↓
Delete whole line Ctrl+D
Find / find & replace Ctrl+F / Ctrl+H
Zoom font in / out / reset Ctrl++ / Ctrl+− / Ctrl+0

Commenting follows the convention you are used to. If every non-blank selected line is already commented it uncomments them, otherwise it comments the block at its shared indentation, so the SQL keeps its shape.

SELECT * expansion (Ctrl+Shift+8) replaces the star in the statement under the cursor with the explicit column list. It resolves both catalog tables and CTEs, and does nothing at all if a table is unknown, because a missing expansion beats a wrong one.

Tabs and files

Tabs drag to reorder, browser-style, and the order is restored with your workspace next session.

Action Shortcut
New tab / close tab Ctrl+T / Ctrl+W
Next / previous tab Ctrl+PgDn / Ctrl+PgUp
Jump to tab 1…9 Ctrl+1 … Ctrl+9
Open a .sql file Ctrl+O
Save Ctrl+S
Save as Ctrl+Shift+S

The dirty marker distinguishes unsaved scratch from diverges-from-the-file-on-disk, so a scratch tab does not nag you to save it.

Nothing you open replaces what you are working on. A saved query, a history entry, generated DDL, a table preview: all of them open in a new tab. That is a project-wide rule rather than a per-feature choice.

Workspace restore

Closing the app never prompts. The next session reopens your tabs exactly as you left them, including never-saved scratch SQL.

Saved queries and history

The sidebar's Queries tab holds saved queries and the query history. History is searchable, pinnable, and scoped per connection. Double-click any entry to open it in a new tab.

To save the query you are looking at, right-click its tab and choose Save Query, or press Ctrl+S. You are asked for a name once. After that, Ctrl+S writes straight through to the same entry, so a query you keep editing stays one row in the list instead of becoming a pile of copies. If you type a name that is already taken, pgNimbus says so and offers to replace that entry.

Ctrl+S follows the tab. A tab you opened from a .sql file saves back to that file; any other tab goes to the Saved Queries list. When you want a specific destination, the command palette and the ☰ menu carry both by name: Save to Saved Queries and Save to File.

Right-click a row in the list to open it in a new tab, rename it, or delete it.

Command palette

Ctrl+K (or Ctrl+P, or the "Search" pill in the command bar) fuzzy-jumps to any table, saved query, recent file, or action.

The command palette listing actions with their keyboard shortcuts

Most features live here rather than on the toolbar. That is deliberate, and it is why the toolbar stays as short as it is. Each action row shows its shortcut, so the palette teaches you the keys for the things you do often.

Next

Work with results