Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida no Ex. 2 da Aula 1 - Alunos sem matrícula e o EXISTS

É usado essa query para selecionar os alunos que não se matricularam:

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

Mas eu achava que deveria ser a seguinte query:

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

Alguém poderia me explicar o porque de não ser a segunda query a correta?

Att, Tiago.

4 respostas

Explicando melhor, basicamente não entendi na seguinte sub-query:

"select m.id from matricula m where m.aluno_id = a.id"

Como pode ser feita a comparação "where m.aluno_id = a.id".

Pois são tabelas diferentes, então achava que deveria haver um inner join.

solução!

Tiago podemos amarrar duas tabelas de várias formas diferentes, porém algumas com pequenos resultados diferentes, vamos la:

select a.campo, b.campo from tabela a, tabela b where a.id = b.ida

Aqui amarramos com o where, que é equivalente a:

select a.campo, b.campo from tabela a join tabela b on a.id = b.ida

Aqui não a diferença, você pode usar das duas formas que tera o mesmo resultado, serão mostrados os resultados quando houverem informação das duas tabelas, ou seja, se caso haver um registro em A que não existe em B o mesmo não será mostrado.

select a.campo, b.campo from tabela a left join tabela b on a.id = b.ida

Nesse caso será mostrados todos os registros da tabela A, independente se existe registro na tabela B ou não.

Espero ter ajudado.

Obrigado Matheus. Ajudou sim.

Adicionando à sua explicação, essa sintaxe usando where é uma sintaxe de junção mais antiga. A versão SQL92 do padrão ANSI SQL introduziu a sintaxe usando os tipos variados de join.

Há varias vantagens em usar o padrão ANSI SQL como portabilidade entre bancos de dados e outras.

Gratidão!

De nada, precisando não deixe de criar suas dúvidas.