Questão de Banco de Dados — PostgreSQL — VUNESP 2023
Banco de Dados›PostgreSQL
Código
vu196521
Banca
VUNESP
Órgão
CM SBO
Ano
2023
Cargo
Ana Sis ( )
Considere duas tabelas, m e n, inseridas em um banco de dados, por meio do sistema gerenciador de banco de dados PostgreSQL 14.4. Considere ainda o comando SQL emitido: SELECT * FROM m CROSS JOIN n Esse comando terá como resultado a exibição
Asomente das colunas pertencentes à tabela m.
Bsomente das colunas pertencentes à tabela n.
Cdas colunas pertencentes a ambas as tabelas.
Ddos registros da tabela m, exceto aqueles que aparecem na tabela n.
Edos registros da tabela n, exceto os que aparecem na tabela m.
Revelar gabarito e comentário▾
GabaritoC — das colunas pertencentes a ambas as tabelas.
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”.
CROSS JOIN no PostgreSQL: produto cartesiano entre tabelas
Gabarito: letra C. O comando SELECT * FROM m CROSS JOIN n executa um produto cartesiano entre as tabelas m e n, combinando cada linha de m com cada linha de n. O resultado exibe todas as colunas de ambas as tabelas — ou seja, a união do conjunto de colunas de m com o de n. As alternativas A e B estão erradas porque o * (asterisco) seleciona todas as colunas das duas tabelas envolvidas, não apenas de uma. As alternativas D e E descrevem operações de diferença de conjuntos (como EXCEPT), que não têm relação com o CROSS JOIN.
O CROSS JOIN é uma das operações fundamentais da álgebra relacional, que serve de base para a construção de outras junções. Quando você escreve FROM m, n sem cláusula WHERE, o banco também executa um produto cartesiano — o CROSS JOIN é a forma explícita dessa operação. O número de linhas resultantes é o produto do número de linhas de cada tabela: se m tem 10 linhas e n tem 20, o resultado terá 200 linhas. Já o número de colunas é a soma das colunas de m e n.
Na prática, o CROSS JOIN raramente é usado em consultas de produção, pois gera um volume enorme de dados — imagine duas tabelas com 1.000 linhas cada: o resultado teria 1.000.000 de linhas. Por isso, é comum que as bancas cobrem apenas o conceito, como nesta questão. A pegadinha aqui é confundir o CROSS JOIN com outras junções, como INNER JOIN (que exige uma condição de correspondência) ou com operações de conjunto como UNION e EXCEPT.
Para fixar: o CROSS JOIN não possui cláusula ON nem USING — ele simplesmente combina todas as linhas de uma tabela com todas as linhas da outra. Se você adicionar uma condição WHERE, o resultado será filtrado, mas a estrutura básica continua sendo o produto cartesiano. As alternativas D e E descrevem o comportamento de EXCEPT (ou NOT IN), que retorna linhas de uma tabela que não existem na outra — conceito totalmente distinto.
Guarde a diferença entre junção (JOIN) e operação de conjunto (UNION, INTERSECT, EXCEPT): a junção combina colunas de tabelas diferentes, enquanto as operações de conjunto combinam linhas de tabelas com a mesma estrutura. É exatamente essa distinção que separa a alternativa correta (C) das incorretas (D e E).
CROSS JOIN: Produto cartesiano (Combina cada linha de m com cada linha de n, Sem cláusula ON/USING); Resultado (Colunas: soma das colunas de m e n, Linhas: produto (m × n)); Confusões comuns (INNER JOIN (exige condição), EXCEPT (diferença de conjuntos), UNION (combina linhas))
Alternativa A — ❌ Incorreta
Afirma que o resultado exibe somente as colunas da tabela m. Isso seria verdadeiro se o comando fosse SELECT m.* FROM m CROSS JOIN n, mas o * no SELECT * refere-se a todas as colunas de todas as tabelas envolvidas na consulta. O CROSS JOIN não altera a projeção de colunas — ele apenas combina as linhas. Portanto, a alternativa A está errada.
Alternativa B — ❌ Incorreta
Afirma que o resultado exibe somente as colunas da tabela n. Pelo mesmo motivo da alternativa A, o * seleciona as colunas de ambas as tabelas, não apenas de n. Se o comando fosse SELECT n.* FROM m CROSS JOIN n, aí sim teríamos apenas as colunas de n. Como não é o caso, a alternativa B está incorreta.
Alternativa C — ✅ Correta ⟵ GABARITO
O CROSS JOIN combina cada linha de m com cada linha de n, e o SELECT * projeta todas as colunas de ambas as tabelas. O resultado é uma tabela com a união das colunas de m e n (a soma das colunas) e o produto cartesiano das linhas. É exatamente o que a alternativa C descreve: "das colunas pertencentes a ambas as tabelas".
Alternativa D — ❌ Incorreta
Descreve uma operação de diferença de conjuntos: "registros da tabela m, exceto aqueles que aparecem na tabela n". Isso corresponde ao comando SELECT * FROM m EXCEPT SELECT * FROM n (ou NOT IN), que retorna linhas de m que não existem em n. O CROSS JOIN não faz nenhuma filtragem — ele simplesmente combina todas as linhas. Portanto, a alternativa D está errada.
Alternativa E — ❌ Incorreta
Assim como a D, descreve uma diferença de conjuntos, mas no sentido inverso: "registros da tabela n, exceto os que aparecem na tabela m". Isso seria SELECT * FROM n EXCEPT SELECT * FROM m. O CROSS JOIN não tem esse comportamento — ele não exclui nada, apenas combina. Logo, a alternativa E está incorreta.
NÃO CAIA NESSA!
A banca tenta confundir o CROSS JOIN com operações de conjunto (EXCEPT, UNION) e com junções condicionais (INNER JOIN). O CROSS JOIN é o produto cartesiano puro: todas as colunas de ambas as tabelas e o produto do número de linhas. Se a alternativa falar em "exceto" ou "somente", desconfie — isso não é característica de CROSS JOIN.
PEGA ESSA DICA!
Para resolver questões de JOIN, identifique primeiro o tipo de junção: CROSS JOIN (produto cartesiano, sem condição), INNER JOIN (só linhas que correspondem), LEFT/RIGHT/FULL JOIN (preserva linhas sem par). Depois, verifique o que o SELECT projeta: * traz todas as colunas de todas as tabelas; tabela.* traz só as colunas daquela tabela. Com isso, você elimina as alternativas erradas rapidamente.