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:
- Expand a database in the Object Explorer sidebar
- Right-click any table
- Select Select Top 1000 to browse data, or
- Select Edit Top 200 to open in edit mode
From Toolbar
- Click the Table Explorer button in the main toolbar
- Select a database from the dropdown
- Select a table from the list
- Click Open to load the data
Browsing Data
Once a table is open, you can explore the data using these features:

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:

Adding Filters
- Click the Filter button to open the filter panel
- Select a column from the dropdown
- Choose an operator
- Enter the value to filter by
- 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:
| Operator | Description | Example |
|---|---|---|
= | Equals | Status = 'Active' |
!= | Not equals | Status != 'Deleted' |
< | Less than | Price < 100 |
<= | Less than or equal | Age <= 65 |
> | Greater than | Quantity > 0 |
>= | Greater than or equal | Rating >= 4 |
LIKE | Pattern match (% wildcard) | Name LIKE 'John%' |
BETWEEN | Range (inclusive) | Date BETWEEN '2024-01-01' AND '2024-12-31' |
IS NULL | Value is NULL | Email IS NULL |
IS NOT NULL | Value is not NULL | Phone IS NOT NULL |
lookup | Foreign-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:
| Operator | Description | SQL emitted |
|---|---|---|
contains | The array contains the given element | 5 = ANY(tag_ids) |
does not contain | The array does not contain the given element | 5 <> ALL(tag_ids) |
is empty | Array has zero elements (distinct from NULL) | cardinality(tag_ids) = 0 |
is not empty | Array has at least one element | cardinality(tag_ids) > 0 |
length = / ≠ / > / < / ≥ / ≤ | Compare the array's element count to a number | cardinality(tag_ids) > 2 |
IS NULL / IS NOT NULL | The column itself is null (different from "is empty") | tag_ids IS NULL |
lookup | Declare 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 accepttrue/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.
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
- Open the filter panel and add a row for any non-FK column
- Open the operator dropdown and pick
lookup(it's at the bottom) - 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 - Confirm the suggestion or pick a different schema, table, and column
- 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:

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
Inline Cell Editing
- Click any cell to select it
- Start typing to replace the value, or press
F2to edit - Press
Enterto confirm orEscapeto cancel - 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 sizednvarchar(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
- Click the Add Row button in the toolbar
- A new blank row appears at the bottom of the grid
- Fill in the column values
- Click Save to insert the row into the database
Deleting Rows
- Select the row(s) you want to delete
- Click the Delete button or press
Delete - Rows are marked for deletion (shown with strikethrough)
- 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 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:
| Action | macOS | Windows/Linux |
|---|---|---|
| Edit selected cell | F2 | F2 |
| Confirm edit | Enter | Enter |
| Cancel edit | Escape | Escape |
| Delete selected rows | Delete | Delete |
| Copy cells | Cmd+C | Ctrl+C |
| Select all | Cmd+A | Ctrl+A |
| Navigate cells | Arrow keys | Arrow keys |
| Save changes | Cmd+S | Ctrl+S |
| Refresh data | Cmd+R | Ctrl+R |
Ready to Explore Your Data?
Download Jam SQL Studio and start browsing and editing table data with ease.