If the query for database too complicated, does it means the design of Database is bad?
The answer is: divide to conquer! Each sub-query should become a query (or a view) of its own. Use sub-queries sparingly. Use JOINs instead.

You would need at least one query (using JOINs) for:


AUTHOR
CUSTOMER
BOOK
...


Then you can test your queries or views independently (very useful if you are having trouble).