Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
- Código
- fg165249
- Banca
- FGV
- Órgão
- TJ MS
- Ano
- 2024
- Cargo
- Tec NS ( )
- ALEFT JOIN;
- BINNER JOIN;
- CRIGHT JOIN;
- DCROSS JOIN;
- EFULL OUTER JOIN.
GabaritoE — FULL OUTER JOIN.
Gabarito: letra E. O FULL OUTER JOIN é o operador que garante a inclusão de todas as linhas de ambas as tabelas no resultado, mesmo aquelas sem correspondência na outra tabela — preenchendo com NULL os campos da tabela que não possui par. É exatamente o que João precisa, conforme o enunciado.
As junções em SQL são operações que combinam linhas de duas ou mais tabelas com base em uma condição de correspondência. Cada tipo de junção define quais linhas serão incluídas no resultado e como as colunas das tabelas serão combinadas. A diferença crucial está em como cada uma trata as linhas que não possuem correspondência na outra tabela.
O INNER JOIN (ou simplesmente JOIN) retorna somente as linhas que possuem correspondência em ambas as tabelas — é a interseção. As linhas sem par são descartadas. Já o LEFT JOIN (ou LEFT OUTER JOIN) retorna todas as linhas da tabela da esquerda, e apenas as correspondentes da direita; as linhas da esquerda sem par aparecem com NULL nos campos da direita. O RIGHT JOIN (ou RIGHT OUTER JOIN) é o espelho: preserva todas as linhas da tabela da direita. O CROSS JOIN gera o produto cartesiano, combinando cada linha de uma tabela com todas as linhas da outra, sem condição de junção.
O FULL OUTER JOIN combina o comportamento do LEFT e do RIGHT: retorna todas as linhas de ambas as tabelas, relacionando as que possuem correspondência e preenchendo com NULL os campos da tabela que não tem par. Em termos de conjuntos, ele equivale à união dos resultados do LEFT JOIN e do RIGHT JOIN (desconsiderando duplicatas). É a única junção que garante que nenhuma linha de nenhuma das tabelas seja perdida.
Para entender na prática, imagine duas tabelas: Clientes (com 3 clientes) e Pedidos (com 2 pedidos, sendo que apenas 1 cliente possui pedido). O INNER JOIN retornaria apenas 1 linha (o cliente com pedido). O LEFT JOIN retornaria 3 linhas (todos os clientes, com NULL nos pedidos dos que não possuem). O FULL OUTER JOIN retornaria 4 linhas: os 3 clientes (incluindo os sem pedido) e o pedido que não tem cliente correspondente (se houver). Ou seja, o FULL OUTER JOIN é o único que não descarta nenhuma linha de nenhuma das tabelas.
A pegadinha da banca está em confundir o LEFT JOIN com o FULL OUTER JOIN. O LEFT JOIN preserva todas as linhas da esquerda, mas descarta as linhas da direita que não têm correspondência. O FULL OUTER JOIN preserva ambas. Como o enunciado diz "todas as suas linhas sejam incluídas no resultado, mesmo que não haja correspondências entre elas", a resposta correta é o FULL OUTER JOIN.
O LEFT JOIN retorna todas as linhas da tabela da esquerda e apenas as correspondentes da direita. As linhas da direita sem correspondência são descartadas. Portanto, não garante a inclusão de todas as linhas de ambas as tabelas, apenas da esquerda.
O INNER JOIN retorna somente as linhas que possuem correspondência em ambas as tabelas (interseção). Linhas sem par em qualquer uma das tabelas são excluídas do resultado. É o oposto do que João precisa.
O RIGHT JOIN é o espelho do LEFT JOIN: preserva todas as linhas da tabela da direita, mas descarta as linhas da esquerda sem correspondência. Portanto, também não inclui todas as linhas de ambas as tabelas.
O CROSS JOIN gera o produto cartesiano, combinando cada linha de uma tabela com todas as linhas da outra, sem condição de junção. Embora inclua todas as linhas, ele não "relaciona" as linhas com base em correspondências — cria todas as combinações possíveis, o que não atende ao requisito de "garantir que todas as suas linhas sejam incluídas no resultado, mesmo que não haja correspondências entre elas" no sentido de junção externa.
O FULL OUTER JOIN retorna todas as linhas de ambas as tabelas, relacionando as que possuem correspondência e preenchendo com NULL os campos da tabela que não tem par. É exatamente o que o enunciado descreve: incluir todas as linhas, mesmo sem correspondência.
Para diferenciar os tipos de junção, pense em "quem é preservado": LEFT preserva a esquerda, RIGHT preserva a direita, FULL preserva ambos, INNER preserva apenas a interseção. O FULL OUTER JOIN é o único que garante que nenhuma linha de nenhuma tabela seja perdida.
Gabarito: letra E
Link permanente: /questoes/fg165249