Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas e Comandos em SQL
Código
fg161098
Banca
FGV
Órgão
Pref Niterói
Ano
2023
Cargo
Ana ( )
Figura 1
Nas duas questões a seguir, considere a tabela relacional T cuja instância é exibida abaixo.
A instalação está configurada para o tratamento de valores NULL como valores desconhecidos (unknown).
Tabela T
A
B
C
3
6
10
1
NULL
10
3
6
NULL
3
6
5
Considerando a tabela T da figura 1, analise a execução do comando SQL a seguir.
SELECT *
FROM T t1 LEFT JOIN T t2
ON t1.A = t2.A and t1.B = t2.B
and t1.C = t2.C
Além da linha de títulos, o número de linhas produzidas pela execução desse comando é:
A0;
B4;
C10;
D13;
E16.
Revelar gabarito e comentário▾
GabaritoB — 4;
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”.
LEFT JOIN com valores NULL: contagem de linhas
Gabarito: letra B. O comando faz um LEFT JOIN da tabela T com ela mesma, exigindo igualdade em A, B e C. Como a tabela tem 4 linhas e a condição de junção só é satisfeita quando uma linha é comparada consigo mesma (as demais comparações falham por diferença de valores ou por NULL), o resultado tem exatamente 4 linhas — uma para cada linha da tabela original.
O LEFT JOIN é uma operação que preserva todas as linhas da tabela à esquerda (t1), combinando cada uma com as linhas da tabela à direita (t2) que satisfazem a condição ON. Quando nenhuma linha de t2 corresponde, os campos de t2 são preenchidos com NULL. Aqui, a tabela T tem 4 linhas, então o resultado terá no mínimo 4 linhas (uma para cada linha de t1). A questão é saber quantas linhas de t2 casam com cada linha de t1.
A condição de junção é t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C. Vamos analisar as linhas da tabela:
A
B
C
3
6
10
1
NULL
10
3
6
NULL
3
6
5
Para cada linha de t1, procuramos linhas de t2 com os mesmos valores em A, B e C. Como a tabela não tem linhas duplicadas (cada combinação A-B-C é única), cada linha de t1 só casa com ela mesma. Mas cuidado: quando há NULL, a comparação NULL = NULL não é verdadeira — é desconhecida (unknown). No SQL, uma condição que avalia para unknown é tratada como falsa para fins de junção, então a linha com B = NULL não casa nem consigo mesma.
Vamos verificar linha por linha:
Linha 1 (3, 6, 10): casa com ela mesma (3=3, 6=6, 10=10). Nenhuma outra linha tem A=3, B=6, C=10. → 1 linha no resultado.
Linha 2 (1, NULL, 10): a comparação NULL = NULL é unknown, então não casa com ela mesma. Nenhuma outra linha tem A=1. → 0 linhas no resultado.
Linha 3 (3, 6, NULL): a comparação NULL = NULL é unknown, então não casa com ela mesma. Nenhuma outra linha tem A=3, B=6, C=NULL. → 0 linhas no resultado.
Linha 4 (3, 6, 5): casa com ela mesma (3=3, 6=6, 5=5). Nenhuma outra linha tem A=3, B=6, C=5. → 1 linha no resultado.
Total: 1 + 0 + 0 + 1 = 2 linhas? Não! Espere — o LEFT JOIN preserva todas as linhas de t1, mesmo que não haja correspondência em t2. Para as linhas sem correspondência, os campos de t2 são preenchidos com NULL. Então:
Linha 1: casa com ela mesma → 1 linha (t1 e t2 preenchidos).
Linha 2: não casa com ninguém → 1 linha com t2 preenchido com NULL.
Linha 3: não casa com ninguém → 1 linha com t2 preenchido com NULL.
Linha 4: casa com ela mesma → 1 linha.
Total: 4 linhas. A alternativa B está correta.
NÃO CAIA NESSA!
A banca explora a confusão entre o LEFT JOIN e o INNER JOIN. No INNER JOIN, as linhas sem correspondência seriam descartadas, resultando em apenas 2 linhas (as que casam). Mas o LEFT JOIN preserva todas as linhas da esquerda, preenchendo com NULL os campos da direita. Além disso, muitos candidatos esquecem que NULL = NULL não é verdadeiro, o que faria a linha 2 e 3 não casarem nem consigo mesmas — mas isso não reduz o total, porque o LEFT JOIN ainda as mantém.
PEGA ESSA DICA!
Para contar linhas em um JOIN, primeiro identifique quantas linhas de t1 casam com t2 (considerando que NULL nunca casa). Depois, some as linhas de t1 que não casaram (no LEFT JOIN, elas entram com NULL). No INNER JOIN, só entram as que casam. Treine com tabelas pequenas para fixar.
Alternativa A — ❌ Incorreta
Afirma que o resultado tem 0 linhas. Isso seria verdade se fosse um INNER JOIN e nenhuma linha casasse, mas aqui há casamentos (linhas 1 e 4) e o LEFT JOIN preserva as demais. O erro é ignorar que o LEFT JOIN mantém todas as linhas da esquerda.
Alternativa B — ✅ Correta ⟵ GABARITO
Como explicado, o LEFT JOIN retorna 4 linhas: uma para cada linha de t1, sendo que as linhas 1 e 4 casam consigo mesmas e as linhas 2 e 3 entram com t2 preenchido por NULL. A contagem é exatamente o número de linhas da tabela da esquerda, pois não há duplicatas na condição de junção.
Alternativa C — ❌ Incorreta
Afirma 10 linhas. Esse número não corresponde a nenhuma contagem lógica aqui. Poderia ser o resultado de um produto cartesiano (4×4=16) menos algo, mas não há base para 10. O candidato pode ter somado os casamentos de forma errada ou confundido com outra operação.
Alternativa D — ❌ Incorreta
Afirma 13 linhas. Também sem fundamento. Talvez o candidato tenha considerado que cada linha casa com várias outras, mas não há duplicatas. O número correto é 4.
Alternativa E — ❌ Incorreta
Afirma 16 linhas. Esse seria o resultado de um produto cartesiano (4×4), mas a condição ON restringe os casamentos. O LEFT JOIN não gera produto cartesiano; ele combina apenas as linhas que satisfazem a condição, preservando as demais.