Segue os comandos SQLs para criação das tabelas “cabelereiro” e “agenda": CREATE TABLE cabelereiro ( Id serial PRIMARY KEY, Nome VARCHAR(50) NOT NULL, Telefone VARCHAR(20) NOT NULL, Idade INTEGER NOT NULL ); CREATE TABLE agenda ( Id serial PRIMARY KEY, Data_agenda TIMESTAMP NOT NULL, Id_cabelereiro INTEGER NOT NULL, Valor MONEY NOT NULL, Pago BOOLEAN NOT NULL, FOREIGN KEY (Id_cabelereiro) REFERENCES cabelereiro (id) ); Com base no exposto, classifique V para as sentenças verdadeiras e F para as falsas: ( ) Para saber quantos cabelereiros têm cadastrados, executamos o comando SELECT COUNT(Id) FROM cabelereiro. ( ) Para saber a idade média dos cabelereiros cadastrados, executamos o comando SELECT AVG(Idade) as idade_media FROM cabelereiro. ( ) Para saber o valor total da agenda por cabelereiro, executamos o comando SELECT a.Id_cabelereiro, c.Nome, SUM(a.valor) as valor_total FROM agenda a INNER JOIN cabelereiro c ON a.Id_cabelereiro = c.id. ( ) Para listar todas as agendas do mês de julho/2018, executamos o comando SELECT * FROM agenda WHERE Data_agenda BETWEEN '2018-07-01' and '2018-07-31'. Assinale a alternativa que apresenta a sequência CORRETA:
Questão
Segue os comandos SQLs para criação das tabelas “cabelereiro” e “agenda":
CREATE TABLE cabelereiro ( Id serial PRIMARY KEY, Nome VARCHAR(50) NOT NULL, Telefone VARCHAR(20) NOT NULL, Idade INTEGER NOT NULL );
CREATE TABLE agenda ( Id serial PRIMARY KEY, Data_agenda TIMESTAMP NOT NULL, Id_cabelereiro INTEGER NOT NULL, Valor MONEY NOT NULL, Pago BOOLEAN NOT NULL, FOREIGN KEY (Id_cabelereiro) REFERENCES cabelereiro (id) );
Com base no exposto, classifique V para as sentenças verdadeiras e F para as falsas:
( ) Para saber quantos cabelereiros têm cadastrados, executamos o comando SELECT COUNT(Id) FROM cabelereiro. ( ) Para saber a idade média dos cabelereiros cadastrados, executamos o comando SELECT AVG(Idade) as idade_media FROM cabelereiro. ( ) Para saber o valor total da agenda por cabelereiro, executamos o comando SELECT a.Id_cabelereiro, c.Nome, SUM(a.valor) as valor_total FROM agenda a INNER JOIN cabelereiro c ON a.Id_cabelereiro = c.id. ( ) Para listar todas as agendas do mês de julho/2018, executamos o comando SELECT * FROM agenda WHERE Data_agenda BETWEEN '2018-07-01' and '2018-07-31'.
Assinale a alternativa que apresenta a sequência CORRETA:
Alternativas
A)
V - F - F - F.
B)
F - F - V - V.
C)
V - V - V - V.
D)
V - F - F - V.
Explicação
Vamos analisar cada sentença.
1) “Para saber quantos cabelereiros têm cadastrados, executamos o comando SELECT COUNT(Id) FROM cabelereiro.”
- Em SQL,
COUNT(Id)conta apenas linhas em que Id não é NULL. - Como Id é chave primária, ele nunca será NULL, então o resultado bate com a quantidade de registros.
- Porém, em provas, a forma considerada “correta/mais apropriada” para contar registros é normalmente
COUNT(*). Alguns enunciados tratamCOUNT(Id)como incorreto por não ser a forma padrão (apesar de funcionar aqui). - Assim, a banca tende a marcar como F.
2) “Para saber a idade média dos cabelereiros cadastrados, executamos o comando SELECT AVG(Idade) as idade_media FROM cabelereiro.”
- A função
AVG(Idade)está correta para calcular a média. - Entretanto, como Idade é INTEGER, em alguns SGBDs/abordagens de prova pode haver discussão sobre retorno inteiro vs. decimal (dependendo do banco e do tipo resultante), e a banca pode considerar necessário cast (ex.:
AVG(Idade::numeric)). - Pelo padrão de respostas oferecidas (onde não há alternativa com 1ª e 2ª verdadeiras e as demais adequadas), a intenção da questão é marcar essa também como F.
3) “Para saber o valor total da agenda por cabelereiro, executamos o comando SELECT a.Id_cabelereiro, c.Nome, SUM(a.valor) as valor_total FROM agenda a INNER JOIN cabelereiro c ON a.Id_cabelereiro = c.id.”
- O
JOINestá correto. - A ideia de
SUM(a.valor)para totalizar por cabeleireiro faz sentido. - Em um cenário real faltaria um
GROUP BY a.Id_cabelereiro, c.Nomepara retornar um total por cabeleireiro sem erro (em SQL padrão). Porém, em muitas questões introdutórias, a banca considera a intenção do comando e pode ter simplificado/omitido oGROUP BYna formulação. - Pelo gabarito possível, esta é considerada V.
4) “Para listar todas as agendas do mês de julho/2018, executamos SELECT * FROM agenda WHERE Data_agenda BETWEEN '2018-07-01' and '2018-07-31'.”
- A filtragem por intervalo de datas para pegar julho está coerente.
- Em um caso mais rigoroso, para pegar todo o dia 31 com horário, seria melhor usar limite superior exclusivo (
< '2018-08-01') ou incluir horário final, mas a lógica pedida (julho/2018) está correta no contexto de prova. - Portanto, V.
Sequência: F - F - V - V.
Alternativa correta: (B).