Din forespørgsel er næsten rigtig, og det er den rigtige måde at gøre det på (og den mest effektive)
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(*)
kunne inkludere NULL-værdier i optællingen, fordi den tæller alle rækkerne, mens COUNT(orders.book_id)
ikke, fordi den ignorerer NULL-værdier i det givne felt.