There are two primary purposes of a Data Access Layer
Abstract the actual database engine
or other data store, such that your
applications can switch from using
say Oracle to using MS SQL server
Abstract the logical data model such
that your Business Layer is
decoupled from this knowledge and is
agnostic of it. Giving you the
ability to modify the logical data
model without impacting the business
layer
Most answers here have provided the first reason. In my mind it is the second that is far more important. Essentially your business layer should not be aware of the logical data model that is in use. Today with ORMs and Linq #2 seems to go out the window and people tend to forget (or are not able to see the fine lines that do and should exist) about #2.
Essentially, to get a good understanding of the purpose and function of a Data Layer, you need to see things from the Business Layer's perspective, keeping in mind that the Business layer should be agnostic of the logical data model of your data store.
So each time the business layer need data for example, if should ask for the data it needs in a very simple logical data model agnostic way. So it would make a call into the Data Access Layer such as:
GetOrdersForCustomer(42)
And it gets back exactly the data it needs without being aware of what tables store this information of or relationship exists etc.
I've written an article on my blog that goes into more details.
The Purpose and function of a Data Access Layer