Mediauppspelning stöds inte på den här enheten
Hamilton var ursprungligen fast bakom Ferrari's Sebastian Vettel men bytte till en annan strategi för att komma framåt.
Tysken låg trea före Williams Valtteri Bottas och Kimi Raikkonen.
Resultatet innebär att Rosberg har minskat Hamiltons fördel i mästerskapet till 20 poäng, medan Vettel är 31 poäng på tredje plats.
Det var Mercedes mest dominerande grand prix sedan den första tävlingen i Australien.
Ferrari hade kommit till helgen med en stor uppgradering paket, med revideringar till nästan varje aerodynamisk yta av bilen, men Mercedes var kanske längre framåt än de hade varit hela säsongen.
Rosberg omvandlade sin stolpeposition till en ledning i det första hörnet och kryssade helt enkelt in i avståndet som Vettel höll upp Hamilton bakom honom.
Mercedes uppmanade Hamilton att försöka passera Ferrari, men han sa till laget att det var omöjligt att komma tillräckligt nära för att köra om gropen rakt även med hjälp av DRS omkörning hjälp.
Mercedes bestämde sitt bästa alternativ var att ge Hamilton några tydliga spår, och berättade för honom att de skulle byta till en tre-stop strategi och försöka passera Vettel i slutet av loppet.
Men Hamilton behövde inte köra om Ferrari på rätt spår.
Stannar på varv 32 för att passa den långsammare "hårda" däck, Hamilton omedelbart ställa den snabbaste varv av loppet och fortsatte att ta stora bitar av Vettel fördel.
Mediauppspelning stöds inte på den här enheten
Tjugo sekunder efter när han kom tillbaka hade Hamilton klippt Vettels bly i hälften när Ferrari föraren gjorde sitt andra och sista stopp åtta varv senare.
Vettel återförenades med 13,5 sekunder bakom Hamilton, som fortsatte att dra sig undan tills han var 23 sekunder framför vid tiden för sitt sista stopp på varv 51, vilket var bekvämt nog att tillåta honom att återförenas framför Ferrari.
Nu 17 sekunder bakom Rosberg, gillade Hamilton sina chanser att fånga sin lagkamrat för segern, men fick höra av hans ingenjör Peter Bonnington att han hade för mycket att göra och att "konsolidera" andra plats.
Hamilton tryckte på Bonnington och sa: "Är det omöjligt?" Han fick höra: " Ja, det är omöjligt. Han svarar om vi ökar takten."
"Perfekt helg", sa Rosberg. "Bilen har varit fantastisk hela helgen."
Hamilton sade: " Jag fick en dålig start, hade massor av hjulpinn men det var en bra tävling. Nico gjorde ett fantastiskt jobb och jag var bara tacksam att jag kunde komma tillbaka upp till andra. Det här var en svår helg för mig och jag tar det här."
Bakom Vettel i loppet, Bottas tog fjärde, slåss mot en sträng utmaning från Ferrari Raikkonen i de avslutande varv.
Ferrari vände upp och ned på Raikkonens däckstrategi och satte honom på det "hårda" däcket för sin mellanstillestånd snarare än att ta den konventionella vägen att lämna det för slutet av loppet.
Mediauppspelning stöds inte på den här enheten
Det innebar att Raikkonen hade en övertagsfördel över Bottas, som var på det "hårda" däcket i den sista stinten, men han kunde inte få det att betala.
Den andra Williams av Felipe Massa var sjätte, från Red Bull av Daniel Ricciardo och Lotus Romain Grosjean.
Toro Rossos Carlos Sainz passerade Red Bulls Daniil Kvyat för nionde plats i första hörnet av sista varvet. Förvaltarna undersökte händelsen eftersom Sainz gick ur spåret genom Turn Two när han avslutade flytten - att få en fördel genom att lämna banan är förbjudet - men de bestämde sig för att inte vidta några ytterligare åtgärder.
Tre varv tidigare, Sainz passerade lagkamrat Max Verstappen för 10: e plats.
De två Toro Rossos hade börjat femte och sjätte och hade alltid misstänkt att det skulle vara svårt att slå Raikkonen, Massa och Red Bulls, som alla hade kvalificerat sig bakom dem.
Sainz drog fördel av att vara på de "medium" däcken i den sista stinten medan Verstappen var på den "hårda". Holländaren sprang bred i den sista vridiga delen av banan på varv 62 och Sainz kunde dra förbi på raken.
Jenson Button slutade 16 efter en orolig tävling för McLaren.
Team-matte Fernando Alonso sprang 12:a i den första stinten, klättrade så högt som sjunde på en punkt tack vare ett sent första depåstopp, men drog sig tillbaka från 14: e plats med bromsfel.
Fullständiga tävlingsresultat här
Nico Rosberg tog en dominant seger i den spanska Grand Prix som Mercedes lagkamrat Lewis Hamilton kämpade tillbaka från en långsam start för att ta andra.