Consulta em banco de dados - [Resolvido]

Galera, boa tarde.

Eu tenho a seguinte estrutura no banco de dados:

e tenho a seguinte consulta:

SELECT
endereco.idEndereco as codEndereco,
endereco.cepRua as cepRua,
endereco.nome as nomeRua,
endereco.tipoEndereco as tipoEndereco,
endereco.observacao as observacao,
endereco.complemento as complemento,
endereco.bairroIdBairro as codBairro,
bairro.nome as nomeBairro,
bairro.cidadeIdCidade as codCidade,
cidade.nome as nomeCidade,
cidade.cep as cepCidade
from endereco
join bairro
on endereco.bairroIdBairro = bairro.idbairro
join cidade
on bairro.cidadeIdCidade = cidade.IdCidade
order by codEndereco;

Essa consulta me traz todos os endereços cadastrados no banco de dados ignorando assim as cidades que ainda não possuem endereços(Logradouros), estou com dificuldade para fazer duas consultas, seriam elas:

1º : Listar todas as cidades do banco, ordenando-as por cidades que tenham logradouros cadastrados.

2º : Listar apenas o nome e cep das cidades que tenham endereços cadastrados.

alguém poderia me ajudar? e se possível indicar um bom curso de mysql, por que ta difícil.

Obrigado.

Opa!

Pode pesquisar sobre Joins, pois tem muitas opções como: LEFT JOIN, RIGHT JOIN, OUTER, etc.
Outra solução seria utilizar a cláusula EXISTS, que listaria apenas registros que existem em outra consulta.

Certo?

Vou pesquisar sobre essas cláusulas, as vezes fica mais simples minha consulta.

não traz como ?

Acredito que podem ter cidades que não tenham bairros e bairros que não tenha endereço.

A outra opção não muita certa é incluir left join ou right join

Sim, existem cidades que não tem nenhum bairro cadastrado e bairros sem endereços, o que retorna essa left join ou rigth join?

Creio que essa você já matou, pois disse que a consulta já traz tudo certo?

Entendi correto, seria isso?

SELECT 
    c.nome as nomeCidade, 
    c.cep as cepCidade 
from cidade as c
left join bairro as b on b.cidadeIdCidade = c.IdCidade
left join endereco as e on e.bairroIdBairro = b.idbairro
where b.idBairro IS NULL OR e.idEndereco IS NULL;

O left join prioriza a tabela à esquerda da instrução, perceba que mudei a ordem das tabelas, comecei pela cidade, fui pra bairro e por ultimo endereço…

Pois bem, o left join entre cidade e bairro diz o seguinte pro banco: “Se existir registros em cidade e bairro, pode trazer, mas se existir só em cidade mas em bairro não, traz também :joy:

Com o tempo você pega o jeito…

O pulo do gato está na linha do where… já que podem não existir registros em bairro ou endereco eles retornam NULL quando não houver, filtrando assim a consulta…

OBS: o AS também serve como apelido para os nomes das tabelas, melhor usar um do que usar cidade.nomeCidade etc…

Rapaz, que magico essa consulta rsrs, obrigado por me ajudar.