2
respostas

Conceitos de SQL pendetentes

Boa Noite

Entendi a solução do exercício, mas não está claro o suficiente porque o conceito não foi passado corretamente ou elucidado.

Primeiro a query que soluciona o execício é uma query um pouco mais complexa que o usual. Não é um simples Select e sim uma junção de duas tabelas, feito através do "statement" JOIN.

Segundo entendo que o curso seja um pouco mais superficial/rápido que a maioria, mas para a evolução dos estudantes seria mais sensato firmar o conceito de relaicionar tabelas. E suma, explicar o que é a junção de tabalas e como ela é feito. Acredito que o tema deva ser aprofundado do curso específico de SQL da ALURA. Mas isto não foi informado em vídeo também.

Terceiro e último o conceito de ALIAS (apelido). Que simplesmente foi jogado no ar e fomos obrigados a nos virar para entender. Se eu não tivesse noção de SQL jamais entenderia o que foi feito para o exercício. Tem que ser explicado que podemos atribuir apelidos temporários para tabelas e colunas.

Dito isto, minha dúvida é, qual o raciocínio lógica que tenho que ter em mente na hora de escrever a query para juntar uma ou mais tabelas? Do jeito que o o curso/exercício propões sera simplesmente um copy&paste da coisa. Poderiam explicar como devo pensar antes de escrever este tipo de query, por favor?

2 respostas

Opa, o ponto inicial é que você tem dados que estão em tabelas diferentes. Pensando na alura: você tem usuários na tabela Usuario e tópicos na tabela Topico. Um tópico pertence a um Usuario.

Então, se você precisa recuperar um tópico e todas as informações de um usuário, você vai precisar juntar as duas tabelas. E essa ideia vai ser aplicada para as outras tabelas que você tenha.

Oi Alberto

Obrigado por responder. Até ai eu entendi, o que não entendo talvez seja o conceito de enviar uma query de junção de tabelas.

Utilizando o exemplo dado por você podemos pensar da seguinte forma.

Temos a tabela Usuario, com as colunas id, nome e topico_id e a tabela Topico com as colunas id e topico_nome.

Para realizar um junção simples associando o tópico criado pelo usuário temos:

SELECT * FROM Usuario JOIN Topico ON Usuario.topico_id = Topico.id;

Ainda pegando a mana, corrija-me se errei por favor. Mas acredito que esta query não me retornara o nome do tópico. Esta relação só cria a junção. Por isso há a necessidade de criar o ALIAS.

Agora onde eu realmente me embananei foi a parte do ALIAS para a tabela e coluna. No exercício temos a seguinte solução:

select p.*, c.nome as categoria_nome from produtos as p join categorias as c on p.categoria_id = c.id;

Temos dois conceitos, a junção de tabela mais o ALIAS, o que não esta claro para mim é a estrutura da query. Esta é única maneira de escrever ou o sql permite flexibilidade?

Abaixo a tentativa de replicar a solução do exercício no seu exemplo.

SELECT u.*, t.nome AS topico_nome FROM Usuarios as u JOIN Topico AS t ON u.topico_id=t.id;

Quebrando a estrutura:

SELECT u.*, t.nome AS topico_nome FROM Usuario AS u = Este são dois selects na tabela Usuario entretanto até a aqui não temos a junção, apesar de termos definido o ALIAS para o dado topico_nome como t.nome.

JOIN Topico AS t = Junção mais ALIAS. Aqui começa minha dúvida. Quando eu uso o JOIN, todas as colunas da tabela ficam disponíveis para manipulação dos dados?

ON u.topico_id=t.id; = Onde e quais dados são interpolados na junção, no caso definimos os ids das respectivas colunas.

Quebrando fez muito sentido, mas como é possível exibir o nome do tópico? Se a relação esta nos ids? O segundo select t.nome AS topico_nome FROM Usuario é possível por causa da junção? Pois ai todos os dados da tabela ficam disponíveis para uso?