Заявката ви е почти правилна и това е правилният начин да направите това (и най-ефективният)
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(*)
може да включва NULL стойности в броя, защото отчита всички редове, докато COUNT(orders.book_id)
не, защото игнорира NULL стойности в даденото поле.