Váš dotaz je téměř správný a je to správný způsob (a nejúčinnější)
SELECT books.*, count(orders.book_id) as number_of_orders
from books
left join orders
on (books.book_id = orders.book_id)
group by
books.book_id
COUNT(*)
může do počtu zahrnout hodnoty NULL, protože počítá všechny řádky, zatímco COUNT(orders.book_id)
ne, protože ignoruje hodnoty NULL v daném poli.