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)?
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;
CSELECT ID, DISCIPLINA.NOME, PROFESSOR.NOME, TURNOFROM TURMA, DISCIPLINA, PROFESSORWHERE ID = ID_DISCIPLINAAND ID = ID_PROFESSOR;
DSELECT *FROM TURMA T WHERE (SELECT NOME FROM DISCIPLINAWHERE ID = T.ID_DISCIPLINA) > 0AND (SELECT NOME FROM PROFESSOR WHERE ID = P.ID_DISCIPLINA) > 0
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.