No it's not a database - it's much more low level than that.
It's a chunked columnar storage format for large data sets. Think of storage layout for a table of data. With arrow, the table is first split row-wize into chunks (sometimes/often just one chunk), then each column of each chunk is stored as an array. The underlying arrays layout supports vectorized operations.
Querying is largely independent of arrow itself which is just the memory format. But the format was designed to support efficient querying. If used as a disk format, for example, you can efficiently load a subset of columns without touching the entire file. And if you're lucky and/or you've chunked the data appropriately you may be able to skip entire chunks.
The format is also language agnostic - as long as the language is python or C++ :) - and allows zero-copy passing of data across the language barrier assuming a shared memory model. This zero-copy feature is important when dealing with large in-memory data-sets.
Unfortunately, until the entire Python data-science ecosystem is re-written from scratch, the application for arrow will largely for library writers and plumbing.
Yes, as a data-scientist, you can easily turn your arrow table into a Pandas Dataframe or a numpy array but you run the risk of expensive copies occurring (actually a copy is guaranteed to happen if the table has more than one chunk) which sort-of defeats the whole purpose. And since to do anything useful with the data you're going to have to perform this conversion - as most of the Python data-science ecosystem is built on numpy and pandas - the format is not particularly interesting to data-science users, I feel.
it their storage formats, I believe, will continue to dominate for columnar storage in the Python world for the foreseeable future.