Din fråga är nästan rätt och det är rätt sätt att göra det (och det mest effektiva)
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(*)
kan inkludera NULL-värden i antalet eftersom det räknar alla rader, medan COUNT(orders.book_id)
inte eftersom den ignorerar NULL-värden i det givna fältet.