Para a avaliação de políticas públicas na área de Segurança ...
PRODUTO (cod-produto, nome-produto, grupo-alimentar) FORNECEDOR (CNPJ, nome-empresa, tipo) COMPRADO (CNPJ, cod-produto, data, quantidade, valor)
Os atributos que formam as chaves primárias de cada tabela estão sublinhados.
Nesse contexto, considere o comando SQL apresentado a seguir.
SELECT P.cod-produto, SUM (quantidade) FROM PRODUTO P, FORNECEDOR F, COMPRADO C WHERE P.cod-produto = C.cod-produto AND C.CNPJ = F.CNPJ AND F.tipo = 'agricultura familiar' GROUP BY P.cod-produto HAVING SUM (quantidade) > 10000
Os resultados produzidos pela execução desse comando apresentam o código do produto e a soma das quantidades compradas dos produtos de
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a B, que afirma que os resultados produzidos pela execução do comando SQL apresentam o código do produto e a soma das quantidades compradas dos produtos de fornecedores do tipo 'agricultura familiar' que tiveram mais de 10.000 unidades compradas.
Para entender a questão, é importante conhecer os conceitos fundamentais de bancos de dados relacionais, como a estrutura de tabelas (relações), chaves primárias, e o uso da linguagem SQL para realizar consultas e agregações de dados.
O modelo relacional nos mostra três tabelas: PRODUTO, FORNECEDOR, e COMPRADO. As chaves primárias, indicadas pelos atributos sublinhados, servem para identificar unicamente cada registro dentro de suas respectivas tabelas. No caso da tabela COMPRADO, temos uma chave primária composta (CNPJ, cod-produto, data), o que significa que a combinação desses três campos deve ser única.
A consulta SQL realiza um JOIN entre as três tabelas e faz uso das condições na cláusula WHERE para filtrar os resultados de acordo com as relações entre as tabelas e o critério de que o tipo do fornecedor seja 'agricultura familiar'. O GROUP BY agrupa os resultados pelo código do produto e o HAVING é utilizado para filtrar esses grupos, mantendo apenas aqueles cuja soma das quantidades é maior do que 10.000.
Assim, a consulta retorna apenas os produtos que, ao somar as quantidades compradas de fornecedores do tipo 'agricultura familiar', ultrapassam o total de 10.000 unidades. Isso justifica por que a alternativa B está correta.
É importante notar que outras opções são incorretas porque:
- A alternativa A menciona "fornecedores com mais de 10.000 produtos distintos", o que não é medido pela consulta SQL fornecida.
- A alternativa C também está errada, pois a consulta não avalia a quantidade de produtos distintos fornecidos, mas sim a soma das unidades compradas.
- A alternativa D sugere que seriam todos os fornecedores do tipo 'agricultura familiar', sem considerar a quantidade de unidades compradas que a cláusula HAVING especifica.
- Por fim, a alternativa E é incorreta porque não especifica que os produtos em questão devem ser apenas daqueles fornecedores do tipo 'agricultura familiar'.
Entender a estrutura das tabelas e as operações da linguagem SQL é essencial para resolver corretamente questões como esta em concursos públicos voltados para a área de banco de dados.
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
A consulta SQL utiliza as seguintes instruções:
*SELECT: Seleciona as colunas cod-produto e SUM(quantidade) da tabela PRODUTO.
*FROM: Especifica as tabelas PRODUTO, FORNECEDOR e COMPRADO como as fontes de dados.
*WHERE: Filtra os registros para aqueles em que:
**O cod-produto da tabela PRODUTO é igual ao cod-produto da tabela COMPRADO.
**O CNPJ da tabela COMPRADO é igual ao CNPJ da tabela FORNECEDOR.
**O tipo da tabela FORNECEDOR é igual a 'agricultura familiar'.
*GROUP BY: Agrupa os resultados pelo cod-produto da tabela PRODUTO.
*HAVING: Filtra os grupos para aqueles em que a soma da quantidade é superior a 10.000.
A consulta retorna o cod-produto e a soma da quantidade para cada grupo de produtos. Cada grupo representa um produto específico que foi comprado mais de 10.000 vezes. Portanto, a alternativa correta é a B.
O conto da Cesgranrio nessa questão foi ter perguntado quais os fornecedores que fornecem esse produto. Pois a query retorna produtos.
De resto, o comando tá bem conciso e simples.
SELECT P.cod-produto, SUM (quantidade) ## seleciona o código do produto e a soma da quantidade
FROM PRODUTO P, FORNECEDOR F, COMPRADO C ## declara todas as tabelas usadas na query
WHERE P.cod-produto = C.cod-produto AND C.CNPJ = F.CNPJ ## clausulas do JOIN implícito
AND F.tipo = 'agricultura familiar' ## primeiro filtro, condição.
GROUP BY P.cod-produto HAVING SUM (quantidade) > 10000 ## remove produtos duplicados e filtra pela segunda vez. Porque isso não foi filtrado com uma condição do comando WHERE? Não é possível usar funções agregadas (SUM, COUNT, AVG, etc) em um WHERE.
O conto da Cesgranrio nessa questão foi ter perguntado quais os fornecedores que fornecem esse produto. Pois a query retorna produtos.
De resto, o comando tá bem conciso e simples.
SELECT P.cod-produto, SUM (quantidade) ## seleciona o código do produto e a soma da quantidade
FROM PRODUTO P, FORNECEDOR F, COMPRADO C ## declara todas as tabelas usadas na query
WHERE P.cod-produto = C.cod-produto AND C.CNPJ = F.CNPJ ## clausulas do JOIN implícito
AND F.tipo = 'agricultura familiar' ## primeiro filtro, condição.
GROUP BY P.cod-produto HAVING SUM (quantidade) > 10000 ## remove produtos duplicados e filtra pela segunda vez. Porque isso não foi filtrado com uma condição do comando WHERE? Não é possível usar funções agregadas (SUM, COUNT, AVG, etc) em um WHERE.
O conto da Cesgranrio nessa questão foi ter perguntado quais os fornecedores que fornecem esse produto. Pois a query retorna produtos.
De resto, o comando tá bem conciso e simples.
SELECT P.cod-produto, SUM (quantidade) ## seleciona o código do produto e a soma da quantidade
FROM PRODUTO P, FORNECEDOR F, COMPRADO C ## declara todas as tabelas usadas na query
WHERE P.cod-produto = C.cod-produto AND C.CNPJ = F.CNPJ ## clausulas do JOIN implícito
AND F.tipo = 'agricultura familiar' ## primeiro filtro, condição.
GROUP BY P.cod-produto HAVING SUM (quantidade) > 10000 ## remove produtos duplicados e filtra pela segunda vez. Porque isso não foi filtrado com uma condição do comando WHERE? Não é possível usar funções agregadas (SUM, COUNT, AVG, etc) em um WHERE.
O conto da Cesgranrio nessa questão foi ter perguntado quais os fornecedores que fornecem esse produto. Pois a query retorna produtos.
De resto, o comando tá bem conciso e simples.
SELECT P.cod-produto, SUM (quantidade) ## seleciona o código do produto e a soma da quantidade
FROM PRODUTO P, FORNECEDOR F, COMPRADO C ## declara todas as tabelas usadas na query
WHERE P.cod-produto = C.cod-produto AND C.CNPJ = F.CNPJ ## clausulas do JOIN implícito
AND F.tipo = 'agricultura familiar' ## primeiro filtro, condição.
GROUP BY P.cod-produto HAVING SUM (quantidade) > 10000 ## remove produtos duplicados e filtra pela segunda vez. Porque isso não foi filtrado com uma condição do comando WHERE? Não é possível usar funções agregadas (SUM, COUNT, AVG, etc) em um WHERE.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo