A picture of a crow

Frederick's Perch

Non-legendary Pokémon with no evolutions or alternate forms

Published on

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

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)