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 tem a sintaxe correta para obter o
código dos cursos e o valor médio do salário dos professores,
mas mostrando apenas aqueles cursos cuja média do salário
dos seus professores é inferior a 5.000 reais.
Select c.cod_curso, avg (salario)
from contrato c, professor p
where c.cpf_professor = p.cpf_professor
and avg (salario) < 5000;
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: E - Errado
O tema desta questão envolve conhecimentos sobre a sintaxe do SQL e específicamente a utilização de funções de agregação e a cláusula HAVING para filtrar os resultados com base em um critério aplicado a um conjunto de linhas (ou um grupo). Para resolver esta questão é necessário compreender:
- Como formular uma consulta SQL com funções de agregação (como AVG()).
- A maneira correta de realizar um JOIN entre tabelas (neste caso, implicitamente entre contrato e professor).
- Conhecer a diferença entre as cláusulas WHERE e HAVING.
A justificativa para a alternativa E ser a correta está baseada na utilização incorreta da função de agregação AVG() dentro da cláusula WHERE. As funções de agregação devem ser utilizadas juntamente com a cláusula HAVING, que é designada para filtrar resultados após a agregação ter sido realizada. Além disso, a consulta SQL necessita de uma cláusula GROUP BY para agrupar os registros pelos quais o cálculo da média salarial será efetuado. A consulta corrigida deveria ser algo similar a:
SELECT c.cod_curso, AVG(p.salario) AS media_salario FROM contrato c INNER JOIN professor p ON c.cpf_professor = p.cpf_professor GROUP BY c.cod_curso HAVING AVG(p.salario) < 5000;
Neste exemplo, o comando SQL correto utiliza INNER JOIN para unir as tabelas de forma explícita e mais legível, o GROUP BY para agrupar os dados pelo código do curso, e por fim, o HAVING para impor a condição de que apenas os cursos com a média salarial dos professores inferior a 5.000 reais sejam retornados.
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
Select c.cod_curso, avg (salario)
from contrato c, professor p
where c.cpf_professor = p.cpf_professor
group by c.cod_curso
having avg (salario) < 5000;
otima observacao roberto, having é uma agregacao que usa com o agrupamento (group by)
Gabarito: ERRADO.
O comando SQL apresenta um erro de sintaxe. Quando usamos a função AVG() para obter a média de uma coluna, é necessário utilizar a cláusula GROUP BY para agrupar os resultados por coluna não agregada na consulta. Além disso, a cláusula HAVING deve ser utilizada para filtrar os resultados que atendam à condição especificada, neste caso, a média do salário dos professores ser inferior a 5.000 reais.
Assim, a consulta correta seria:
SELECT c.cod_curso, AVG(p.salario)
FROM contrato c
JOIN professor p ON c.cpf_professor = p.cpf_professor
GROUP BY c.cod_curso
HAVING AVG(p.salario) < 5000;
Dessa forma, a consulta irá retornar o código dos cursos e a média dos salários dos seus professores apenas para aqueles cursos cuja média do salário seja inferior a 5.000 reais.
Errado.
O comando SQL fornecido tem um erro na utilização da função de agregação `avg` e na estrutura geral da consulta. Vamos analisar os problemas:
1. **Função de agregação `avg`**: A função de agregação `avg(salario)` não pode ser usada diretamente na cláusula `WHERE`. Funções de agregação devem ser usadas em combinação com a cláusula `GROUP BY` e, se você precisa filtrar resultados de agregações, deve usar a cláusula `HAVING`.
2. **Cláusula `FROM`**: A utilização de junção implícita (listas separadas por vírgula) está correta, mas é mais recomendável usar a sintaxe `JOIN` explícita para maior clareza e evitar ambiguidades.
3. **Cláusula `HAVING`**: Deve ser utilizada para filtrar os resultados após a agregação.
A consulta correta deve agrupar os registros por `cod_curso`, calcular a média dos salários e então filtrar aqueles com média inferior a 5.000 reais. Aqui está o comando SQL corrigido:
```sql
SELECT c.cod_curso, AVG(p.salario) AS media_salario
FROM contrato c
JOIN professor p ON c.cpf_professor = p.cpf_professor
GROUP BY c.cod_curso
HAVING AVG(p.salario) < 5000;
```
Esta consulta:
1. Seleciona `cod_curso` e a média dos salários (`AVG(p.salario)`).
2. Usa `JOIN` explícito para unir as tabelas `contrato` e `professor`.
3. Agrupa os resultados por `cod_curso`.
4. Filtra os grupos onde a média dos salários é inferior a 5.000 reais usando `HAVING`.
Portanto, a afirmativa está errada porque o comando fornecido não está correto na sua forma original.
chatgpt
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo