One command line. Every database.

The same commands on PostgreSQL, Oracle, SQL Server, MySQL, H2: if it has a JDBC driver, BroadSQL speaks it. Run a query on QA, rerun it on PROD with one command. Save it, export the results, load data back in, all without switching tools.

Latest release v5.5.0 (download it, read its release notes). Free of charge. No account, no telemetry. Source code published under Apache-2.0. See the license and the source code.

On the WORLD sample included in BroadSQL: WORLD-QA is a practice copy, with one test city added, and WORLD plays production. Set it up in a few minutes. Illustrative output.

Ships with drivers for H2, PostgreSQL, Apache Derby, HSQLDB, and SQLite. Connect to Oracle, SQL Server, MySQL and MariaDB, Db2 and any other JDBC database by adding its driver: see Connect to your database.

The part of the job that repeats

Four everyday workflows on the WORLD sample, as BroadSQL prints them. Each one links to the how-to that explains it, step by step, so that you can reproduce it on your own installation.

Check a figure in QA, then in production

Run the query on QA, then / PROD: it runs once on the production connection of the same application, and you stay on QA. No retyping, no switching.

How to check a figure in QA, then in production →

WORLD-QA> SELECT COUNT(*) AS CITIES FROM CITY WHERE COUNTRYCODE = 'FRA';
|--------------------|
|CITIES              |
|--------------------|
|41                  |
|--------------------|

1 rows fetched in 5 ms.

WORLD-QA> / PROD
Running last query on WORLD [PROD]...
|--------------------|
|CITIES              |
|--------------------|
|40                  |
|--------------------|

1 rows fetched in 0 ms.

WORLD-QA>
Illustrative output: the values come from the WORLD sample and the practice connections of the how-to on QA and production copies of WORLD, and the layout from this release; it was not captured from a BroadSQL run, and your timings will differ.

Use a list of values you received

Copy the values from an email, a report or a spreadsheet, one per line, then write <@clipboard> where the list belongs. BroadSQL quotes and separates them. <@last:CODE> does the same with the result you just saw, and <@excel:file:sheet:column> with a spreadsheet column.

How to use a list of values from the clipboard →

SELECT CODE, NAME, POPULATION FROM COUNTRY WHERE CODE IN <@clipboard>;
SELECT COUNTRYCODE, LANGUAGE FROM COUNTRYLANGUAGE WHERE COUNTRYCODE IN <@last:CODE>;

Keep a local working copy fresh

Copy a production table into a local H2 database once; then the same command inserts the new rows, updates the changed ones and counts the others. All or nothing, and every refresh is recorded.

How to keep a local copy up to date →

WORLD> DUMP (SELECT CODE, TRIM(NAME) AS NAME, POPULATION FROM COUNTRY) TO WORKCOPY.COUNTRY_FIGURES AS H2 MODE MERGE KEY(CODE);
MERGE into WORKCOPY.COUNTRY_FIGURES: 254 source row(s), 0 inserted, 1 updated, 253 unchanged.
Completed: 2026-10-18 10:15:47 +02:00 (0:00:00).
Illustrative output: the values come from the WORLD sample and the practice connections of the how-to on QA and production copies of WORLD, and the layout from this release; it was not captured from a BroadSQL run, and your timings will differ.

Load a spreadsheet: preview, then insert

Save the sheet as CSV, and LOAD ... PREVIEW checks every row against the table before anything is written. Then the same command inserts them, in one transaction, after a confirmation.

How to load a CSV file with a preview →

WORLD> LOAD MY_VISIT my_visits.csv PREVIEW;
LOAD PREVIEW
------------------------------------------------------------
Target      : WORLD / PUBLIC.MY_VISIT
Mode        : INSERT
Source      : c:\temp\my_visits.csv
Input rows  : 3
Valid rows  : 3
Rejected    : 0

Columns:
CITY_ID -> CITY_ID  INTEGER
VISIT_DATE -> VISIT_DATE  DATE
NOTE -> NOTE  VARCHAR

No changes have been made.
Illustrative output: the values come from the WORLD sample and the practice connections of the how-to on QA and production copies of WORLD, and the layout from this release; it was not captured from a BroadSQL run, and your timings will differ.

Safe by design

What BroadSQL does to keep a terminal pointed at production safe, and what it does not claim to do.

A confirmation before any change to production

On a connection whose Environment is flagged Production, BroadSQL asks before every statement that can change the database. Nothing is sent before you answer, and without a terminal to ask, the change is refused. It protects against mistakes; it is not access control.

Production confirmation →

WORLD> UPDATE COUNTRY SET POPULATION = 59225800 WHERE CODE = 'FRA';
WARNING: This operation can modify a Production database.
  Connection: WORLD (Environment PROD, Production)
  Statement:  UPDATE COUNTRY SET POPULATION = 59225800 WHERE CODE = 'FRA'
  Why:        it is an UPDATE
Execute? [yes/no]: yes
1 row(s) updated.
Illustrative output: the values come from the WORLD sample and the practice connections of the how-to on QA and production copies of WORLD, and the layout from this release; it was not captured from a BroadSQL run, and your timings will differ.

Encrypted, local credentials

Every saved connection, its URL and password, lives in an AES-encrypted local database, unlocked by a master password. Every installation ships with the same default one: change it with SET MASTER PASSWORD before adding real connections. See Security.

No phoning home

BroadSQL only talks to the databases and APIs you connect it to. It does not collect usage telemetry or contact any BroadSQL/UpAndCoding server during normal operation. See Security.

No hidden AI

BroadSQL includes no AI functionality today, and does not send database data, SQL, metadata, credentials, or query results to an AI service. AI-assisted tools may be used to help build BroadSQL, but that's separate from the software you run. See AI and BroadSQL.

Published, auditable source

The core of BroadSQL that parses your commands and talks to your databases is published openly, with its own test suite, at github.com/lico/broadsql-source. Read it yourself instead of taking it on faith.

What else it does

Export with one syntax

DUMP writes a table, a query or what is on screen to Excel, OpenDocument, CSV, JSON, Markdown, HTML or a local H2 table. See the export guide.

Scripts you run by name

Save a query in the Scripts Library with typed parameters, run it with @name, export its result only when it succeeds. Start from the Scripts Gallery.

Explore any database

SHOW TABLES, DESCR, SHOW FK, FIND COLUMN and COMPARE TABLE STRUCTURE read the standard JDBC metadata, so they work the same everywhere. See Exploring a database.

Watch a value

REPEAT EVERY 30s runs a query again and again, and can append every run to a CSV file: a timeline of a queue, a job, a count.

Logic when you need it Experimental

A short JavaScript file can hold several connections open, loop and branch (JS RUN).

Call the APIs in front of your data Experimental

Import an existing Bruno collection once, then browse and call its endpoints, with whatever authentication it defines, from the same workbench. See Universal API Client.

Who it's for

People who work across many databases as a daily routine, not database design or schema modeling. Four roles get the most direct benefit from it.

BroadSQL assumes you're comfortable with SQL and a terminal. See the tasks behind each role in Who BroadSQL is for.

Why not just use a GUI?

Graphical SQL clients are excellent for interactive exploration: browsing a schema, building one query, looking at one database.

BroadSQL earns its place once that work needs to be repeated, scripted, shared with a team, or applied consistently across systems and environments: exactly the part a point-and-click session doesn't preserve. It isn't a claim that GUIs are the wrong tool; it's a different job.

Another tool is the better fit for an ER diagram, a data grid you edit by hand, a visual query plan, or code completion and refactoring across a large SQL codebase. The comparison with usql, DBeaver and DataGrip says where each tool leads.

Ready to try it?

Download the latest release, then try the WORLD sample database in a few minutes.