Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas e Comandos em SQL
Código
fg161129
Banca
FGV
Órgão
Pref BH
Ano
2023
Cargo
APGG ( )
Considere a tabela T, com colunas A, Be C, descrita a seguir juntamente com a sua instância.
A
B
C
1
2
3
2
3
4
3
4
NULL
4
NULL
NULL
Considere, ainda, o comando SQL a seguir, que referencia a tabela T.
select t1.A X1, t1.B X2, t1.C X3, t2.A X4, t2.B X5, t2.C X6, t3.A X7, t1.B X8, t1.C X9 from T t1 LEFT OUTER JOIN T t2 on t1.a = t2.b RIGHT OUTER JOIN T t3 on t2.b = t3.c
Considerando a execução do comando SQL apresentado anteriormente, assinale a coluna do resultado que não contém valores nulos (null).
AX1.
BX3.
CX7.
DX9.
Revelar gabarito e comentário▾
GabaritoC — X7.
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: LEFT e RIGHT OUTER JOIN encadeados
Gabarito: letra C. A coluna X7 (t3.A) é a única que não contém valores nulos, porque a tabela t3 é a tabela preservada do RIGHT OUTER JOIN — a junção à direita garante que todas as linhas de t3 apareçam no resultado, e como t3 é uma referência à própria tabela T, que tem valores em A em todas as suas linhas, X7 nunca será nulo. As demais colunas (X1, X3, X9) podem receber nulos por causa das junções externas e dos valores nulos já existentes na tabela.
Para entender por que X7 é a resposta, é preciso dominar o comportamento das junções externas (OUTER JOIN) e a ordem de avaliação das cláusulas JOIN em SQL. Vamos por partes.
O que é um OUTER JOIN?
Um JOIN combina linhas de duas tabelas com base em uma condição. O INNER JOIN retorna apenas as linhas que têm correspondência nas duas tabelas. Já o OUTER JOIN preserva as linhas de uma das tabelas (ou de ambas, no FULL OUTER JOIN) mesmo quando não há correspondência, preenchendo as colunas da outra tabela com NULL.
LEFT OUTER JOIN: preserva todas as linhas da tabela à esquerda (a primeira mencionada). Se não houver correspondência na tabela da direita, as colunas desta recebem NULL.
RIGHT OUTER JOIN: preserva todas as linhas da tabela à direita (a segunda mencionada). Se não houver correspondência na tabela da esquerda, as colunas desta recebem NULL.
No comando da questão, temos dois JOINs encadeados:
FROM T t1
LEFT OUTER JOIN T t2 ON t1.a = t2.b
RIGHT OUTER JOIN T t3 ON t2.b = t3.c
A avaliação é feita da esquerda para a direita: primeiro o LEFT JOIN entre t1 e t2, e o resultado desse join é usado como tabela da esquerda para o RIGHT JOIN com t3.
Passo 1: LEFT OUTER JOIN entre t1 e t2
A condição é t1.a = t2.b. Vamos analisar linha por linha da tabela T (que tem 4 linhas):
t1.A
t1.B
t1.C
t2.A
t2.B
t2.C
1
2
3
2
3
4
2
3
4
3
4
NULL
3
4
NULL
4
NULL
NULL
4
NULL
NULL
NULL
NULL
NULL
Linha 1 (t1.A=1): procura t2.B=1. Não existe, então t2 fica tudo NULL.
Linha 2 (t1.A=2): procura t2.B=2. Não existe, então t2 fica tudo NULL.
Linha 3 (t1.A=3): procura t2.B=3. Existe (linha 2 da tabela), então t2 = (3,4,NULL).
Linha 4 (t1.A=4): procura t2.B=4. Existe (linha 3 da tabela), então t2 = (4,NULL,NULL).
Resultado do LEFT JOIN (4 linhas):
t1.A
t1.B
t1.C
t2.A
t2.B
t2.C
1
2
3
NULL
NULL
NULL
2
3
4
NULL
NULL
NULL
3
4
NULL
3
4
NULL
4
NULL
NULL
4
NULL
NULL
Passo 2: RIGHT OUTER JOIN com t3
A condição é t2.b = t3.c. O RIGHT JOIN preserva todas as linhas de t3 (a tabela da direita). Como t3 é uma referência à tabela T, ela tem 4 linhas. Para cada linha de t3, procuramos correspondência em t2.b:
t3 linha 1 (t3.c=3): procura t2.b=3. Existe (linha 3 do LEFT JOIN), então t2 = (3,4,NULL).
t3 linha 2 (t3.c=4): procura t2.b=4. Existe (linha 4 do LEFT JOIN), então t2 = (4,NULL,NULL).
t3 linha 3 (t3.c=NULL): procura t2.b=NULL. Não existe (NULL não é igual a NULL), então t2 fica tudo NULL.
t3 linha 4 (t3.c=NULL): idem, t2 fica tudo NULL.
Resultado final (4 linhas):
X1 (t1.A)
X2 (t1.B)
X3 (t1.C)
X4 (t2.A)
X5 (t2.B)
X6 (t2.C)
X7 (t3.A)
X8 (t1.B)
X9 (t1.C)
3
4
NULL
3
4
NULL
1
4
NULL
4
NULL
NULL
4
NULL
NULL
2
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
3
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
4
NULL
NULL
Observação: na primeira linha, t1 veio da linha 3 do LEFT JOIN (t1.A=3), e na segunda, da linha 4 (t1.A=4). Nas duas últimas, t1 não tem correspondência, então fica NULL.
Análise das colunas
X1 (t1.A): tem NULL nas linhas 3 e 4 → contém nulos.
X3 (t1.C): tem NULL em todas as linhas (na tabela original, C é NULL nas linhas 3 e 4, e nas linhas 1 e 2 também veio NULL por causa do RIGHT JOIN) → contém nulos.
X7 (t3.A): como t3 é a tabela preservada do RIGHT JOIN, todas as suas linhas aparecem. E como A nunca é NULL na tabela T (valores 1,2,3,4), X7 nunca é NULL → não contém nulos.
X9 (t1.C): igual a X3, contém nulos.
A pegadinha
A banca explora a confusão entre qual tabela é preservada em cada JOIN. No RIGHT JOIN, a tabela da direita (t3) é preservada, então suas colunas nunca recebem NULL por falta de correspondência. Já as colunas de t1 (X1, X3, X9) podem receber NULL tanto pelos valores nulos originais quanto pela falta de correspondência no RIGHT JOIN.
1LEFT JOIN t1-t2
2RIGHT JOIN com t3
3Identificar tabela preservada
4Verificar colunas sem NULL
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
X1 (t1.A) contém nulos. No resultado final, as linhas 3 e 4 têm X1 = NULL, porque t1 não teve correspondência no RIGHT JOIN com t3 (a condição t2.b = t3.c não encontrou par para essas linhas). Além disso, mesmo que houvesse correspondência, t1.A poderia ser NULL se a linha original tivesse NULL em A — mas na tabela T, A nunca é NULL. O problema aqui é a falta de correspondência no RIGHT JOIN.
Alternativa B — ❌ Incorreta
X3 (t1.C) contém nulos. Na tabela original, C é NULL nas linhas 3 e 4. E no RIGHT JOIN, as linhas 3 e 4 do resultado (que correspondem a t3 linhas 3 e 4) não têm correspondência com t2, então t1 fica todo NULL, incluindo C. Portanto, X3 tem NULL em todas as linhas do resultado.
Alternativa C — ✅ Correta ⟵ GABARITO
X7 (t3.A) é a única coluna sem nulos. O RIGHT OUTER JOIN preserva todas as linhas da tabela da direita (t3), que é uma referência à tabela T. Como a coluna A da tabela T tem valores 1, 2, 3 e 4 (nunca NULL), todas as linhas de t3 têm A preenchido. E como t3 é preservada, nenhuma linha de t3 é descartada ou recebe NULL em suas colunas. Portanto, X7 nunca é NULL.
Alternativa D — ❌ Incorreta
X9 (t1.C) é idêntica a X3, então contém nulos. A coluna C da tabela T tem NULL nas linhas 3 e 4, e no RIGHT JOIN, as linhas sem correspondência fazem t1.C ficar NULL. Logo, X9 tem NULL em todas as linhas do resultado.
NÃO CAIA NESSA!
A banca troca o papel das tabelas no JOIN: no RIGHT OUTER JOIN, a tabela preservada é a da direita (t3), não a da esquerda. O candidato que confunde LEFT com RIGHT tende a marcar X1 (t1.A), achando que t1 é preservada. Lembre-se: RIGHT preserva a direita, LEFT preserva a esquerda. Com treino, você enxerga essa troca de longe 💪
PEGA ESSA DICA!
Para resolver questões de JOIN encadeado, monte o resultado passo a passo: primeiro o JOIN mais à esquerda, depois use esse resultado como tabela da esquerda para o próximo JOIN. E lembre-se: a tabela preservada de um OUTER JOIN nunca tem suas colunas preenchidas com NULL por falta de correspondência — só as colunas da outra tabela é que podem receber NULL.