I used this to do a search from one zipcode to another (using geological locations) I had a large database filled with zipcodes as well as there city, state, lon and lat.
zipcodes is the listing of zipcodes and there city state and other things, and the locations is a database of locations for
business and such.
Edit: I believe this is the US zipcode listing that I used. http://www.zip-codes.com/
SELECT z.zipcode, z.lon, z.lat, l.name, l.id, l.address, l.city, l.state, l.zip FROM zipcodes = z, locations = l WHERE(POW((69.1 * (z.lon - '$lon') * cos($lat / 57.3)), 2) + POW((69.1 * (z.lat - '$lat')), 2)) < ($miles * $miles) GROUP BY name