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

Diferenças na criação de queries

Olá, boa noite,

Existe alguma diferença (para efeito de resultado) entre essas duas queries?

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

e

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

Obrigada, Camila

4 respostas

Excelente pergunta!

O resultado é o mesmo mas, dependendo do banco de dados, a com * vai usar o índice e a com m.id não.

É o caso do MySQL.

Outros bancos de dados talvez otimizem e as duas queries dêem na mesma.

Os banco de dados tem uma coisa chamada Execution Plan que mostra como a consulta é feita.

No link abaixo, dá pra testar com diferentes BDs: http://www.sqlfiddle.com/#!9/9f907e/3

Camila,

O resultado de ambas as querys será o mesmo, porem a query com * pode demorar muito se tiver muitas colunas e tambem muitos registros.

Ou seja, dependendo da quantidade de registros e colunas que a subquery com * possuir a sua consulta levará mais tempo para ser executada.

Boa noite,

Entendi que utilizando uma coluna, ao invés do *, otimiza a execução da query. Tenho mais uma dúvida: como escolhemos a coluna que será utilizada para otimizar essa query?

solução!

Camila,

Digamos que sua query tenha 30 colunas se você colocar o * trará as 30 colunas. Mas se vc escolher direto pelo nome apresentará somente as colunas que informou. Então sim teremos um aumento de performance. Porem se uma destas colunas selecionas for um campo muito grande, você não verá uma diferença. Então performance nesse caso é relativo.

E para selecionar por coluna basta colocar o nome das colunas no lugar o * separadas por ","(Virgula).