Na questão 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).
Considerando a tabela T da figura 1, analise a execução do comando SQL a seguir.SELECT *FROM T t1 LEFT JOIN T t2ON t1.A = t2.A and t1.B = t2.Band t1.C = t2.CAlé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 múltiplas condições e valores NULL
Gabarito: letra B (4 linhas). O comando SELECT * FROM T t1 LEFT JOIN T t2 ON t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C produz 4 linhas, além da linha de títulos. Isso ocorre porque o LEFT JOIN preserva todas as linhas da tabela da esquerda (t1), mas a condição de junção compara os valores das colunas A, B e C entre as duas instâncias da tabela T. Como a tabela T possui 4 linhas, e a condição de junção é uma igualdade composta, apenas as linhas que têm correspondência exata em todas as três colunas (considerando que NULL não é igual a NULL) geram pares. Neste caso, apenas a linha com valores (3, 6, 10) tem correspondência em outra linha da própria tabela, resultando em 4 linhas no resultado final (2 pares da linha correspondente + 2 linhas sem correspondência, preenchidas com NULL).
O LEFT JOIN é um tipo de junção externa que retorna todos os registros da tabela à esquerda (t1) e os registros correspondentes da tabela à direita (t2). Quando não há correspondência, os campos da tabela à direita são preenchidos com NULL. A condição de junção ON especifica como as linhas das duas tabelas são combinadas. Nesta questão, a condição é uma conjunção de três igualdades: t1.A = t2.A, t1.B = t2.B e t1.C = t2.C. Isso significa que, para duas linhas serem combinadas, os valores de A, B e C devem ser iguais entre si.
O ponto crucial é o tratamento de valores NULL. A instalação está configurada para tratar NULL como desconhecido (unknown). Na lógica de três valores (TRUE, FALSE, UNKNOWN) do SQL, uma comparação com NULL nunca é verdadeira — NULL = NULL resulta em UNKNOWN, não em TRUE. Portanto, linhas que contêm NULL em qualquer uma das colunas A, B ou C não podem ser combinadas com nenhuma outra linha, nem mesmo com outra linha que tenha NULL na mesma coluna. Isso elimina automaticamente as linhas com NULL da possibilidade de formar pares.
Vamos analisar a tabela T fornecida:
A
B
C
3
6
10
1
NULL
10
3
6
NULL
3
6
5
A tabela tem 4 linhas. Vamos verificar quais linhas podem ser combinadas entre si:
Linha 1 (3, 6, 10): Não tem NULL. Pode ser comparada com as outras linhas.
Linha 2 (1, NULL, 10): Tem NULL na coluna B. Qualquer comparação envolvendo B será UNKNOWN, então não pode ser combinada com nenhuma linha.
Linha 3 (3, 6, NULL): Tem NULL na coluna C. Não pode ser combinada com nenhuma linha.
Linha 4 (3, 6, 5): Não tem NULL. Pode ser comparada com as outras linhas.
Agora, vamos verificar as combinações possíveis entre as linhas sem NULL (linhas 1 e 4):
Linha 1 com Linha 1: A=3, B=6, C=10. A condição é verdadeira (3=3, 6=6, 10=10). Combina.
Linha 1 com Linha 4: A=3, B=6, C=10 vs C=5. A condição é falsa (10≠5). Não combina.
Linha 4 com Linha 1: A=3, B=6, C=5 vs C=10. A condição é falsa (5≠10). Não combina.
Linha 4 com Linha 4: A=3, B=6, C=5. A condição é verdadeira (3=3, 6=6, 5=5). Combina.
Portanto, apenas as linhas 1 e 4 têm correspondência consigo mesmas. O LEFT JOIN retorna:
Para a linha 1 de t1: combina com a linha 1 de t2 (1 par). Como não há outra correspondência, apenas 1 linha no resultado.
Para a linha 2 de t1: não há correspondência, então retorna a linha de t1 com campos de t2 preenchidos com NULL (1 linha).
Para a linha 3 de t1: não há correspondência, então retorna a linha de t1 com campos de t2 preenchidos com NULL (1 linha).
Para a linha 4 de t1: combina com a linha 4 de t2 (1 par). Como não há outra correspondência, apenas 1 linha no resultado.
A pegadinha desta questão está no tratamento de NULL. Muitos candidatos podem pensar que linhas com NULL em uma coluna podem ser combinadas com outras linhas que tenham NULL na mesma coluna, mas isso é incorreto. Na lógica SQL, NULL = NULL não é verdadeiro; é UNKNOWN. Portanto, essas linhas ficam sem correspondência e são retornadas apenas uma vez, com os campos da direita preenchidos com NULL.
Outra pegadinha é a diferença entre LEFT JOIN e INNER JOIN. O INNER JOIN retornaria apenas as linhas que têm correspondência, ou seja, 2 linhas (os pares das linhas 1 e 4). O LEFT JOIN preserva todas as linhas da esquerda, adicionando as linhas sem correspondência com NULL. Por isso, o resultado é 4, não 2.
LEFT JOIN (preserva t1): Com correspondência (Linha 1 (3,6,10) → 1 par, Linha 4 (3,6,5) → 1 par); Sem correspondência (Linha 2 (1,NULL,10) → NULL, Linha 3 (3,6,NULL) → NULL); Regra NULL (NULL = NULL → UNKNOWN, Nunca combina)
Alternativa A — ❌ Incorreta
Afirma que o resultado tem 0 linhas. Isso seria verdade se a condição de junção nunca fosse satisfeita, mas as linhas 1 e 4 têm correspondência consigo mesmas, gerando pares. Além disso, o LEFT JOIN sempre retorna pelo menos as linhas da tabela da esquerda, então o resultado nunca é 0 quando a tabela da esquerda tem linhas.
Alternativa B — ✅ Correta ⟵ GABARITO
O resultado tem 4 linhas, como demonstrado: 2 pares (linhas 1 e 4) + 2 linhas sem correspondência (linhas 2 e 3, com NULL nos campos de t2). O LEFT JOIN preserva todas as 4 linhas de t1, e apenas as linhas 1 e 4 têm correspondência, gerando 1 linha cada. As linhas 2 e 3 não têm correspondência, mas ainda são retornadas com NULL. Total: 4.
Alternativa C — ❌ Incorreta
Afirma que o resultado tem 10 linhas. Esse número não corresponde a nenhuma lógica do LEFT JOIN com esta tabela. O máximo de linhas possíveis seria o produto cartesiano (4 × 4 = 16), mas a condição de junção restringe. 10 não é um valor plausível para este caso.
Alternativa D — ❌ Incorreta
Afirma que o resultado tem 13 linhas. Esse número também não é justificável. O LEFT JOIN com 4 linhas na esquerda pode gerar no máximo 4 linhas (se nenhuma tiver correspondência) ou mais se houver múltiplas correspondências, mas aqui apenas 2 linhas têm correspondência única, resultando em 4.
Alternativa E — ❌ Incorreta
Afirma que o resultado tem 16 linhas. Esse seria o resultado de um CROSS JOIN (produto cartesiano) sem condição, que combina cada linha de t1 com cada linha de t2 (4 × 4 = 16). No entanto, a condição ON restringe as combinações, eliminando a maioria. O LEFT JOIN com condição não gera o produto cartesiano completo.