Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq891231
Banca
FUNDATEC
Órgão
GHC-RS
Ano
2023
Nível
Superior
Cargo
Analista de Sistemas

Para responder à questão, considere a Figura 4.


Imagem da questão

Considerando as tabelas apresentadas na Figura 4, qual comando SQL poderá ser executado para que sejam retornados os dados da tabela TURMA, porém com os nomes das disciplinas (campo NOME) e dos professores (campo NOME) ao invés dos identificadores (campos ID_DISCIPLINA e ID_PROFESSOR)?
  1. ASELECT T.ID, D.NOME, P.NOME, T.TURNOFROM TURMA T, DISCIPLINA D, PROFESSOR PWHERE D.ID = T.ID_DISCIPLINAAND P.ID = T.ID_PROFESSOR;
  2. BSELECT TURMA.*, DISCIPLINA.NOME, PROFESSOR.NOMEFROM TURMA, DISCIPLINA, PROFESSORWHERE TURMA.ID = DISCIPLINA.ID_DISCIPLINAAND TURMA.ID = PROFESSOR.ID_PROFESSOR;
  3. CSELECT ID, DISCIPLINA.NOME, PROFESSOR.NOME, TURNOFROM TURMA, DISCIPLINA, PROFESSORWHERE ID = ID_DISCIPLINAAND ID = ID_PROFESSOR;
  4. DSELECT *FROM TURMA T WHERE (SELECT NOME FROM DISCIPLINAWHERE ID = T.ID_DISCIPLINA) > 0AND (SELECT NOME FROM PROFESSOR WHERE ID = P.ID_DISCIPLINA) > 0
  5. ESELECT T.ID, D.NOME_DISCIPLINA, P.NOME_PROFESSOR, T.TURNOFROM TURMA T, DISCIPLINA D, PROFESSOR PWHERE T.ID_DISCIPLINA IN D.IDAND T.ID_PROFESSOR IN P.ID;
Revelar gabarito e comentário

GabaritoA — SELECT T.ID, D.NOME, P.NOME, T.TURNO FROM TURMA T, DISCIPLINA D, PROFESSOR P WHERE D.ID = T.ID_DISCIPLINA AND P.ID = T.ID_PROFESSOR;

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”.

SQL: JOIN implícito e projeção de colunas

Gabarito: letra A. A consulta correta usa a sintaxe de junção implícita (vírgulas na cláusula FROM) com a condição de junção na cláusula WHERE, relacionando as chaves estrangeiras de TURMA (ID_DISCIPLINA e ID_PROFESSOR) às chaves primárias das tabelas DISCIPLINA e PROFESSOR, e projeta os nomes desejados com aliases de tabela (T, D, P). As demais alternativas erram na condição de junção, na projeção ou na sintaxe.

A questão cobra o conceito de junção (JOIN) entre tabelas em SQL, especificamente a forma implícita (também chamada de junção por vírgula ou produto cartesiano filtrado). Nessa sintaxe, listam-se as tabelas na cláusula FROM separadas por vírgulas e, na cláusula WHERE, estabelecem-se as condições que relacionam as linhas — é o equivalente lógico ao INNER JOIN. O objetivo é substituir os identificadores (ID_DISCIPLINA e ID_PROFESSOR) pelos nomes correspondentes (NOME de DISCIPLINA e NOME de PROFESSOR), o que exige: (1) incluir as três tabelas no FROM; (2) conectar TURMA a DISCIPLINA pela igualdade entre a chave estrangeira e a chave primária; (3) conectar TURMA a PROFESSOR da mesma forma; e (4) projetar as colunas desejadas, usando aliases para desambiguar as colunas de mesmo nome (NOME existe tanto em DISCIPLINA quanto em PROFESSOR).

Na prática, imagine que a tabela TURMA tenha os registros (1, 101, 202, 'Manhã'), onde 101 é o ID da disciplina 'Matemática' e 202 é o ID do professor 'João'. A consulta correta retornaria (1, 'Matemática', 'João', 'Manhã'). Para isso, a condição D.ID = T.ID_DISCIPLINA garante que, para cada turma, apenas a disciplina com o ID correspondente seja combinada; sem essa condição, teríamos um produto cartesiano, combinando cada turma com todas as disciplinas e todos os professores, gerando resultados incorretos.

A distinção crucial aqui é entre a junção correta (relacionar a chave estrangeira da tabela filha com a chave primária da tabela pai) e os erros comuns: inverter os campos na condição, usar a chave primária de TURMA (ID) em vez das estrangeiras, ou tentar comparar colunas de tipos diferentes (como um nome com um ID). A banca explora exatamente esses deslizes, apresentando condições de junção que não fazem sentido lógico ou que não correspondem ao esquema da Figura 4.

A pegadinha central é a condição de junção: o candidato deve identificar que TURMA possui as chaves estrangeiras ID_DISCIPLINA e ID_PROFESSOR, e que estas devem ser comparadas com as chaves primárias ID das tabelas DISCIPLINA e PROFESSOR, respectivamente. Alternativas que usam TURMA.ID (chave primária da turma) ou que comparam colunas de nomes com IDs estão logicamente incorretas. Além disso, a projeção deve usar aliases (T, D, P) para evitar ambiguidade, já que NOME existe em duas tabelas.

Guarde o padrão: chave estrangeira da tabela que referencia = chave primária da tabela referenciada. É esse critério que separa a alternativa correta das demais.

Alternativa A — ✅ Correta ⟵ GABARITO

A consulta lista as três tabelas no FROM com aliases (T, D, P) e estabelece as junções corretas na cláusula WHERE: D.ID = T.ID_DISCIPLINA conecta a disciplina à turma pela chave estrangeira, e P.ID = T.ID_PROFESSOR conecta o professor à turma. A projeção SELECT T.ID, D.NOME, P.NOME, T.TURNO retorna o ID da turma, o nome da disciplina, o nome do professor e o turno, exatamente como pedido. O uso de aliases desambigua as colunas NOME, que existem tanto em DISCIPLINA quanto em PROFESSOR.

Alternativa B — ❌ Incorreta

A condição de junção está invertida: TURMA.ID = DISCIPLINA.ID_DISCIPLINA compara a chave primária de TURMA com uma coluna que não existe em DISCIPLINA (a tabela DISCIPLINA tem ID, não ID_DISCIPLINA). O correto seria DISCIPLINA.ID = TURMA.ID_DISCIPLINA. Além disso, TURMA.ID = PROFESSOR.ID_PROFESSOR também está errado, pois PROFESSOR não possui a coluna ID_PROFESSOR. A projeção TURMA.* retornaria também os IDs, o que não atende ao pedido de substituí-los pelos nomes.

Alternativa C — ❌ Incorreta

A projeção SELECT ID, DISCIPLINA.NOME, PROFESSOR.NOME, TURNO não qualifica as colunas ID e TURNO com o alias da tabela, o que pode gerar ambiguidade se outras tabelas tiverem colunas com esses nomes. Mais grave: a condição de junção WHERE ID = ID_DISCIPLINA AND ID = ID_PROFESSOR não especifica de qual tabela vem cada coluna, tornando a consulta ambígua e, na prática, incorreta — o banco não saberia se ID refere-se a TURMA, DISCIPLINA ou PROFESSOR. A condição correta exige a qualificação completa, como na alternativa A.

Alternativa D — ❌ Incorreta

A consulta usa subconsultas na cláusula WHERE, mas a lógica está errada. A primeira subconsulta (SELECT NOME FROM DISCIPLINA WHERE ID = T.ID_DISCIPLINA) > 0 compara um texto (NOME) com um número (0), o que é inválido em SQL. Além disso, a segunda subconsulta referencia P.ID_DISCIPLINA, mas a tabela PROFESSOR não possui essa coluna (e o alias P nem foi definido no FROM). A abordagem correta seria usar JOIN, não subconsultas com comparações inválidas.

Alternativa E — ❌ Incorreta

A projeção SELECT T.ID, D.NOME_DISCIPLINA, P.NOME_PROFESSOR, T.TURNO referencia colunas que não existem: DISCIPLINA tem a coluna NOME, não NOME_DISCIPLINA; PROFESSOR tem NOME, não NOME_PROFESSOR. Além disso, a condição de junção WHERE T.ID_DISCIPLINA IN D.ID AND T.ID_PROFESSOR IN P.ID usa o operador IN de forma incorreta — IN é usado para comparar um valor com uma lista de valores, não para igualdade entre colunas. O correto seria usar = (igualdade) para relacionar as chaves.

Gabarito: letra A

Link permanente: /questoes/qq891231