あなたの質問はほぼ正しいです、そしてそれはそれをする正しい方法です(そして最も効率的です)
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(*)
COUNT(orders.book_id)
の場合、すべての行をカウントするため、カウントにNULL値を含めることができます。 指定されたフィールドのNULL値を無視するためではありません。