tl;dr
Here, I answer a question from a friend of mine:
Which non-legendary Gen 1 Pokémon has no alternate forms or evolutions?
I answered it by downloading the PokéAPI source and building the SQLite database that backs it. I also use it to answer the question for all the other gens as well (mainline games only).
Note: When this article was published, the latest generation was Gen 9 (Scarlet/Violet).
Assumptions
- Non-legendary means non-legendary and non-mythical.
- Mew is technically mythical, but non-legendary, but we are excluding him anyway.
- No evolutions means no pre-evolutions either. Basically, the entire evolution chain must consist of entirely one Pokémon.
- No alternate forms means no permanent or temporary forms. If it appears in the “Form data” section of the Pokémon’s Bulbapedia page, it’s out.
- Permanent forms: Spiky-eared Pichu, Sinnoh Cap Pikachu
- Temporary forms: Gigantamax/Mega Charizard
- Shiny versions of Pokémon do not count, otherwise we would eliminate most obtainable Pokémon. Shinies are also not listed in the “Form data” section in Bulbapedia.
- Paradox Pokémon also do not count, as they are neither evolutions nor forms of their present-timeline counterparts.
- For instance, Delibird can never evolve into or out of Iron Bundle, and Iron Bundle is not a form of Delibird because it has a different Pokédex number and therefore a separate Pokémon.
The Pokémon
Generation 1
Generation 2
Generation 3
Generation 4
Generation 5
Generation 6
Generation 7
Generation 8
Generation 9
Try it yourself
You could try to generate this data using a series of API calls to PokéAPI, but I didn’t want to spam their servers with lots of requests. I decided to download the source code, which includes the data it’s backed by, and build the SQLite database. It’s actually pretty simple.
Assuming you have make
, SQLite, and Python >= 3.10 installed locally, all you need to do after cloning the repo with --recurse-submodules
is run:
make install && make setup && make build-db
It might take a few minutes to build the database, but after that, db.sqlite3
should appear in the repo’s root containing all the data.
SQL query
The SQL query I wrote to answer the question is as follows:
SELECT species.name, generation.id AS generation FROM pokemon_v2_evolutionchain evochain
JOIN pokemon_v2_pokemonspecies species ON species.evolution_chain_id = evochain.id
JOIN pokemon_v2_pokemon pokemon ON pokemon.pokemon_species_id = species.id
JOIN pokemon_v2_pokemonform form ON pokemon.id = form.pokemon_id
JOIN pokemon_v2_versiongroup vergroup ON form.version_group_id = vergroup.id
JOIN pokemon_v2_generation generation ON vergroup.generation_id = generation.id
WHERE species.is_legendary = FALSE
AND species.is_mythical = FALSE
GROUP BY evochain.id
HAVING COUNT(DISTINCT form.id) = 1
ORDER BY MIN(species.id)