Last updated: 2026-05-01

Table Explorer

Browse, filter, and edit table data with a powerful visual interface. Table Explorer lets you view data with pagination, apply filters with various operators, edit cells inline, add or delete rows, and export data in multiple formats.

Opening Table Explorer

There are several ways to open a table in Table Explorer:

From Object Explorer

The quickest way to view table data:

  1. Expand a database in the Object Explorer sidebar
  2. Right-click any table
  3. Select Select Top 1000 to browse data, or
  4. Select Edit Top 200 to open in edit mode

From Toolbar

  1. Click the Table Explorer button in the main toolbar
  2. Select a database from the dropdown
  3. Select a table from the list
  4. Click Open to load the data

Browsing Data

Once a table is open, you can explore the data using these features:

Table Explorer showing data with pagination controls and column headers.
Table Explorer showing data with pagination controls and column headers.

Pagination

Large tables are loaded in pages for performance:

  • Page size - Choose from 10 up to 10,000 rows per page
  • Navigation - Use the arrows to move between pages
  • Jump to page - Enter a page number directly
  • Row count - See total rows and current range displayed

Loading large pages

Rows appear in the grid as they arrive — you don't have to wait for the full page to load. While loading, a status indicator at the bottom of the grid shows progress (Executing query…, then Loading rows… X received).

If you choose a page size large enough that the entire page can't fit in memory (typically over 50,000 rows on wide tables), Table Explorer switches to streaming mode: rows are fetched on demand as you scroll. Inline editing is unavailable in streaming mode. If you want to edit values, reduce the page size first — a banner above the grid explains the same.

Column Sorting

Click a column header to add it to the Sort panel (ascending by default). Use the Sort panel to change direction, reorder sorts, or remove sorts.

  • Click a column header to add a sort
  • Multiple sorts are supported (reorder in the Sort panel)

Column Resizing

Drag the border between column headers to resize columns. Double-click a column border to auto-fit the column width to its content.

Row Details

Inspect a single row in a details panel (available outside edit mode):

  • Click a row to select it
  • Use the row expander (>) to open Row details at the bottom
  • Use the Row side panel button (|) to open Row details on the right
  • Use the panel header buttons to switch between bottom and side layouts
  • Drag the divider between the grid and the side panel to adjust the panel width

Filtering Data

Use the filter panel to find specific data without writing SQL:

Filter panel with multiple conditions applied.
Filter panel with multiple conditions applied.

Adding Filters

  1. Click the Filter button to open the filter panel
  2. Select a column from the dropdown
  3. Choose an operator
  4. Enter the value to filter by
  5. Click Apply to filter the results

You can also right-click any cell in the data grid and choose Add to filter to start a draft filter row pre-filled with that cell's column, value, and operator (IS NULL for empty cells, = otherwise). The draft is not applied automatically — keyboard focus lands on the value input so you can press Enter to confirm or Escape to cancel. If the column already has a filter, focus moves to the existing one so you can edit it in place.

Filter Operators

Table Explorer supports these filter operators:

OperatorDescriptionExample
=EqualsStatus = 'Active'
!=Not equalsStatus != 'Deleted'
<Less thanPrice < 100
<=Less than or equalAge <= 65
>Greater thanQuantity > 0
>=Greater than or equalRating >= 4
LIKEPattern match (% wildcard)Name LIKE 'John%'
BETWEENRange (inclusive)Date BETWEEN '2024-01-01' AND '2024-12-31'
IS NULLValue is NULLEmail IS NULL
IS NOT NULLValue is not NULLPhone IS NOT NULL
lookupForeign-key row picker (real FKs and declared loose FKs)customer_id = (pick from Customers table)

Array Column Operators (PostgreSQL)

For Postgres array columns (integer[], uuid[], text[], …), Table Explorer swaps the regular operator list for a set built around array semantics. Scalar comparison operators like =, BETWEEN, or LIKE would produce nonsense SQL on an array column, so they're hidden — the dropdown only offers operators that actually make sense:

OperatorDescriptionSQL emitted
containsThe array contains the given element5 = ANY(tag_ids)
does not containThe array does not contain the given element5 <> ALL(tag_ids)
is emptyArray has zero elements (distinct from NULL)cardinality(tag_ids) = 0
is not emptyArray has at least one elementcardinality(tag_ids) > 0
length = / / > / < / / Compare the array's element count to a numbercardinality(tag_ids) > 2
IS NULL / IS NOT NULLThe column itself is null (different from "is empty")tag_ids IS NULL
lookupDeclare a loose foreign key on the array column (each element treated as a target lookup)

FK array columns: when the array column is already a (real or loose) foreign key, contains opens the same row-picker dialog as lookup on a scalar FK column — pick the target row and Table Explorer applies a contains filter on its primary key.

Why cardinality() and not array_length()? Postgres returns NULL from array_length(col, 1) on empty arrays, so = 0 is always false (a footgun). cardinality() always returns an integer — empty arrays are 0, never null.

Filter by Foreign Key (Lookup Picker)

For columns that are foreign keys, the filter row's operator dropdown includes a lookup operator — and it's the default selection. Instead of typing a raw ID, click the picker button on the right side of the filter row to browse the parent (referenced) table.

The picker dialog opens only when you click the picker button (selecting an FK column does not open it automatically) and lets you find a row by either name or ID:

  • Search box — matches against both the parent table's display column (guessed from common label-like names: name, display_name, full_name, title, label, description, code, slug, email, username) and the parent table's primary key. Both lookups are server-side; results are merged and capped at 100 rows. If the parent table has no display-column candidate, the search still works against the primary key alone.
  • Per-column filter inputs in the grid header — each column gets its own filter cell that's wired into the same database query (not a client-side filter). Use them to narrow by status, country, type, or any other column. Numeric columns expect a number; string columns do CONTAINS; boolean columns accept true/false/0/1.
  • Drill-down on FK columns. When a column in the picker grid is itself a foreign key, a small chain icon appears next to its filter input. Click it to open another picker for that FK's parent table — find the row you want there, click it, and the picker writes the FK target value back into the column filter, narrowing the original picker. The drill chain is unbounded; a breadcrumb at the top of each nested picker shows the trail (Orders ▸ customer_id ▸ Customers ▸ region_id ▸ Regions) so you always know which value you're picking and for which column.
  • Column ordering in the grid puts the FK target first (the column whose value is returned), the display column second, and the primary key third when it's a different column from the FK target — so the value, the label, and the id are always visible without horizontal scrolling.
  • Click a row to write its FK target value back into the filter and apply it. The filter chip then displays the picked value alongside the parent row's display column when available — for example 42 — Acme Corp.

You can switch the operator back to =, IN, IS NULL, or any other operator on the same row if you want to type a raw ID instead — lookup is the convenient default for FK columns, not a lock-in. The lookup operator is now also listed at the bottom of the operator dropdown on every regular column. On a non-FK column it triggers the loose foreign key declaration flow described below — pick a target table/column once, and the picker behaves like a real FK from then on.

Loose Foreign Keys (declared relationships)

Loose foreign keys are user-declared column→column references that aren't enforced by a database FK constraint. They're stored in a per-database MetaInfo file alongside Jam SQL Studio's other user-owned metadata, so a relationship you declare on one table is shared across Table Explorer, Query Editor, Schema Overview, Dependency Viewer, and Data Profiling for that connection + database.

See the dedicated Loose Foreign Keys guide for the full workflow, the visual cue for loose vs. real FKs, and the MetaInfo manager dialog for sharing declarations across machines via Export / Import.

Use them when:

  • The schema doesn't have FK constraints (legacy databases, denormalised reporting tables, ETL staging schemas)
  • The reference is logical only (cross-database, cross-schema, polymorphic entity_id)
  • You want FK navigation, the lookup picker, and the inbound “Related data” tab to work without altering the schema

Declaring a loose FK

  1. Open the filter panel and add a row for any non-FK column
  2. Open the operator dropdown and pick lookup (it's at the bottom)
  3. The target picker dialog opens with a guess pre-filled — Jam SQL Studio strips common suffixes (_id, _uuid, Id) and matches against schema/table/column names, including plural variants and prefix/suffix overlaps
  4. Confirm the suggestion or pick a different schema, table, and column
  5. Save — the relationship is persisted, and the filter row immediately switches to the same FK lookup picker used by real foreign keys

Once saved, the column behaves like a real FK throughout the app:

  • The filter row's picker button opens the parent table picker, with the same search, per-column filters, and unbounded drill-down
  • Result-grid cells render the value as a clickable link (see below)
  • The Row Details “Related data” tab lists rows from tables that loosely reference this row, marked with a “Loose” badge
  • Schema Overview and Dependency Viewer show the relationship as a dashed blue connection

Visual cue: loose FK vs real FK

Loose FKs are styled distinctly so you always know which references are enforced by the database:

  • Real FKs — solid blue link with the external-link icon
  • Loose FKs — teal link with a dashed underline and the chain (Link2) icon
  • The cell popover that opens on click shows the referenced row, plus a Clear loose relation button at the bottom that removes the declaration
  • Schema Overview edges for loose relationships are dashed blue and labelled “Loose relationship”; Dependency Viewer marks connected nodes with a “Loose” badge

Editing or removing a loose FK

You can manage a single relationship from the filter row that uses it: an edit pencil reopens the target picker so you can repoint to a different table or column, and an X removes the declaration. To see and manage every loose relationship for the current database in one place, open the MetaInfo manager dialog from the Link2 icon in the Table Explorer toolbar. The dialog lists every declaration, lets you remove individual entries, and offers Export (write all MetaInfo to a JSON file) and Import (merge or replace from a JSON file) so you can sync declarations across machines or share them with teammates.

Storage

MetaInfo is stored at {user data}/metainfo/<connection>/<database>.json (versioned, atomic writes). Each (connection, database) pair has its own file, and the same file is read by Table Explorer, Query Editor, Schema Overview, Dependency Viewer, and Data Profiling — declare a loose FK once and every surface picks it up.

Multiple Filters

Add multiple filter conditions to narrow down results. All filters are combined with AND logic, meaning rows must match all conditions to appear.

Clear Filters

Click the Clear button to remove all filters and show all data. You can also remove individual filters by clicking the X next to each condition.

Editing Data

Table Explorer provides inline editing for quick data modifications:

Edit mode with modified cells highlighted and pending changes indicator.
Edit mode with modified cells highlighted and pending changes indicator.

Enable Edit Mode

Editing is disabled by default to prevent accidental changes. To enable editing:

  • Click the Edit toggle button in the toolbar, or
  • Use Edit Top 200 from the Object Explorer context menu
Primary Key Required: Tables must have a primary key to enable editing. Without a primary key, Jam SQL cannot uniquely identify rows to update or delete.

Inline Cell Editing

  1. Click any cell to select it
  2. Start typing to replace the value, or press F2 to edit
  3. Press Enter to confirm or Escape to cancel
  4. Modified cells are highlighted until saved

Expanded Editor (JSON & Multiline Text)

For JSON and multiline text, click the expand (maximize) icon in a cell to open a larger editor.

  • Large text columns (for example nvarchar(max), text, json/jsonb) show the expand icon by default
  • Short text columns (for example nvarchar(200)) show the expand icon only when the value contains newlines (columns sized nvarchar(256) or larger show it by default)
  • JSON/Text mode tabs - Switch between JSON and Text modes in the dialog (the initial mode is chosen automatically)
  • Copy - Use the Copy icon in the dialog header to copy the full value to your clipboard

Adding New Rows

  1. Click the Add Row button in the toolbar
  2. A new blank row appears at the bottom of the grid
  3. Fill in the column values
  4. Click Save to insert the row into the database

Deleting Rows

  1. Select the row(s) you want to delete
  2. Click the Delete button or press Delete
  3. Rows are marked for deletion (shown with strikethrough)
  4. Click Save to permanently delete from the database

Saving Changes

Changes are not written to the database until you explicitly save:

  • Save - Click the Save button to commit all pending changes
  • Pending indicator - Shows the count of modified/added/deleted rows
  • Review changes - Hover over the pending indicator to see a summary

Discarding Changes

To undo uncommitted changes:

  • Click Discard to revert all pending changes
  • Right-click a modified row and select Revert to undo that row only

Exporting Data

Export the current view to various formats for use in other applications:

Export dropdown showing available formats.
Export dropdown showing available formats.

Export Formats

  • CSV - Comma-separated values, opens in spreadsheets
  • JSON - JavaScript Object Notation, useful for APIs and scripts
  • Excel - Native .xlsx format with proper data types

Export Scope

  • Current grid view - Exports the currently loaded rows and the currently visible columns

Keyboard Shortcuts

Navigate and edit efficiently with these shortcuts:

ActionmacOSWindows/Linux
Edit selected cellF2F2
Confirm editEnterEnter
Cancel editEscapeEscape
Delete selected rowsDeleteDelete
Copy cellsCmd+CCtrl+C
Select allCmd+ACtrl+A
Navigate cellsArrow keysArrow keys
Save changesCmd+SCtrl+S
Refresh dataCmd+RCtrl+R

Ready to Explore Your Data?

Download Jam SQL Studio and start browsing and editing table data with ease.