Tendo como referência as informações precedentes, julgue o i...
Tendo como referência as informações precedentes, julgue o item subsecutivo.
O comando SQL a seguir cria uma visão com todos os dados dos professores e dos respectivos cursos que eles coordenam, não incluindo os cursos sem um professor com a função de coordenador.
create view coordenador_curso as
select * from professor p left outer join curso s on true
where p.cpf_professor = s.cpf_professor_coord;
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Gabarito: C - certo
O tema desta questão é a criação de visões (views) em SQL e o entendimento do funcionamento dos joins. Para resolver a questão, é necessário conhecer o conceito de left outer join e como ele é utilizado para combinar registros de duas tabelas.
A visão coordenador_curso
é criada corretamente para atender ao requisito de mostrar todos os dados dos professores e dos respectivos cursos que eles coordenam. O comando left outer join
é especialmente relevante aqui, pois ele retorna todos os registros da tabela da esquerda (no caso, professor
) e os registros correspondentes da tabela da direita (no caso, curso
). Quando não há correspondência, os resultados da tabela da direita têm valores NULL
. Entretanto, o uso do left outer join
é complementado pela condição no ON
, que está sempre verdadeira (ON true
), e a filtragem real acontece no WHERE
, assegurando que apenas professores que sejam coordenadores de cursos sejam incluídos na visão.
A expressão WHERE p.cpf_professor = s.cpf_professor_coord
garante que a visão incluirá apenas as linhas em que o cpf_professor
da tabela professor
corresponde ao cpf_professor_coord
da tabela curso
, excluindo assim cursos sem um professor coordenador. A visão criada é, portanto, correta e está alinhada com a descrição fornecida na pergunta.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Gabarito: CERTO.
O comando SQL apresentado cria uma visão chamada "coordenador_curso". Uma visão é uma tabela virtual que é definida por uma consulta SQL. Quando você cria uma visão, está basicamente criando uma tabela virtual que contém os dados que você precisa. Esses dados não são armazenados fisicamente, mas sim são resultado da consulta que foi definida para a visão.
A consulta SQL que foi definida para a visão "coordenador_curso" tem duas tabelas envolvidas: a tabela "professor" e a tabela "curso". A cláusula "LEFT OUTER JOIN" indica que todos os registros da tabela "professor" serão mantidos, mesmo que não haja um correspondente na tabela "curso".
A condição que liga as duas tabelas é a igualdade entre o campo "cpf_professor" da tabela "professor" e o campo "cpf_professor_coord" da tabela "curso". Isso significa que a visão "coordenador_curso" conterá todas as informações dos professores e dos cursos que eles coordenam.
Porém, como a cláusula "LEFT OUTER JOIN" está sendo utilizada, a visão incluirá também os registros dos professores que não estão coordenando nenhum curso. Isso porque a cláusula "LEFT OUTER JOIN" garante que todos os registros da tabela da esquerda ("professor") serão mantidos, mesmo que não haja correspondência na tabela da direita ("curso").
Por fim, a cláusula "WHERE p.cpf_professor = s.cpf_professor_coord" é usada para filtrar apenas os registros que têm correspondência entre as duas tabelas. Nesse caso, a cláusula WHERE pode ser substituída pela cláusula "ON true", que garante que todas as linhas da tabela da esquerda (professor) serão mantidas, mesmo se não houver uma correspondência na tabela da direita (curso).
imagina dois diagramas de ven que se intercedem no meio, quando ele da um "professor LEFT OUTER JOIN curso", ele pega todo o círculo esquerdo incluindo a intersecção, ou seja, todos os professores sem curso e todos os professores com curso, em que o "on true" é o mesmo que "p.key = s.key", quando vem o "where p.cpf_professor = s.cpf_professor_coord" ele faz mais uma limitação, dizendo que não quer qualquer professor que tenha curso, mas apenas os professores coordenadores.
Resolução pra quem quiser: https://i.ibb.co/DG8qKM3/Notes-241112-194442-2.jpg
O item aborda o conceito de visões (views) em bancos de dados e a lógica de junções no SQL. O objetivo da banca foi avaliar a capacidade do candidato de interpretar corretamente o resultado produzido por uma consulta SQL, mesmo que a sintaxe utilizada não seja a mais convencional ou otimizada.
1. LEFT OUTER JOIN com ON true:
O comando cria uma combinação cartesiana entre as tabelas professor e curso. Isso significa que, no primeiro momento, cada professor será associado a todos os cursos, independentemente de haver ou não uma relação entre eles.
2. Filtro no WHERE: Após a junção inicial, o filtro where p.cpf_professor = s.cpf_professor_coord reduz o conjunto de resultados para incluir apenas os casos em que o cpf_professor de um professor coincide com o cpf_professor_coord de um curso. Este filtro elimina as linhas em que a relação entre professor e curso não é válida. Na prática, isso descarta os cursos sem um professor coordenador, pois o filtro impede que linhas "nulas" (resultantes do LEFT JOIN) sejam exibidas.
3. Resultado Final: A visão resultante (coordenador_curso) contém: Os dados de professores. Os dados dos cursos que eles coordenam. Não inclui cursos sem coordenador.
A banca não focou na eficiência ou na clareza do comando SQL, mas sim no resultado final gerado pela visão. Apesar do uso desnecessário e ineficiente do LEFT OUTER JOIN (que, combinado ao WHERE, atua efetivamente como um INNER JOIN), o comando SQL produz o resultado desejado: uma visão que mostra apenas os professores e os cursos que eles coordenam, excluindo os cursos sem coordenador.. O comando funciona e atende ao objetivo descrito: listar apenas os professores e os cursos que eles coordenam, excluindo cursos sem coordenadores. A construção pode parecer confusa (e é), mas o entendimento correto deve levar em conta que:
- O uso de LEFT OUTER JOIN é válido, mesmo sendo desnecessário neste caso.
- O filtro WHERE ajusta o comportamento, garantindo que apenas professores coordenadores sejam exibidos.
- O comando cumpre a função de não incluir cursos sem coordenadores.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo