Getting the Tables Out of an .accdb or .mdb, Without Microsoft Access
Access databases outlive the people who built them. A .accdb behind a retired departmental system, a .mdb from 2003 in an archive folder — and a computer without Microsoft Access: a Mac, a Chromebook, or a Windows PC on a Microsoft 365 plan that does not include it. The data is only tables. Here is how to get at them.
Why It Is Harder Than It Should Be
Access runs only on Windows, and comes only with some Microsoft 365 plans. The usual ways round it all have a catch:
| Approach | What it costs |
|---|---|
| Microsoft Access | Windows only, and only on the plans that include it. There has never been a Mac version. |
| Importing into Excel | Excel for Windows can import Access tables through Get Data. Excel for Mac cannot. |
| mdbtools | Free command-line tools for Linux and macOS that export tables to CSV. An install and a terminal. |
| An online converter | The whole database uploaded to someone else’s server. Access files tend to hold staff, customer and finance records. |
Doing It in the Browser
OmniSelect FileSQL reads Access files with mdb-reader, a JavaScript library, inside your browser tab. It works in any modern browser on any operating system, and the database is never uploaded.
- Open the app.
- Drop the
.accdbor.mdbfile onto the File Select panel. Every table in the database gets its own row, and its own one-letter name in the Alias column, taken from the table’s name:Row Alias shop.accdb › Customers C shop.accdb › Orders O shop.accdb › Products P - Look at a table.
SELECT * FROM O
| orderid | customerid | orderdate | total | notes |
|---|---|---|---|---|
| 1 | 1 | 2026-04-02 | 182.5 | Deliver before noon |
| 2 | 2 | 2026-04-03 | 1240 | |
| 3 | 1 | 2026-04-07 | 96.25 | |
| 4 | 4 | 2026-04-09 | 310.4 | Standing order |
Total is an Access Currency field and arrives as a number, so it adds up in SUM and sorts as a number. OrderDate is a date, and the Long Text Notes field is text. Column names are shown in lower case, and a space in a name becomes an underscore: Company Name in Customers is queried as company_name.
Joining the Tables Back Together
The relationships you drew in Access are not needed: each table is its own SQL table, and you join them on the fields they share. Ask in plain English — total by city, highest first — and the SQL is written for you, inside your browser, with the join found on CustomerID:
SELECT C.city, SUM(O.total) AS total_total FROM C JOIN O ON C.customerid = O.customerid GROUP BY C.city ORDER BY total_total DESC
| city | total_total |
|---|---|
| Leeds | 2280.5 |
| Bristol | 278.75 |
| Glasgow | 58.99 |
The name total_total is “the total of Total”; it is only a label, and you can rename it in the SQL. orders where total is over 300 gives SELECT * FROM O WHERE total > 300. Or write the query yourself — spend per customer:
SELECT C.Company_Name, C.City, COUNT(*) AS orders, SUM(O.Total) AS spend FROM O JOIN C ON O.CustomerID = C.CustomerID GROUP BY C.Company_Name, C.City ORDER BY spend DESC
| company_name | city | orders | spend |
|---|---|---|---|
| Northgate Hardware | Leeds | 2 | 1695 |
| Millstone Bakery | Leeds | 2 | 585.5 |
| Harbour Cafe | Bristol | 2 | 278.75 |
| Kelpie Books | Glasgow | 1 | 58.99 |
Drop an .accdb or .mdb file in and see every table.
Open the app →From Access SQL to This SQL
The saved queries in an Access database do not come across — only the tables do — but the tables they read are all there, so a query can be rewritten. The engine here is DuckDB, whose SQL is close to standard. The differences you will meet most:
| In Access | Here |
|---|---|
[Company Name] | Company_Name — spaces are already underscores |
"Leeds" | 'Leeds' — text goes in single quotes |
#2026-04-10# | '2026-04-10', as in WHERE OrderDate >= '2026-04-10' |
LIKE "*Books" | LIKE '%Books' — % and _ instead of * and ? |
Nz(Notes, "(none)") | COALESCE(Notes, '(none)') |
IIf(Active, "Active", "Closed") | CASE WHEN Active THEN 'Active' ELSE 'Closed' END |
What Comes Across
| In Access | In the table |
|---|---|
| Short Text, Long Text (Memo) | Text |
| Number, AutoNumber | Numbers |
| Currency, Decimal, Large Number | Numbers |
| Date/Time | Dates, with the time when there is one |
| Yes/No | true / false |
| Queries, forms, reports, macros | Not included: they are parts of the Access application, not data |
| Linked tables | Not listed: their data lives in another file — open that file |
System tables (MSys…) | Not listed |
| Password-protected databases | Refused |
The reader supports .mdb files from Access 97 and from Access 2000–2003, and .accdb files from Access 2010 to Access 2019.
Getting Every Table Out
To move a whole database into Excel or CSV, export each table in turn: run SELECT * FROM C, choose Export › Excel, then the same for O and P. Each export holds every row of the result, not just those on screen. A joined result exports the same way, which is often what was wanted all along: the orders with the customer’s name already beside them.
Reasonable Questions
Does it work on a Mac?
Yes — on macOS, Linux, ChromeOS or Windows, in a current Chrome, Edge, Firefox or Safari. Nothing is installed.
Will it change or lock my database?
No. The browser gives the page a read-only copy of the file. The original is not opened by Access, not written to and not uploaded — here is how to check.
Can I edit the data and save it back?
No. Only SELECT queries run here, and exports are CSV, JSON, Excel or Parquet.
How big a database can it open?
Up to 50 MB per file, and 1,000,000 rows per table. Access allows files of up to 2 GB, so a large one will be refused.
Can I join an Access table to a spreadsheet?
Yes. Every table and every file you add becomes a table of its own, and up to 26 can be joined in one query — see querying 26 files at once.