1
resposta

Aula 01, Ex. 04 - Referenciando tabelas com join ou where

Um outro aluno abriu um tópico questionando algo parecido, e nesse tópico foi respondido que ambas as situações dariam no mesmo, porém estou tendo resultados diferentes referenciando tabelas com where e join.

Primeiro caso (referenciando com where):

select a.nome from aluno a where not exists (select m.id from matricula m where m.aluno_id = a.id);

Isso me retorna o nome do Paulo da Silva, que não tem nenhuma matrícula realizada.

Segundo caso (referenciando com join):

select a.nome from aluno a where not exists (select m.id from matricula m join aluno a on m.aluno_id = a.id);

Isso me retorna um empty set.

Tem algum erro no meu código ou realmente os dois casos vão dar um resultado diferente? Quando é mais adequado usar o where ou o join para referenciar campos de tabelas diferentes?

1 resposta

Boa noite Roberto,

Creio que seus códigos estão certos. Além disso, refletindo um pouco, acho que os selects darão diferentes resultados.

No primeiro caso, como você disse que o Paulo não tem matrícula realizada, o select do where será vazio, logo o not exists será verdadeiro. Como há o Paulo na lista de alunos, ele é retornado.

No segundo caso, você fez um join no select do where. Para ele retornar Paulo, o join tem que ser vazio, para que o not exists seja verdadeiro. Neste caso, estou achando que há elementos no select do join, logo o not exists é falso e, portanto, não vai retornar nenhum nome de aluno.

Testes que podem ser feitos:

  1. Executar apenas o select do join (select m.id from matricula m join aluno a on m.aluno_id = a.id), para ver o que está retornando.

  2. No segundo select, ao invés de not exists, executar com exists, para ver a resposta.

Sobre where e join: "Generally, the ON clause serves for conditions that specify how to join tables, and the WHERE clause restricts which rows to include in the result set". Fonte: MySQL Join docs.

Avisa aí se ficou claro.

Abraço.