Pular para o conteúdo principal

Questão de Banco de Dados — PostgreSQL — VUNESP 2023

Banco de DadosPostgreSQL
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
  1. Asomente das colunas pertencentes à tabela m.
  2. Bsomente das colunas pertencentes à tabela n.
  3. Cdas colunas pertencentes a ambas as tabelas.
  4. Ddos registros da tabela m, exceto aqueles que aparecem na tabela n.
  5. 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).

1Produto cartesiano
Combina cada linha de m com cada linha de n
Sem cláusula ON/USING
2Resultado
Colunas: soma das colunas de m e n
Linhas: produto (m × n)
3Confusões comuns
INNER JOIN (exige condição)
EXCEPT (diferença de conjuntos)
UNION (combina linhas)
CROSS JOIN
LEVELsoulevel.com.br
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.

Gabarito: letra C

Link permanente: /questoes/vu196521