Consultas SQL com múltiplas junções e filtros
Gabarito: letra C. A alternativa C é a única que atende a todos os critérios do enunciado: nomes de professores sem duplicidade (DISTINCT), que ministram disciplinas do 5º período do curso de Engenharia de Software, que possuem dependentes cadastrados e têm grau de doutor. Para isso, ela realiza as junções necessárias entre as tabelas Professores, Ministra, Disciplinas, Cursos e Dependentes, e aplica os filtros corretos na cláusula WHERE.
O problema exige a combinação de informações de cinco tabelas diferentes. Para relacionar um professor a uma disciplina, é preciso usar a tabela associativa Ministra, que liga id_professor a id_disciplina. Para saber o curso da disciplina, é necessário juntar Disciplinas com Cursos através de id_curso. E para verificar se o professor tem dependentes, é preciso juntar Professores com Dependentes através de id_professor. A consulta correta deve fazer todas essas junções e filtrar por d.periodo = 5, c.nome_curso = 'Engenharia de Software' e p.grau = 'Doutor'. O DISTINCT garante que cada professor apareça apenas uma vez, mesmo que ministre várias disciplinas do 5º período ou tenha mais de um dependente.
Vamos analisar cada alternativa para entender por que apenas a C está completa. As alternativas A, B, D e E omitem pelo menos um dos critérios essenciais, seja a junção com a tabela Dependentes, o filtro do curso, o filtro do grau ou o DISTINCT para eliminar duplicidades. A pegadinha da banca está em apresentar consultas que parecem corretas, mas que deixam de fora um requisito específico do enunciado.
A chave para resolver essa questão é mapear cada critério do enunciado para uma cláusula SQL. O critério "sem duplicidade" exige DISTINCT. O critério "ministram disciplinas do 5º período" exige a junção com Ministra e Disciplinas e o filtro periodo = 5. O critério "do curso de Engenharia de Software" exige a junção com Cursos e o filtro nome_curso = 'Engenharia de Software'. O critério "possuem dependentes cadastrados" exige a junção com Dependentes. E o critério "têm grau de doutor" exige o filtro grau = 'Doutor'. A alternativa que contém todos esses elementos é a correta.
Alternativa A — ❌ Incorreta
Esta consulta faz as junções entre Professores, Ministra e Disciplinas, e filtra apenas pelo período (d.periodo = 5). Ela não junta com a tabela Cursos para filtrar o curso de Engenharia de Software, não junta com Dependentes para verificar se o professor tem dependentes, e não filtra pelo grau de doutor. Além disso, não usa DISTINCT, o que pode gerar nomes duplicados. Portanto, está incompleta e incorreta.
Alternativa B — ❌ Incorreta
Esta consulta adiciona a junção com Cursos e o filtro c.nome_curso = 'Engenharia de Software', e usa DISTINCT. Porém, ela não junta com a tabela Dependentes e não filtra pelo grau de doutor (p.grau = 'Doutor'). Assim, retornaria professores de Engenharia de Software do 5º período, mas sem verificar se têm dependentes ou se são doutores. Está incompleta.
Alternativa C — ✅ Correta ⟵ GABARITO
Esta é a consulta completa. Ela faz todas as junções necessárias: Professores com Ministra, Ministra com Disciplinas, Disciplinas com Cursos, e Professores com Dependentes. Aplica os três filtros exigidos: d.periodo = 5, c.nome_curso = 'Engenharia de Software' e p.grau = 'Doutor'. E usa DISTINCT para garantir que cada professor apareça apenas uma vez, mesmo que ministre várias disciplinas do 5º período ou tenha mais de um dependente. Atende a todos os critérios do enunciado.
Alternativa D — ❌ Incorreta
Esta consulta junta apenas Professores com Dependentes e filtra pelo grau de doutor. Ela não faz nenhuma junção com Ministra, Disciplinas ou Cursos, portanto não verifica se o professor ministra disciplinas do 5º período do curso de Engenharia de Software. Também não usa DISTINCT. Está totalmente incompleta.
Alternativa E — ❌ Incorreta
Esta consulta faz as junções com Ministra, Disciplinas e Cursos, filtra pelo período, curso e grau de doutor, e usa DISTINCT. Porém, ela não junta com a tabela Dependentes, portanto não verifica se o professor possui dependentes cadastrados. Está incompleta, faltando um dos critérios essenciais.
A regra de ouro para questões de SQL com múltiplos critérios é: cada critério do enunciado deve corresponder a uma junção ou filtro na consulta. Se algum critério não estiver representado, a consulta está errada. Nesta questão, a alternativa C é a única que representa todos os critérios.
Gabarito: letra C