Prática de SQL - Data de atualização deste documento: 2025-09-24 - 11h04 1- Apresentação 2- Ambiente de Trabalho. 3- Desenvolvimento do Trabalho. 4- As Entregas. 5- Ao Trabalho 1- Apresentação. Este documento é um exercício sobre o SQL:1992. Inicialmente você PODE testá-lo em qualquer SGBD relacional. Entretanto, os exercícios foram resolvidos no SGBD PostgreSQL, versão 12.2 (ou mais recente). Este texto apresenta um exercício VÁLIDO PARA NOTA, será referenciado daqui em diante como trabalho. Tudo o que você for fazer deve estar gravado NESSE ARQUIVO. Este Trabalho é individual. Este trabalho deve ser feito em fases; durante este texto referenciamos cada parte do trabalho com este termo: FASE. Este trabalho é INDIVIDUAL, embora a primeira Fase possa ser feita de forma colaborativa para acelerar o ritmo da execução. É obrigatório que o formato do arquivo a ser entregue seja TXT. TUDOo que for pedido deve ser gravado neste arquivo. No momento certo, será pedido que você TROQUE o Nome do Arquivo que será enviado em Tarefa do Teams. MAS o FORMATO do arquivo deverá ser .TXT. Antes de iniciar este trabalho preencha seu nome e matrícula do aluno no espaço abaixo disponível. Nome...........: [preencha seu completo, sem abreviações nem apelido, como está escrito no SiGA] Matrícula [RA].: [preencha aqui seu Registro do Aluno - RA, ou sua Matrícula] O envio do trabalho deve ser feito pelo MS-TEAMS. A entrega será feita em partes (por fase cumprida) MAS em todos os envios deverá ser enviado o ARQUIVO COMPLETO, mesmo que algumas FASES NÃO ESTEJAM FEITAS. As datas de entrega de cada FASE será determinada em Sala de Aula E PUBLICADA na página de entreda do site da disciplina. https://disciplinas.fatecourinhos.edu.br/ibd100/ibd100.php. -- ================================================================================================================================================== 2- Ambiente de Trabalho. O ambiente de software para executar este trabalho deverá ter: Servidor de Banco de Dados: SGBD PostgreSQL (versão 12.2 ou mais recente). Faça o downaload para o seu computador em: https://www.postgresql.org/download/ No procedimento de instalação do PostgreSQL é recomendável usar um diretório no nivel raiz de uma unidade de armazenamento (c:\postgreSQL, por exemplo), dedicado para acomodar a instalação. Este SGBD tem sua instalação junto com o programa pgAdmin 4. Este programa tem atualizações feitas com maior frequência do que o PostgreSQL. Isso permite atualizar os programas separadamente depois de feita a primeira instalação. Desse modo um diretório dedicado para a instalação do PostgreSQL facilita a atualização do pgAdmin 4, uma vez que um subdiretório 'pgadmin 4' será criado sob o diretório do PostgreSQL. Dica: a cada atualização do PGADMIN4 é aconselhável DESINSTALAR a versão anterior e depois INSTALAR a versão atualizada no MESMO diretório. Bem, agora começa a carga de trabalho. -- ================================================================================================================================================== 3- Desenvolvimento do Trabalho. Este trabalho tem 4 fases: - FASE 1: Ajuste de Base de Dados - FASE 2: Tradução de Álgebra Relacional para SQL. - FASE 3: Escrita de respostas em AR e Tradução para SQL. - FASE 4: Escrita de comandos SQL (respondendo perguntas que serão propostas pelo aluno). Descrevendo cada Fase: - FASE 1: Ajuste de Base de Dados: Você recebe um script de uma base de dados (DataB) (https://disciplinas.fatecourinhos.edu.br/ibd100/ecasoproj/PraticaSQL/20252/GeradorDaBase.sql) que deve ser editada (alterando estruturas de tabelas, criando e/ou excluindo tabelas), ajustando a DataB conforme as definições contidas no Dicionário de Dados (DicDados) (https://disciplinas.fatecourinhos.edu.br/ibd100/ecasoproj/PraticaSQL/20252/DicionarioDados.php). Acesse o pgAdmin 4, crie uma Base de Dados (nome recomendado: praticasql20252 - com o seguinte comando de criação para Windows: CREATE DATABASE "praticasql20252" WITH OWNER = postgres ENCODING = 'UTF8' LC_COLLATE = 'Portuguese_Brazil.1252' LC_CTYPE = 'Portuguese_Brazil.1252' LOCALE_PROVIDER = 'libc' TABLESPACE = pg_default CONNECTION LIMIT = -1 IS_TEMPLATE = False; Depois de criada a DataB execute o Script de Porte Inicial da base em uma janela de 'Query Tool'. Este script cria 94 tabelas e 3 visões. Depois de executar o script, EDITE as tabelas para adequação às definições de chaves primárias (Primary Key - PK), chaves estrangeiras (foreign key - FK), chaves candidatas (Unique Key - UK) e demais caracterizações das tabelas. NOTE: A) A BASE DE DADOS DEVERÁ FICAR IGUAL às DEFINIÇÕES do DicDados. Tabelas que estejam na DataB e NÃO estão no DicDados DEVEM SER EXCLUÍDAS da DataB. Tabelas que ESTEJAM NO DicDados e não aparecem na DataB, devem SER CRIADAS na DataB. B) A definição de Chaves ESTRANGEIRAS DEPENDE da EXISTÊNCIA das Chaves PRIMÁRIAS correspondentes. POR ISSO é NECESSÁRIO CRIAR as PK antes das FK. PORTANTO RECOMENDA-SE: 1) Analise todas as TABELAS alterando sua estrutura (criando e/ou excluindo campos) E CRIANDO SOMENTE as PKs. Considere isso como a PRIMEIRA PASSADA. 2) Analise todas as tabeças CRIANDO as FKs e/ou UKs. Considere isso como a SEGUNDA PASSADA. -- -------------------------------------------------------------------------------------------------------------------------------------------------- - FASE 2: Tradução de Álgebra Relacional para SQL. São apresentadas NESSE TEXTO perguntas que devem ser respondidas analisando as tabelas da DataB determinada na FASE 1. As respostas APRESENTAM as expressões de Álgebra Relacional que resolvem as perguntas, entretanto, estas expressões PODEM conter 'falhas'. Seu trabalho é analisar a proposta de resposta em AR (eventualmente corrigindo-a) e a seguir, TRADUZIR CADA EXPRESSÃO DE AR PARA SQL. -- -------------------------------------------------------------------------------------------------------------------------------------------------- - FASE 3: Escrita de respostas em AR e Tradução para SQL. São apresentadas perguntas sobre as tabelas da base de dados ajustada. Para cada pergunta devem ser ELABORADAS as expressões de AR que respondem às perguntas e, na sequencia, na mesma questão, deve ser feita a TRADUÇÃO PARA SQL DAS EXPRESSÕES QUE RESPONDEM A UMA QUESTÃO. -- -------------------------------------------------------------------------------------------------------------------------------------------------- - FASE 4: Escrita de comandos SQL (respondendo perguntas que serão propostas pelo aluno). O Aluno deve analisar o modelo de dados e propor 5 questões envolvendo pelo menos 4 tabelas no processamento. Para cada questão apresentada o aluno deverá apresentar a sequencia de operações de AR que responda a questão e a seguir a tradução das expressoes de AR para SQL. Finalmente, usando os conceitos de processamento de funções e sub-queries os comandos em SQL devem ser resscritos tentando escrever UM comando SQL para cada questão apresentada. -- -------------------------------------------------------------------------------------------------------------------------------------------------- Notas: - Para as FASES 2, 3 e 4 é permitido o uso de ferramentas de IA para suporte na elaboração das respostas. Entretanto, você notará que será necessário apresentar um contexto (descrição das tabelas) e eventualmente uma apresentação formal sobre a formatação das expressões de AR (diferentes da notação Sigma-Pi proposta por Edgar Frank Codd). Esta apresentação de contexto pode ser usada na proposição de uma ou mais questões para um mecanismo de IA. Por isso, é interessante preparar este Guia de Ambientação e apresentá-lo para os mecanismos de IA. - SEMPRE que usar alguma ferramenta, faça testes de execução dos comandos apresentados pela IA, analise, proponha alternativas (se for o caso) e seja crítico na sua analise. À partir das entregas das FASES 2, 3 e 4; apresente seu Guia de Ambientação SEMPRE em ANEXO ao seu trabalho. -- ================================================================================================================================================== 4- As Entregas. As entregas deste trabalho devem ser feitas de modo acumulativo. - FASE 1 (Script da base de dados depois de implementadas os ajustes propostos no Dicionário de Dados). - FASE 1 + FASE 2 [tradução de AR para SQL] (com anexo do Guia de Ambientação - se usar suporte de IA) - FASE 1 + FASE 2 + FASE 3 [Escrita de AR e tradução SQL] (com anexo do Guia de Ambientação - se usar suporte de IA) - FASE 1 + FASE 2 + FASE 3 + FASE 4 [Sugestão: Escrita de AR, tradução SQL + otimização do SQL] (com anexo do Guia de Ambientação - se usar suporte de IA) -- ================================================================================================================================================== 5- Ao Trabalho FASE 1: Ajustes na Base de Dados - Execute as seguintes tarefas para a conclusão desta Fase (é fortemente recomendado executa-las na sequência) A) Acesse o pgAdmin 4. B) Crie uma base de dados [já descrito] C) Ajuste de definições de tabelas da base de dados: Execute esta tarefa com os seguintes passos: - Crie as tabelas que constam no DD e que não existem na Base de Dados após a execução do Script de Porte Inicial Crie SOMENTE a estrutura das tabelas SEM a criação de CHaves Primárias NEM Chaves Estrangeiras. - EXCLUA as tabelas que constam na Base de Dados após a execução do Script de Porte Inicial e que NÃO constem no DD. - Ajuste a ordem de campos das tabelas da Base de Dados que eventualmente estejam com ordem incorreta segundo o DD. D) Crie TODAS as Chaves Primárias que ainda não existam criadas nas tabelas da Base de Dados. Aproveite esta tarefa e crie também as Chaves Candidatas (Unique Key). E) Crie TODAS as Chaves Estrangeiras que ainda não existam criadas nas tabelas da Base de Dados. No DD existe a Tabela 3 que define a formação de TODAS as Chaves Estrangeiras da Base de Dados. - DEPOIS de concluída a tarefa E), gere uma cópia (backup) da base de dados, LEMBRE-SE: Formato: PLAIN, pré-data, pós-data, data, com INSERT COMMANDs para porte de dados. Este 'backup' deve ser apresentado como ANEXO 1 no final deste arquivo. Fim da FASE 1 -- -------------------------------------------------------------------------------------------------------------------------------------------------- FASE 2: Tradução Álgebra Relacional -> SQL - Agora que sabemos o que os comandos do SQL podem processar, vamos traduzir a Álgebra Relacional para comandos da SQL. As perguntas estão feitas e a Álgebra Relacional que apresenta a resposta está formulada. Você deve traduzir as expressões de AR para SQL. Nota: A AR que responde a pergunta PODE apresentar alguma diferença quanto aos nomes de campos das tabelas, por que alguns dos analistas que montaram as respostas em AR não seguiram corretamente a especificação que constam na Tabela 1 do DD, onde se apresenta: Sigla e Tipos de dados associados apresentados nos nomes dos campos das tabelas. É SUA Tarefa, nesta fase corrigir os eventuais erros de nomenclatura de nomes de campos das tabelas apresentadas na AR ANTES de traduzir as operações para SQL. - Sugestão: traduza cada expressão da AR para um comando SQL. Teste sua resposta no banco de dados (primeiro comando por comando, e a seguir todos de uma vez). - Nota: Sabemos que o SQL pode combinar em um comando mais de uma expressão da AR. PORÉM, otimizar o código SQL nesta Fase é perda de tempo, pois será considerado somente a tradução de cada expressão de AR para SQL. - Para esta Fase fizemos a especificação da Álgebra Relacional para resolver as perguntas. Vamos apresentar as perguntas e as respostas em AR. A seguir você pratica a tradução para SQL. É importante notar: As expressões de AR podem estar com imperfeições. Daí você deve propor as eventuais alterações para depois montar a tradução para SQL. Vamos às perguntas: 1. Quais ônibus fizeram viagens em todas as rotas viárias que tiveram viagens no ano de 2012? -- Preparando as tabelas para a divisao Seleção...: a = viagens [[dtsaidaviagem entre "2012-01-01" e "2012-12-31" ou dtchegadaviagem entre "2012-01-01" e "2012-12-31"]] JunNatural: b = a [[ a.cpviagem=passagens.ceviagem ]] passagens Projeção..: p = b [[cerota]] – Códigos das rotas que tiveram viagens em 2010. Projeção..: pd = b [[cerota, ceonibus]] Projeção..: f = onibus [[cponibus -> ceonibus ]] -- Dividindo ProdCartes: s = p X f Subtracão.: t = s - pd Projeção..: w = t [[ ceonibus ]] Subtracão.: r = f - w -- Completando a solução JunNatural: z = r [[ r.onibusid=onibus.id ]] onibus Projeção..: z [[ccplaca,txapelido, nuanofabricacao, qtcapacidade]] - sem a criação de uma tabela 'final' -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 2. Quais os nomes dos professores e os nomes das respectivas disciplinas atribuídas aos professores que ministram disciplinas da Área de Estudo "EXATAS"? Seleção...: a = areadeestudo[[txnomearea="EXATAS"]] JunNatural: b = a[[a. cpareaestudo = k.ceareaestudo]] areaestudodisciplinas -> K JunNatural: c = b[[b.cedisciplina= disciplinas.cpdisciplina]]disciplinas Projeção..: c1 = c[[cpdisciplina, txnomedisciplina]] JunNatural: d = c1[[c1.cpdisciplina = atribuicoes.cedisciplina]]atribuicoes Projeção..: d1 = d[[ceprofessor, txnomedisciplina]] JunNatural: e = d1[[d1.ceprofessor=professores.ceprofessor]]professores Projeção..: r = e[[professores.txnomeprofessor,disciplinas.txnome]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 3. Qual é a quantidade de disciplina atribuídas a cada professor? Projeção..: A = atribuicoes[[CONTA(ceprofessor)->qtddisc,ceprofessor]] {agrupado por ceprofessor} {ordenado por ceprofessor} JunNatural: B = A[[A.ceprofessor = Pr.cpprofessor]]ProfessoresàPr Projeção..: B[[qtddisc,id,txnomeprofessor]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 4. Quais são os nomes dos professores que ministram todas disciplinas (note que uma parte da resposta especifica o procedimento da divisão)? Preparando o procedimento da divisão Projeção..: P = professores[[cpprofessor->ceprofessor]] Projeção..: D = disciplinas[[cpdisciplina?cedisciplina]] Projeção..: PD = atribuições[[ceprofessor, cedisciplina]] Estas três tabelas ficam prontas para o procedimento da divisão Procedimento da Divisão: ProdCartes: A = P X D - Esta tab. Fica UC com PD (atribuições) Subtracão.: B = A – PD – A é maior que Atribuições Projeção..: C = B[[ceprofessor]] - Aqui temos os prof. Que não se ligam a pelo menos uma disciplina Subtracão.: E = P – C - Aqui tenho os códigos de professores que ministram TODAS as disc. Conclusão da Pergunta JunNatural: F = E[[E.ceprofessor=Professores.cpprofessor]]Professores Projeção..: F[[cpprofessor, txnomeprofessor]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 5. Qual é a média da quantidade de disciplinas atribuídas aos professores para cada área de estudo? O que pode representar esta média (interprete o resultado), exiba a média com duas casas decimais. Projeção..: W = atribuicoes [[ceprofessor, cedisciplina]] JunNatural: S = W [[W.cpdisciplina = disciplinas.cpdisciplina][disciplinas Projeção..: T = S [[ceprofessor,cpdisciplina]] JunNatural: K = T [[T.cpdisciplina= aed.cedisciplina]] areaestudodisciplinas -> aed Projeção..: M = K [[media(ceprofessor)->QtdMedProf, ceareaestudo]] {agrupar por ceareaestudo} {ordernar por ceareaestudo} JunNatural: L = M[[M.ceareaestudo=areaestudo.cpareaestudo]]areaestudo Projeção..: L[[txnomearea,ARREDONDAR(QtdMedProf,2)]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 6. Quantas disciplinas são atribuídas aos professores que ministram disciplinas da Área de Estudo "Humanas"? Seleção...: A = areaestudo[[txnomearea="Humanas"]] JunNatural: B = A[[ A.cpareaestudo = K.ceareaestudo ]]areaestudodisciplinas -> K JunNatural: C = B[[ B.cedisciplina = disciplinas.cpdisciplina ]]disciplinas Projeção..: D = C[[cpdisciplina]] JunNatural: E = D[[ D.cpdisciplina = atribuicoes.cedisciplina ]]atribuicoes Projeção..: E[[ceprofessor , conta(cedisciplina) ]] {agrupa por ceprofessor} {ordem por ceprofessor} -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 7. Quais são, em ordem decrescente, as disciplinas com mais professores atribuídas? Projeção..: A = atribuicoes [[ cedisciplina, conta(ceprofessor) -> qtdprof ]] {agrupa por cedisciplinas tendo conta(ceprofessor)>3} {ordem por conta(ceprofessor) decrescente} JunNatural: B = A [[ A.cedisciplina = disciplinas.cpdisciplina ]] disciplinas Projeção..: B [[cpdisciplina, txnomedisciplina, qtdprof, txementa, qthoras, txcriterioavaliacao, dtcaddisciplina]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 8. Quais são todas as rotas viárias que passam pelas cidades "São Paulo" e "Rio de Janeiro"? Seleção...: A = cidades [[ txnomecidade="São Paulo" ou txnome="Rio de Janeiro" ]] JunNatural: B1 = A [[ A.cpcidade = rotasviarias.cecidadeorigem]] rotasviarias JunNatural: B2 = A [[ A.cpcidade = rotasviarias.cecidadedestino]] rotasviarias União.....: C = B1 U B2 Projeção..: C [[ cprota, txnomerota, txdescrperiodo, cecidadeorigem, cecidadedestino ]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 9. Quais são os nomes de funcionários que passaram por consultas de todas as especialidades médicas nos últimos 180 dias Seleção...: a = consultas [[ dthoraconsulta >= hoje-180 ]] JunNatural: b = a [[ a.cemedico = medicos.cpmedico ]] medicos Projeção..: PD = b [[ cefuncionario, ceespecialidade ]] Projeção..: P = funcionarios [[ cpfuncionario?cefuncionario ]] Projeção..: D = especmedicas [[ cpespecialidade?ceespecialidade ]] ProdCartes: S = P X D Subtracão.: T = S - PD Projeção..: W = T [[ cefuncionario ]] Subtracão.: R = P – W JunNatural: V = R[[R.cefuncionario=f.cpfuncionario ]] funcionários -> f Projeção..: V[[txprenomes,txsobrenome]] -- Escreva abaixo a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. Fim da FASE 2 -- -------------------------------------------------------------------------------------------------------------------------------------------------- FASE 3: Escrita de AR com tradução para SQL Agora podemos implementar os comandos que respondem a algumas perguntas sobre esta base de dados. Resolução de Perguntas com Álgebra Relacional e SQL Agora podemos implementar os comandos que respondem a algumas perguntas sobre esta base de dados. Faça esta etapa da seguinte maneira: Analise a pergunta e formule os comandos em Álgebra relacional que respondem a pergunta. Depois de formulada a resposta em AR, escreva os comandos em SQL usando o máximo possível de aproximação com a Álgebra Relacional. Se desejar usar alguma técnica da linguagem SQL para melhorar o comando faça COMENTÁRIOS explicando sua implementação. 1. Quais foram os funcionários (cite: primeiro nome e sobrenome) que participaram nos projetos feitos pelo departamento onde o gerente é o funcionário "HEATHER"? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 2. Quais são os nomes das tarefas que foram executadas em projetos que são dos departamentos onde o departamento superior é o departamento "A01"? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 3. Quais são os nomes dos funcionários que registraram vendas para os clientes da cidade de "Bauru"? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 4. Quais são os nomes dos projetos que utilizaram todas as tarefas? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 5. Quantas notas fiscais de vendas foram emitidas para cada cliente no primeiro semestre de 2016? Para cliente sem nota fiscal emita o valor "ZERO". -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 6. Quantos funcionários atuaram em todos os projetos no ano de 2018? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 7. Exiba os nomes das Instituições de ensino que oferecem mais do que 5 cursos de capacitação na Área de Estudo: "Ciência da Computação" -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 8. Exiba os títulos de livros do acervo de livros que NÃO foram movimentados no ano de 2018 e calcule a percentagem destes livros em relação ao total de livros do acervo. O que pode representar este número? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 9. Qual a percentagem de funcionários que NÃO tem carro? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. 10. Qual a quantidade de consultas realizadas no ano de 2010 que foi coberta por planos de saúde? Qual a percentagem de funcionários que usaram estas consultas? Se o custo por consulta é de R$40,00 e os planos de saúde custam R$350,00 por funcionário, responda: Qual o número mínimo de consultas que torna o pagamento dos planos de saúde com uma relação custo/benefício positivo? -- Escreva abaixo a AR, a tradução de cada operação de AR para SQL -- Fim da pergunta e resposta. Fim da FASE 3 -- -------------------------------------------------------------------------------------------------------------------------------------------------- FASE 4: Escrita de SQL (preferencialmente com AR e tradução para, depois, otimização do SQL) Nesta fase o aluno deve apresentar 5 perguntas, apresentar a AR e SQL que resolva cada uma das perguntas. Para cada pergunta deve acontecer o processamento de dados de pelo menos 4 tabelas da base de dados (consideradas as tabelas finais da base após o ajuste de definições de tabelas). Então, para cada questão proposta, escreva as expressões de AR e as traduza para SQL e a seguir construir os comandos SQL equivalentes. Para isso pode ser necessário o uso de sub-consultas ou processamento de funções de tratamento de dados do PostgreSQL. É permitido (e estimulado) o uso alguma ferramenta de IA para montagem das expressões de AR. Para que isso se dê à contento, o aluno notará que será preciso informar toda a estrutura das tabelas envolvidas nas respostas e o formalismo de escrita das expressões de AR para que a ferramenta de IA consiga escrever uma proposta de solução para a pergunta, com o formalismo necessário. Escreva aqui as questões 1) Escreva a AR Escreva a SQL Escreva a SQL equivalente 2) Escreva a AR Escreva a SQL Escreva a SQL equivalente 3) Escreva a AR Escreva a SQL Escreva a SQL equivalente 4) Escreva a AR Escreva a SQL Escreva a SQL equivalente 5) Escreva a AR Escreva a SQL Escreva a SQL equivalente Para exemplificar uma das perguntas que você deve redigir, apresenta-se: 1) Um executivo quer receber um relatório onde se vejam os nome e sobrenome dos funcionários e nomes de suas funções desempenhadas na empresa, contratados antes do ano 2000 (inclusive) ou que tenham o nível de escolaridade acima ou igual ao 'Ensino Superior', estes funcionários também devem ter uma renda anual superior à 40000. Os dados devem ser ordenados pelo nome de departamento ao qual o funcionário pertence e dentro deste parâmetro de ordenação deve ser ainda ordenados por nome da função exercida. Resolução: - Tabelas envolvidas: funcionarios, funcoes, escolaridades, departamentos - AR a = funcionarios -> f [[ f.cegraudeescolaridade=g.cpgraudeescolaridade ]] grausdeescolaridade -> g b = a [[ (ANO(dtcontratacao)<=2000 e (vlsalario+vlbonus+vlcomissao) > 40000) ou cegrausprerequisitos>=4 ]] c = b [[ b.cefuncao=funcoes.cpfuncao ]] funcoes -> f d = c [[ c.cedepto=departamentos.cpdepto ]] departamentos d [[ departamentos.txnomedepto, funcoes.txnomefuncao, grausdeescolaridade.txnomeescolaridade, funcionarios.txprenomes, funcionarios.txsobrenome ]] {ordenado por departamentos.txnomedepto, funcoes.txnomefuncao} Tradução para SQL (operação por operação) a = funcionarios -> f [[ f.cegraudeescolaridade=g.cpgraudeescolaridade ]] grausdeescolaridade -> g create temporary table a as (select * from funcionarios as f inner join grausdeescolaridade as g on f.cegraudeescolaridade=g.cpgraudeescolaridade ); b = a [[ (ANO(dtcontratacao)<=2000 e (vlsalario+vlbonus+vlcomissao) > 40000) ou cegrausprerequisitos>=4 ]] create temporary table b as (select * from a where ((ANO(dtcontratacao)<=2000 and (vlsalario+vlbonus+vlcomissao) > 40000) or cegrausprerequisitos>=4)); c = b [[ b.cefuncao=f.cpfuncao ]] funcoes -> f create temporary table c as (select * from b inner join funcoes as f on b.cefuncao=f.cpfuncao); d = c [[ c.cedepto=departamentos.cpdepto ]] departamentos create temporary table d as (select * from c inner join departamentos on c.cedepto=departamentos.cpdepto); d [[ departamentos.txnomedepto, funcoes.txnomefuncao, grausdeescolaridade.txnomeescolaridade, funcionarios.txprenomes, funcionarios.txsobrenome ]] {ordenado por departamentos.txnomedepto, funcoes.txnomefuncao} select txnomedepto, txnomefuncao, txnomeescolaridade, txprenomes, txsobrenome from d order by txnomedepto, txnomefuncao SELECT txnomedepto, txnomefuncao, txnomeescolaridade, txprenomes, txsobrenome FROM funcionarios INNER JOIN funcoes ON funcoes.cpfuncao = funcionarios.cefuncao INNER JOIN departamentos ON departamentos.cpdepto = funcionarios.cedepto INNER JOIN grausdeescolaridade ON funcionarios.cegraudeescolaridade=grausdeescolaridade.cpgraudeescolaridade WHERE ((vlsalario+vlbonus+vlcomissao)>40000 AND extract(year from funcionarios.dtcontratacao)<=2000) OR grausdeescolaridade.cegrausprerequisitos>=4 ORDER BY departamentos.txnomedepto; Fim da FASE 4 -- ================================================================================================================================================== ANEXOS Anexo 1 Script da Base de dados ao final dos ajustes (definições de Chaves Primárias e Chaves Estrangeiras em todas as tabelas constantes no Diconário de Dados). -- -------------------------------------------------------------------------------------------------------------------------------------------------- Anexo 2 Guia de Ambientação - Texto de apresentação do contexto e parâmetros para trabalho com suporte de IA. -- ==================================================================================================================================================