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)
Ditto
Shuckle
Delibird
Skarmory
Smeargle
Miltank
Plusle
Minun
Volbeat
Illumise
Torkoal
Spinda
Zangoose
Seviper
Lunatone
Solrock
Kecleon
Tropius
Relicanth
Luvdisc
Pachirisu
Chatot
Spiritomb
Carnivine
Throh
Sawk
Maractus
Sigilyph
Emolga
Alomomola
Cryogonal
Druddigon
Bouffalant
Heatmor
Durant
Hawlucha
Dedenne
Carbink
Klefki
Comfey
Oranguru
Passimian
Pyukumuku
Type: Null
Komala
Turtonator
Bruxish
Drampa
Dhelmise
Nihilego
Buzzwole
Pheromosa
Xurkitree
Celesteela
Kartana
Guzzlord
Stakataka
Blacephalon
Falinks
Pincurchin
Stonjourner
Dracozolt
Arctozolt
Dracovish
Arctovish
Klawf
Bombirdier
Cyclizar
Orthworm
Flamigo
Veluza
Dondozo
Great Tusk
Scream Tail
Brute Bonnet
Flutter Mane
Slither Wing
Sandy Shocks
Iron Treads
Iron Bundle
Iron Hands
Iron Jugulis
Iron Moth
Iron Thorns
Roaring Moon
Iron Valiant
Walking Wake
Iron Leaves
Gouging Fire
Raging Bolt
Iron Boulder
Iron Crown