User can search by Postcode (eg: L14, L15, L16) or Location from a textbox.
If user type in \"Liverpool\", it will find all the shops that are located in \"Liverpool
Whatever you choose, be aware that short code is not always optimal code. In many cases, where you have sufficiently divergent logic, unioning the results really is the most optimal (and sometimes most clean, programatically) option.
That said, the following OR in the WHERE clause seems to cover both your cases...
SELECT DISTINCT
shops.*,
DA.delivery_cost,
DA.postcode AS AreaPostcode
FROM
shops
INNER JOIN
shops_delivery_area as DA
ON (DA.shop_id = shops.id)
WHERE
(DA.postcode = "Liverpool")
OR
(DA.postcode = shops.postcode AND shops.location = "Liverpool")