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

Porque há um erro ao selecionar com o nome da tabela vs. com alias não há problema?

Bom dia, pessoal.

Seguinte, enquanto nos exercícios montei uma query que depois vi que não faz muito sentido, mas uma dúvida ficou. Porque no mysql quando eu procuro por registros usando o nome completo de uma tabela um erro é gerado, enquanto que o uso do alias na mesma query produz resultado? Vejam...

select aluno.* from aluno a join matricula m on m.aluno_id = a.id join curso c on c.id = m.curso_id where exists (select 1 from matricula m where a.id = m.aluno_id);

resulta em ERROR 1051 (42S02): Unknown table 'aluno'

enquanto,

select a.* from aluno a join matricula m on m.aluno_id = a.id join curso c on c.id = m.curso_id where exists (select 1 from matricula m where a.id = m.aluno_id);

resulta +----+-----------------+--------------------+ | id | nome | email | +----+-----------------+--------------------+ | 1 | João da Silva | joao@dasilva.com | | 2 | Frederico José | fred@jose.com | | 3 | Alberto Santos | alberto@santos.com | | 4 | Renata Alonso | renata@alonso.com | | 2 | Frederico José | fred@jose.com | +----+-----------------+--------------------+ 5 rows in set (0.00 sec)

4 respostas
solução!

Olá Glayderson,

Tudo tranquilo?

Então, justamente pelo motivo de você estar especificando um alias para a tabela, isso não é só no MySQL, no Oracle também ocorre.

Você esta falando para o banco que você no seu comando irá usar a para se referenciar à tabela aluno, e ao usar aluno.* ele não irá enxergar mais a tabela aluno, e sim a.

SE por acaso você fizesse mais um JOIN com a própria tabela aluno e não desse um alias, ele iria considerar aluno.* como um comando válido, trazendo apenas os dados da aluno, e não da a

SELECT aluno.* FROM aluno a JOIN tabela x ON x.campo = a.campo JOIN aluno ON aluno.campo = a.campo

Espero ter ajudado!

Abraços!

Olá, Luiz.

Bem curioso esse comportamentos dos bancos. Eu pensava que o nome canônico sempre seria "válido", uma espécie de nome absoluto. Deve ter um bom motivo para eles não seguirem essa lógica, apesar de parecer "errado". Você tem ideia do porquê o alias substitui o nome da tabela original?

Fala Glayderson,

Na real eu não sei o motivo não, nunca cheguei a pesquisar muito a fundo isso, talvez algum professor aqui leia isso e possa responder com mais clareza, mas eu acho que ao você dar um apelido para a tabela, naquele momento de execução você está fazendo um acordo com o banco de dados e dizendo "Ó, a tabela ALUNOS, eu vou chamar de A OK?" e o Banco de Dados fala "OK, A é ALUNOS", e deixa de entender o que é ALUNOS e passa a entender só A.

Pode ser para economizar recursos na hora de executar, acredito eu.

Abraços!

Olá Luiz,

Obrigado pela ajuda. Sua ajuda foi importante para eu entender essa característica curiosa dos bancos. Até mais.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software