Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — CESPE / CEBRASPE 2024

Banco de DadosBanco de Dados Relacionais
Código
ce190772
Banca
CESPE / CEBRASPE
Órgão
TSE
Ano
2024
Nível
Médio
Cargo
Técnico Judiciário – Área: Apoio Especializado – Especialidade: Programação de Sistemas
No modelo a seguir, idProcesso da tabela Processo e IdOrgao da tabela Orgao são chaves primárias, NN corresponde a not null e FK, a foreign key.Captura_de tela 2024-12-17 085713.png 396×168Com base no modelo e nas informações precedentes, julgue o item subsecutivo.Considere que as tabelas e o relacionamento entre elas tenham sido corretamente criados, conforme o modelo apresentado, e que os seguintes comandos tenham sido executados com sucesso.INSERT INTO Orgao VALUES (1,'TRE-SC'); INSERT INTO Orgao VALUES (2,'TRE-PR'); INSERT INTO Processo VALUES (1,'111', 1); INSERT INTO Processo VALUES (2,'222', NULL);Nesse caso, a execução do comando a seguir apresentará 2 como resultado.SELECT count(orgao.IdOrgao) FROM Processo right JOINOrgao ON processo.idorgao = orgao.idorgao;
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Junções SQL: RIGHT JOIN e contagem de linhas

Gabarito: Certo (C). A consulta SELECT count(orgao.IdOrgao) FROM Processo right JOIN Orgao ON processo.idorgao = orgao.idorgao retornará 2, porque o RIGHT JOIN preserva todas as linhas da tabela à direita (Orgao), que possui exatamente 2 registros, e a função COUNT(orgao.IdOrgao) conta apenas os valores não nulos dessa coluna — como ambos os órgãos têm IdOrgao preenchido, o resultado é 2. A pegadinha está em pensar que o RIGHT JOIN incluiria o processo com idOrgao = NULL, mas isso não acontece porque a linha do processo sem órgão não tem correspondência na tabela Orgao — e mesmo que tivesse, o COUNT sobre a coluna da tabela Orgao ignoraria nulos.

O RIGHT JOIN (junção externa à direita) é um dos três tipos de junção externa em SQL, junto com LEFT JOIN e FULL OUTER JOIN. A ideia central é: ele retorna todas as linhas da tabela à direita (no caso, Orgao), mesmo que não haja correspondência na tabela à esquerda (Processo). Quando não há correspondência, as colunas da tabela à esquerda vêm preenchidas com NULL. Já o INNER JOIN retornaria apenas as linhas com correspondência em ambas as tabelas, descartando qualquer linha sem par.

Vamos aplicar isso ao caso concreto. As tabelas após os INSERTs ficam assim:

Tabela Orgao:

IdOrgao

Nome

1

TRE-SC

2

TRE-PR

Tabela Processo:

idProcesso

numero

idOrgao

1

111

1

2

222

NULL

Ao executar o RIGHT JOIN, o SGBD combina cada linha de Processo com as linhas de Orgao que satisfazem a condição processo.idorgao = orgao.idorgao. O processo 1 (idOrgao = 1) casa com o órgão 1 (TRE-SC). O processo 2 (idOrgao = NULL) não casa com nenhum órgão, pois NULL nunca é igual a qualquer valor. Como é um RIGHT JOIN, todas as linhas de Orgao aparecem no resultado, mesmo as que não têm correspondência — mas aqui ambas têm. O resultado intermediário da junção é:

idProcesso

numero

idOrgao (Processo)

IdOrgao (Orgao)

Nome

1

111

1

1

TRE-SC

NULL

NULL

NULL

2

TRE-PR

Agora, o COUNT(orgao.IdOrgao) conta quantas linhas têm valor não nulo na coluna IdOrgao da tabela Orgao. Na primeira linha, o valor é 1; na segunda, é 2. Nenhuma é NULL, então o COUNT retorna 2. Se a consulta fosse COUNT(*), contaria todas as linhas do resultado — também 2, neste caso. Mas se houvesse um órgão sem processos, o RIGHT JOIN o incluiria com as colunas de Processo nulas, e o COUNT(orgao.IdOrgao) ainda contaria essa linha, pois o IdOrgao do órgão não é nulo.

A distinção crucial aqui é entre COUNT(*) e COUNT(coluna). Enquanto COUNT(*) conta todas as linhas do resultado, COUNT(coluna) ignora linhas onde a coluna especificada é NULL. Nesta questão, como a coluna contada é da tabela à direita (que é preservada integralmente pelo RIGHT JOIN), e todos os seus valores são não nulos, o resultado é exatamente o número de órgãos: 2.

NÃO CAIA NESSA!

A banca explora a confusão entre COUNT(*) e COUNT(coluna). O candidato pode pensar que, como o RIGHT JOIN inclui o processo com idOrgao = NULL, o COUNT contaria 3 linhas. Mas o COUNT(orgao.IdOrgao) ignora nulos — e, além disso, a linha do processo sem órgão nem aparece no resultado, pois o RIGHT JOIN preserva as linhas da tabela à direita (Orgao), não as da esquerda (Processo). Se fosse um LEFT JOIN, aí sim o processo 2 apareceria com IdOrgao nulo, mas o COUNT(orgao.IdOrgao) ainda o ignoraria. A pegadinha é dupla: entender qual tabela é preservada e como o COUNT trata nulos.

PEGA ESSA DICA!

Para resolver questões de junção, monte mentalmente (ou no rascunho) o resultado da junção linha a linha, com as colunas de ambas as tabelas. Depois, aplique a função de agregação sobre a coluna indicada, lembrando que COUNT(coluna) ignora NULL. Treine com os quatro tipos de junção (INNER, LEFT, RIGHT, FULL) e com COUNT(*) versus COUNT(coluna) — essa combinação é clássica em provas.

1Preserva tabela à direita
Todas as linhas de Orgao
Sem correspondência → NULL à esquerda
2COUNT(coluna)
Ignora valores NULL
Conta apenas preenchidos
3Resultado
2 órgãos → COUNT = 2
RIGHT JOIN
LEVELsoulevel.com.br
RIGHT JOIN: Preserva tabela à direita (Todas as linhas de Orgao, Sem correspondência → NULL à esquerda); COUNT(coluna) (Ignora valores NULL, Conta apenas preenchidos); Resultado (2 órgãos → COUNT = 2)

Item — ✅ CERTO

A assertiva afirma que a execução do comando apresentará 2 como resultado. Isso está correto. O RIGHT JOIN preserva todas as linhas de Orgao (2 registros), e o COUNT(orgao.IdOrgao) conta os valores não nulos dessa coluna — ambos preenchidos. O processo com idOrgao = NULL não gera linha extra no resultado, pois o RIGHT JOIN não preserva linhas da tabela à esquerda sem correspondência. Portanto, o resultado é exatamente 2.

Gabarito: Certo (C).

Link permanente: /questoes/ce190772