Você está na página 1de 7

Resolução comentada de questões SQL

Rafael Bittencourt (@profrafaelbitten).


Sérgio Sierro (@sergiosierro)
Comunidade de Análise de Dados (@comunidadeanalisededados)
9/4/2023

Questão – SQL FGV

A)

select d.pessoa2 from descendencia d

where d.relação = 'filha(o)' and count(*) > 1

group by d.pessoa2

B)

select d.pessoa2 from descendencia d

where d.relação = 'filha(o)'

group by d.pessoa2

having count(*) > 1

C)

select d.pessoa2 from descendencia d

where d.relação = 'filha(o)'

Página 1 de 7
having count(*) > 1

D)

select d.pessoa2 from descendencia d

where d.relação = 'filha(o)' and sum(1) > 1

group by d.pessoa2

E)

select distinct d.pessoa1 from descendencia d

where d.relação = 'filha(o)' and count(*) > 1

group by d.pessoa2

RESOLUÇÃO:
Inicialmente, vamos relembrar que um Banco de Dados ou Base de Dados,
(BD) em breve síntese, pode ser entendido como uma coleção de dados
interrelacionados sobre determinado domínio. Por exemplo, um banco de
dados que armazene dados da execução orçamentária e financeira do
Governo Federal (Siafi). Nesse banco de dados, esperamos encontrar dados
de empenhos, empresas favorecidas, unidade gestoras emissoras dos
empenhos, dentre outros.

Já quando pensamos em um Banco de Dados Relacional, estamos nos


referindo a um banco de dados onde os dados estão organizados
logicamente em tabelas, onde cada tabela é um subconjunto de dados desse
Banco de Dados (na hipótese de nosso BD possuir mais de uma tabela)
estruturados no formato colunas x linhas. As colunas descrevem os campos
desses dados (são também denominado de atributos) e cada linha é um
registro.
Pegando nosso exemplo acima, uma tabela possível desse BD do Siafi seria
a tabela de Empenhos, onde possíveis colunas seriam a Unidade Gestora
emitente, o Favorecido do Empenho, o Valor do Empenho, a Data de
Emissão etc.
Assim, cada linha nessa tabela seria o registro de um empenho emitido,
captaram?
Vale lembrar que dados armazenados em banco de dados relacional são
considerados DADOS ESTRUTURADOS.

Página 2 de 7
Na questão dada pela banca, temos uma tabela com três colunas: pessoa1,
relação e pessoa2. Basicamente, essa tabela está armazenando dados
referentes ao relacionamento entre duas pessoas. NESSA ORDEM, pessoa1
->relação -> pessoa2. A ordem é importante, pois, o tipo de relação muda.
Por exemplo, se a pessoa1 é filha da pessoa2, a pessoa2 seria a mãe/pai da
pessoa1, captaram?
Dito isso, a banca está pedindo o Comando SQL que retorna, como
resultado da consulta, apenas as pessoas que possuem mais de um filho.
Lembre que SQL, acrônimo de Structured Query Language, ou no
português Linguagem de Consulta Estruturada, é a linguagem padrão
para armazenar, manipular e recuperar dados em bancos de dados
relacionais.

Podemos ainda dividir os comandos SQL em quatro grupos (classificação


mais usual): DDL, DML, DCL e TCL

• DDL, acrônimo de Data Definition Language, Linguagem de


Definição de Dados, responsável pela criação do Banco e pela
definição de como os dados devem ser estruturados logicamente no
banco. Comandos para vocês lembrarem: CREATE, ALTER,
DROP. É por meio da DDL que eu crio a estrutura das minhas tabelas,
quais campos irão compor, os tipos de dados desses campos,
entenderam? Quando eu altero uma estrutura de uma tabela ou a
removo, também estamos falando de DDL. IMPORTANTE,
ESTOU ME REFERINDO À ESTRUTURA LÓGICA DAS
TABELAS E NÃO DOS REGISTROS (DADOS ALI
ARMAZENADOS);

• DML, acrônimo Data Manipulation Language, Linguagem de


Manipulação de Dados, como o próprio nome sugere, visa a
manipular os dados em um banco de dados, isto é, armazenar,
atualizar/modificar, recuperar/consultar e excluir os dados
armazenados em um banco. É a parte do SQL mais conhecida e de
maior importância para uma Analista de Dados, os comandos mais
comuns: SELECT, INSERT, UPDATE, DELETE;

Página 3 de 7
• DDL, acrônimo de Data Control Language, Linguagem de Controle
de Dados, é o grupo de comandos do SQL responsável pelo controle
de acesso aos dados, quem pode acessar, qual tipo de permissão
(somente recuperar dados, recuperar, inserir e alterar etc.). Isso é
muito importante quando lidamos com dados sensíveis, sigilosos,
assim queremos restringir o acesso a esses dados apenas aos usuários
autorizados. Exemplos: GRANT, REVOKE;

• TCL, acrônimo de Transaction Control Language, Linguagem de


Controle de Transações é o grupo de comandos do SQL responsável
pelo gerenciamento das transações a fim de manter a consistência
do Banco. Como o edital do TCU não cobrou, não precisa aprofundar.
Exemplos: COMMIT, ROLLBACK.

A questão versa sobre consultas/recuperação de dados, então estamos


falando de DML.
Pessoal, aqui fica uma dica preciosa. Quando alguma questão falar sobre
algum tipo de operação nos dados de uma tabela, como contagem de linhas
retornadas, soma, média, de determinada coluna numérica, há grandes
chances de estar exigindo conhecimento sobre AGRUPAMENTO e
OPERAÇÕES DE AGRUPAMENTO, o famoso comando GROUP BY.

É o caso dessa questão. Mas antes de explicar esse agrupamento, seria


necessário que vocês tivessem a seguinte sacada. Na tabela dada, só estamos
armazenando a relação de que a pessoa1 é FILHA(O) da pessoa2. Por
lógica, se a pessoa1 é FILHO(A) da pessoa2, a pessoa2 é PAI/MAE (Possui
como filho) a pessoa1. Sacaram?

Assim, quando se pede uma consulta que retorne as pessoas que possuem
mais de um filho, está pedindo a CONTAGEM de linhas (registros) em
que o nome de determinada pessoa consta na coluna pessoa2, com a
relação “filho”. Depois disso, irei filtrar e só retornar o nome dessa
pessoa2, cuja contagem de linhas retornadas for MAIOR QUE UM.

Assim, já sabemos que o campo de interesse a ser retornado é pessoa2, e a


relação é “'filha(o)' nosso primeiro trecho da consulta ficaria assim:

Página 4 de 7
Select pessoa2 from descendencia
where relação = 'filha(o)'

Pessoal, também é comum darmos aliases (apelidos) às tabelas que estamos


consultando, isso é bastante empregado para desambiguação de colunas entre
tabelas. Isto é, quando temos na nossa consulta duas tabelas que possuem
colunas com mesmo, para diferenciar, damos apelidos distintos as essas
tabelas. Com uso de aliases, nosso trecho inicial da consulta ficaria assim

Select d.pessoa2 from descendencia d


where d.relação = 'filha(o)'

Podemos dar aliases a uma tabela colocando esse apelido após o nome da
tabela “descendencia d” ou com uso da expressão as “descendencia as d”

Aliases também podem ser usados para renomear as colunas retornadas,


desse jeito:
Select d.pessoa2 as pessoa_pai_mae from descendencia d
where d.relação = 'filha(o)'
ou
Select d.pessoa2 pessoa_pai_mae from descendencia d
where d.relação = 'filha(o)'

Agora, a gente precisa fazer a parte do agrupamento, certo? Faremos por


meio da expressão SQL Group By. A nossa coluna de interesse em que
iremos agrupar as linhas é a pessoa2, certo?
Para fazer essa contagem de linhas nesse agrupamento, iremos usar a função
COUNT(). Desse modo, se quiséssemos retornar o nome da pessoa e a
quantidade de filhos que ela possui (isto é, a quantidade de linhas em que
essa pessoa aparece na coluna pessoa2 com relação “filha(o)”), faríamos

Página 5 de 7
Select d.pessoa2, count(*) from descendencia d
where d.relação = 'filha(o)'
Group by d.pessoa2
Ou essa mesma consulta usando aliases e ordenando alfabeticamente pelo
nome da pessoa2
Select d.pessoa2 as nome_pessoa, count(*) as quantidade_filhos from
descendencia d
where d.relação = 'filha(o)'
Group by d.pessoa2
Order By d.pessoa2
IMPORTANTE: para contarmos todas as linhas retornadas para um
determinado agrupamento, usamos o count (*)

Para os registros da tabela dependência, a consulta acima retornaria os


seguintes registros (vou adotar ordem alfabética:
nome_pessoa quantidade_filhos
Aurora 1
Bruna 2
João 1
Maria 1
Rafael 2
Rita 1

Mas o que questão me pede não é isso, certo? Ela pede que a consulta
retorne somente as pessoas que possuam mais de um filho
Ou seja, eu preciso aplicar um filtro APÓS O AGRUPAMENTO. Para
isso, usamos a expressão HAVING.
Pessoal, os filtros inseridos na cláusula WHERE são avaliados ANTES da
operação de agrupamento. Já o HAVING é um filtro usado APÓS a
operação de agrupamento (group by) e podemos trabalhar com as funções de
agregação, como o COUNT.

Página 6 de 7
NÃO USAMOS FILTROS COM FUNÇÕES DE AGREGAÇÃO
DENTRO DA CLÁUSULA WHERE, OK?

Vamos agora construir nossa consulta final?


select d.pessoa2 from descendencia d
/* Estou interessado em retornar os nomes contidos na coluna pessoa2 da
tabela descendência */
where d.relação = 'filha(o)'
--Mas só quero retornar para os registros onde a relação seja ‘filha(o)’
group by d.pessoa2
having count(*) > 1
/*Além disso, irei agrupar o resultado pela coluna pessoa2, trazendo como
resultado da consulta apenas os nomes contidos na coluna pessoa2 da tabela
descendencia que APAREÇAM EM MAIS DE UM REGISTRO EM QUE
O VALOR DA COLUNA RELACAO SEJA ‘filha(o)’.
*/

GABARITO LETRA B

Página 7 de 7

Você também pode gostar