I disagree. Sometimes.
The performance difference is not enough to worry about. But here is some discussion...
The real metric is how many times you touch the disk.
Here's a comparison where "database" wins:
For fetching an entire file, think of it as 2 steps: One to touch the disk to look in the directory to find the file and "open" it, then another to fetch the data from the file.
For fetching some a chunk of data from a database that is already open, the first step is not needed. The second step may still exist -- fetching the data from somewhere in the database's structures.
Here's a case where "file" wins:
The data is broken up into multiple rows and possibly multiple tables. And the fetching needs to gather the stuff and put it together. Several disk hits may be needed, or even several million disk hits. Hence, the database is slower.
I will argue that a common case has a different reason for deciding: You want to show an <img ...> on a web page.
There are at least 3 ways to store an image in a database; you would need to pick a way, then code for it. This is programmer overhead.
Letting the web server simply deliver the image via <img src=foo/bar/xyz.jpg> requires nearly zero programmer work. And it may actually involve fewer disk hits. This is because large BLOBs tend to be somewhat scattered in the database structure. Yeah, the filesystem may also be scattering the jpg around.
Oh, another point. If you are talking about web stuff, then the "statelessness" of web servers means (usually) that the database is not open. This adds a small fraction of a second of delay. If you will be using the database for other stuff, then this may not matter.