Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023
Banco de Dados›Consultas e Comandos em SQL
Código
fg161128
Banca
FGV
Órgão
Pref BH
Ano
2023
Cargo
APGG ( )
Considere a tabela T, com colunas A, B e 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
Assinale o número de linhas, além dos títulos, produzidas pela execução do comando SQL apresentado anteriormente.
A3 linhas.
B4 linhas.
C5 linhas.
D6 linhas.
Revelar gabarito e comentário▾
GabaritoB — 4 linhas.
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”.
Resolução
Gabarito: letra B — a conta chega a 4 linhas — alternativa B.
A ideia por trás
Junções externas (OUTER JOIN) combinam linhas de duas tabelas, mas preservam as linhas que não encontram par. No LEFT OUTER JOIN, todas as linhas da tabela da esquerda aparecem, mesmo sem correspondência na direita; no RIGHT OUTER JOIN, todas as linhas da direita aparecem, mesmo sem correspondência na esquerda. Quando não há par, as colunas da tabela sem correspondência vêm preenchidas com NULL.
A condição de junção define como as linhas se casam: em t1.a = t2.b, cada linha de t1 procura linhas em t2 com o mesmo valor em b. Se a condição falha, a linha é mantida com NULLs do lado que não corresponde. Em junções encadeadas, o resultado da primeira junção vira a tabela da esquerda da segunda, e a ordem importa: o RIGHT JOIN preserva todas as linhas da tabela da direita (t3), mesmo que não haja par no resultado anterior.
Esta questão exige executar as duas junções em sequência, contando quantas linhas sobrevivem após cada uma. O segredo é perceber que o RIGHT JOIN final preserva todas as linhas de t3, e que algumas linhas de t3 podem não encontrar correspondência no resultado do LEFT JOIN.
O que a questão dá
tabela T com 4 linhas: (1,2,3), (2,3,4), (3,4,NULL), (4,NULL,NULL)
comando: SELECT ... FROM T t1 LEFT OUTER JOIN T t2 ON t1.a = t2.b RIGHT OUTER JOIN T t3 ON t2.b = t3.c
O que queremos: o número de linhas produzidas pela consulta
Passo 1 — Executar o LEFT JOIN entre t1 e t2
A consulta começa com o LEFT OUTER JOIN, então precisamos primeiro combinar t1 e t2. O LEFT JOIN mantém todas as linhas de t1, mesmo sem par em t2.
Por que esta fórmula: A condição é t1.a = t2.b. Para cada linha de t1, procuramos linhas em t2 com o mesmo valor em b. Se não houver, a linha de t1 fica com NULLs nas colunas de t2.
Esquecer que a linha com A=1 não tem correspondência e ainda assim é mantida no LEFT JOIN.
Passo 2 — Executar o RIGHT JOIN com t3
O resultado do passo 1 é a tabela da esquerda do RIGHT JOIN. O RIGHT JOIN preserva todas as linhas de t3, mesmo que não haja correspondência no resultado anterior.
Por que esta fórmula: A condição é t2.b = t3.c. Para cada linha de t3, procuramos linhas no resultado do passo 1 onde t2.b seja igual a t3.c. Como é RIGHT JOIN, todas as linhas de t3 aparecem.