Se o cliente Fábio não fez nenhuma compra de todo, logicamente ele também não fez compras em 2015. Por consequência a consulta deveria trazer o Fábio.
Nesta consulta que fiz, são geradas 56 linhas. 15 clientes * 4 anos =60 linhas. Ou seja, faltam 4, justamente do Fábio.
SELECT DISTINCT TC.CPF, NOME, YEAR(DATA_VENDA), NF.CPF
FROM notas_fiscais NF LEFT JOIN tabela_de_clientes TC
ON TC.CPF = NF.CPF
ORDER BY NOME, YEAR(DATA_VENDA)``
Então fica a pergunta: é possível fazer a consulta desejada usando o LEFT JOIN?
Tô editando este comentário, porque até vi respostas aqui no fórum. Mas ainda fiquei na dúvida, pois a consulta de qualquer modo não traria qualquer registro, pois o Fábio não fez nenhuma compra em nenhum ano, e todos os outros fizeram compras em todos os anos. Os dados do banco não ajudam. Seria preciso que houvesse pelo menos uma pessoa sem compras em 2015 mas com compras em outro ano.