Here is an SQL query I construct to extract customers with billing and shipping address from a Magento 1.9 store.
This joins on table
sales_flat_order_address to ensure that only customers that have ordered are included.
You may need to adjust the entity attribute id’s – if you look in those tables it is pretty obvious what each value represents.
SELECT ce.entity_id AS customer_id, ce.email, cev2.value AS firstname, cev3.value AS lastname, caet.value AS billing_first_line, caev1.value AS billing_town, caev2.value AS billing_postcode, sfoa.entity_id AS sfoa_entity_id, sfoa.street AS shipping_first_line, sfoa.city AS shipping_city, sfoa.postcode AS shipping_postcode FROM customer_entity ce -- first name INNER JOIN customer_entity_varchar cev2 ON (ce.entity_id = cev2.entity_id AND cev2.attribute_id = 5) -- last name INNER JOIN customer_entity_varchar cev3 ON (ce.entity_id = cev3.entity_id AND cev3.attribute_id = 7) -- address first line INNER JOIN customer_address_entity cae ON (ce.entity_id = cae.parent_id) INNER JOIN customer_address_entity_text caet ON (cae.entity_id = caet.entity_id) -- town INNER JOIN customer_address_entity_varchar caev1 ON (cae.entity_id = caev1.entity_id AND caev1.attribute_id = 26) -- postcode INNER JOIN customer_address_entity_varchar caev2 ON (cae.entity_id = caev2.entity_id AND caev2.attribute_id = 30) -- sales INNER JOIN sales_flat_order sfo ON (ce.entity_id = sfo.customer_id) -- shipping address INNER JOIN sales_flat_order_address sfoa ON (sfo.entity_id = sfoa.parent_id) WHERE sfo.status = 'complete'