Tendo como referência as informações precedentes, julgue o i...

Próximas questões
Com base no mesmo assunto
Q1902776 Banco de Dados
Em um banco de dados relacional, foram criadas as seguintes relações, posteriormente transformadas e preenchidos seus dados em tabelas. As chaves primárias estão realçadas em itálico.

professor (cpf_professor, nome, titulação, salario)

curso (cod_curso, titulo, objetivo, cpf_professor_coord)

contrato (cpf_professor, cod_curso, data_inicio)

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;

Alternativas

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