Grab a ready-made database below, drop it into PounceSQL, and start querying in a minute — no server, no setup. Stuck? Ask the built-in AI to explain any query. It's all free.
Each is a single SQLite file — download it, add it to PounceSQL, and query away.
61 planets and 87 characters, linked by a foreign key — perfect for learning JOINs.
"Which characters are from Tatooine?"
Data from alexisrolland/star-wars-data (SWAPI). Inspired by Cockroach Labs and the starwarsdb R package.
All 800 Pokémon with types and battle stats — great for SELECT, WHERE, ORDER BY,
and aggregates.
"Show the strongest Water types."
The classic Kaggle Pokémon dataset. Learning ideas from TempeHS, Yi Zheng, and lucvalsal.
Artists, albums and tracks across three related tables — the database PounceSQL ships with. Already loaded
the first time you launch.
"Chart tracks per album."
Built in — just open PounceSQL, no download needed.
More databases on the way. Want one? Suggest it →
.db file above.~/Documents/pouncesql/learn (create it if it doesn't exist).Tip: right-click any table to preview rows, count them, or generate a starter query.
The AI is optional and off until you add a provider. Both of these are free.
gemini-2.5-flash and start chatting. Free-tier limits are generous for learning.brew install ollama).ollama pull qwen2.5-coderhttp://localhost:11434.Prefer the big models? A few dollars of OpenAI or Anthropic credits go a long way.
Paste each query into the editor and hit Run (⌘↵), or ask the AI to do it for you. Work top to bottom — every lesson builds on the last.
SELECT chooses columns, WHERE filters rows, ORDER BY sorts, LIMIT caps the count. Find the ten hardest-hitting Fire types:
SELECT name, type1, attack FROM pokemon WHERE type1 = 'Fire' ORDER BY attack DESC LIMIT 10;
Try next: change 'Fire' to 'Water', or sort by speed.
Aggregate functions summarise many rows. GROUP BY makes one row per group — here, per type — with a count and an average:
SELECT type1,
COUNT(*) AS count,
ROUND(AVG(total), 0) AS avg_power
FROM pokemon
GROUP BY type1
ORDER BY count DESC;
Try next: add HAVING COUNT(*) > 40 to keep only the common types.
Real data lives in linked tables. A JOIN follows the foreign key — each character's planet_id points at a planet:
SELECT people.name, planet.name AS homeworld FROM people JOIN planet ON people.planet_id = planet.id WHERE planet.name = 'Tatooine';
Try next: swap in 'Naboo', or add people.height and sort by it.
Don't know the syntax yet? Type the question in the AI Assistant and it writes engine-correct SQL you can read, tweak, and run with Use in editor:
Ask: “Which homeworld has produced the most characters?”
Read the JOIN + GROUP BY it generates — that's lesson 2 and 3 combined. Then ask it "explain that query."
Numbers are easier to grasp as pictures. Ask for a chart and PounceSQL renders it inline — then export it as PNG:
Ask: “Chart the average attack by Pokémon type.”
Also try: "give me the KPIs for this database" for a dashboard of headline numbers.
New database? Get the lay of the land instantly — the AI draws an entity-relationship diagram of the tables and how they connect:
Ask: “Diagram the relationships in this database.”
Now you can see which columns to JOIN on before you write a line of SQL.