Baixe o app para aproveitar ainda mais
Prévia do material em texto
Testando o SQL Apresentação, instalação e outras dicas. Este documento é um exercício sobre o SQL:1992. Você PODE testá-lo em qualquer SGBD relacional. Aqui fizemos nossos testes em um SGBD MySQL, versão 5.1.41. Como este documento é um exercício VÁLIDO PARA NOTA, por favor, preencha os nomes e matrículas dos alunos do grupo na tabela abaixo. DEPOIS de resolvido o TESTESQL TROQUE o nome do arquivo para:TESTESQL-NomeDoAluno.pdf e envie-o para joao.hypolito@fatec.sp.gov.br. No assunto escreva: TESTESQL-NomeDoAluno (Escreva SEU como no exemplo: José da Silva Jose_da_Silva) Nome e matrícula do aluno: Matrícula Nome Ambiente de Trabalho. Nós vamos usar o pacote XAMPP versão 1.7.4 (já existe versão mais recente, mas a 1.7.4 tem tudo o que precisamos). Este pacote está disponível para download em ( http://www.apachefriends.org/pt_br/xampp-windows.html#2287 ), (existem opções de pegar o programa instalador ou versões ZIPADAS, escolha a sua). Ou, se você preferir pode usar outro pacote desde que contenha as versões dos seguintes programas: SGBD MySQL versão 5.x Não use versão a versão 4.x (que ainda podem ser encontrada em alguns pacotes) e nem baixe a versão 6.x (o site do MySQL recomenda que esta versão seja instalada em ambientes de teste). Linguagem PHP versão 5.x. Você pode usar a versão 4, mas, mais adiante usaremos funções que só vão funcionar na versão 5, mas que tem a equivalência na versão 4. Quando isso acontecer, se você estiver usando a versão 4 deverá trocar a especificação da função. Servidor de páginas. Pode ser o Apache ou TomCat ou mesmo o IIS (um pouco mais raro de encontrar). Depois de baixado o pacote instale-o seguindo as instruções de instalação padrão. O procedimento coloca o XAMPP no diretório C:\XAMPP. Lá são criados os subdiretórios: Apache 2.2.17 (Servidor de página do pacote – seu navegador terá um endereço http://localhost que responde pelas páginas gravadas em c:\xampp\htdocs); MySQL 5.5.8 (o SGBD mais flexível e que vem crescendo em uso em ambientes de diversos portes); PHP 5.3.5 (uma linguagem computacional ampla, poderosa e muito interessante para desenvolvimento de sistemas); phpMyAdmin 3.3.9 (o administrador de bases de dados em MySQL – não é o único programa com esta função mas é um dos interface mais intuitiva e de fácil uso), se você quiser pode usar o HeideiSQL versão 6.0 (procure a build mais recente); FileZilla FTP Server 0.9.37 (um servidor de FTP – embora nós não venhamos a usar este produto); Tomcat 7.0.3 (um outro servidor de página para trabalhar sob servidor Proxy sem muitos ajustes). O procedimento também instala o painel de controle que permite administrar os serviços instalados no XAMPP. Denise Typewriter Denise Typewriter 1120145-2 Denise None set by Denise Denise Typewriter Denise Lima Miranda Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter O XAMP foi escrito com o intuito de facilitar a instalação de programas que permitam o desenvolvimento de sistemas em camadas. Acho, entretanto, que está evoluindo para ser um pacote de “Servidor WEB de bolso”. Fácil de instalar e que dá o inicio para um servidor WEB (é claro que outros aspectos devem ser considerados no Server), mas o XAMP já ajuda em um bocado de coisa. Depois de instalado o pacote o XAMP disponibiliza um painel de controle bem simples. Neste pequeno tutorial vamos iniciar o funcionamento do XAMP e depois mostrar o inicio do uso do phpmyadmin. O XAMPP instala os programas de um servidor WEB, mas NÃO ativa estes programas como serviço do Windows. Para tornar estes programas como serviços o XAMP tem um painel de controle que permite 'ativar' os programas como serviços. Note bem, ativar programa como serviço vai consumir mais recursos de máquina. Se seu computador tiver muitos programas instalados pode ser que o desempenho fique um pouco a dever. Se isso acontecer você pode também 'desligar' alguns serviços. Para nossa disciplina precisamos ter tudo 'ligado'. Começamos escrevendo a parte de ativação do servidor de páginas no XAMPP. No seu ambiente do Windows vá para INICIAR+Xampp e escolha o "Painel de Controle", você verá a seguinte tela. Para ativar o Apache e o MySQL basta clicar nos botões START ao lado do nome de cada programa. Se você quiser que os programas sejam iniciados ao ligar seu computador marque os itens Svc no lado esquerdo do nome de cada programa. Recomendo que sejam iniciados o Apache e o MySQL. Note que isso pode "consumir" recursos do seu computador. Você pode escolher somente iniciar os serviços a cada vez que for usar o MySQL. Vamos ativar o Apache e a seguir o MySQL. Basta clicar nos botões "Start" ao lado de cada serviço. Precisamos ter o Apache e o MySQL funcionando. Se você quiser pode marcar os campos SVC para ativar os programas como serviço do windows. Ao reiniciar o computador estes programas já estarão 'ativos'. A tela deve ficar assim: Pronto! Agora vamos carregar o navegador (use o Firefox ou Internet Explorer). Na barra de endereços escreva: http://localhost Veja que está escrito SEM o www. Você vai ver uma tela que permite a escolha do IDIOMA do ambiente Xampp. Escolha o Português(Brasil). Você vai ver a seguinte tela: No lado esquerdo da tela, no item "Ferramentas", escolha o subitem: phpmyadmin. A tela fica assim: No computador de onde tirei esta imagem já existem bases de dados instaladas. Portanto, existem mais itens do lado esquerdo do que no seu computador. Criando a Base de Dados Vamos criar uma base de dados: PRIMEIRO escolha o Collation de conexão do MySQL, abra a caixa de seleção e escolha UTF8-bin. Assim: Depois no campo COLLATION escolha também uft8-bin. No nome da base escreva: "adm_exerc_sql", idêntico ao que você está lendo, POR FAVOR. Depois da escolha certa, clique em CRIAR. A tela deve ficar assim: Note que, quando uma mensagem aparecer no quadro da direita em cor VERDE é que a ação foi executada com sucesso. Agora vamos executar um SCRIPT de criação das tabelas e importação dos dados. O script que cria as tabelas da base de dados está disponível para os alunos da disciplina de Modelagem de Banco de Dados 2 no site do 4Shared. Se você ainda não tem este script, pare aqui, providencie o script e depois continue deste ponto Clique no Botão IMPORTAR, no menu no alto da tela. Você a seguinte tela: Clique em "SELECIONAR ARQUIVO". Na janela de navegação localize o arquivo de script de criação das tabelas da base de dados. Você deve ver uma tela assim: Depois de localizado o arquivo marque-o e clique em ABRIR. A seguir clique no Botão EXECUTAR (no lado direito inferior na tela). A tela de processamento pode mostrar uma mensagem assim: Depois que o processo é executado CLIQUE no nome da Base (no menu do lado esquerdo). Você vê a tela assim: Nesta base de dados temos várias tabelas que vamos usar para explorar os comandos do SQL. NOTE BEM: estamos usando o SGBD MySQL que PODE ter alguns comandos diferentes da SQL Padrão ANSI:1992. Por isso é importante estar atento a ter que realizar pesquisas na Internet sobre os comandos do MySQL. O que devemos fazer? Este trabalho é dividido em 4 (QUATRO) partes: 1. Acerto do Dicionário de Dados da base (usando o SGBD MySQL). 2. Prática dos comandos SQL. 3. Tradução de Álgebra Relacional SQL. 4. Resolução de Perguntas com Álgebra Relacional e SQL. Estas partes devem ser feitas na ordem que estão apresentadas. O Acerto do dicionário de dados da base DEVE SER FEITO considerando CERTO o dicionário que está neste texto. De outro modo, a Base de Dados que vocês receberam está com DEFEITOS, ora falta campo em tabela ora a definição de um campo está errada ou então falta uma tabela inteira. Novamente afirmo: o que está CORRETO é o que está escrito neste documento.Portanto vocês devem acertar a base de dados. No segundo passo vocês devem testar e INTERPRETAR o resultado dos comandos SQL tanto no MySQL como no PostgreSQL. Os comandos foram escritos para uma base com o dicionário de dados CERTO. Muitos destes comandos devem ser executados em sequencia, pois o grau de dificuldade é crescente e, portanto, a interpretação fica mais complexa. PORTANTO NÃO PULE COMANDOS. Execute-os na ordem proposta. No terceiro passo (Tradução ARSQL) faça primeiro a tradução literal do comando proposto na AR para o SQL correspondente. DEPOIS, tente otimizar o comando MAS DEIXE O QUE FOI ESCRITO CERTO NO LUGAR. Note que este passo deve ser executado nos dois SGBDs. No quarto passo (Resolução de Perguntas com ARSQL) ESCREVA A ÁLGEBRA RELACIONAL e depois passe para o SQL. Finalmente, tente otimizar o que for possível mas DEIXE A AR e o SQL ESCRITOS. Este é um trabalho extenso. Faça-o com cuidado e atenção. Vamos ao trabalho! Acerto do Dicionário de Dados (no SGBD MySQL) Modelo de dados O modelo de dados e a Base de Dados adm_exerc_sql foram desenvolvidos com o objetivo de praticar os comandos em SQL. O Modelo de Dados NÃO representa nenhuma realidade por isso foi sendo "montado" com a colagem de vários segmentos de modelos de outros sistemas. À medida que foi aumentando foi-se percebendo que existem três entidades com um grande número de relacionamentos. A entidade CIDADES 'empresta' seu atributo identificador para várias outras, do mesmo modo a entidade TIPOS_TELEFONES. A entidade FUNCIONÁRIOS tem atributos de ligação e seu atributo identificador aparece em várias outras entidades. Por este motivo o Modelo de Dados foi dividido em três diagramas. A base tem 74 tabelas sendo que três delas apresentam uma quantidade maior de relacionamentos. Sendo assim centramos os diagramas "em torno" destas entidades. Note que quando existe uma entidade que se relaciona com duas ou mais destas três principais elas são representadas em dois diagramas. O primeiro diagrama mostra como centro a entidade cidades. Modelo de Dados com referência em logradouros, bairros e cidades. logradouros seguradoras planos_de_saude instituicoes_ensino armazens empresas professores autores clientes editoras fornecedores fabricantes 1 N 1 N N 1 N 1 N 1 N 1 1 N N 1 N 1 1 N 1 N bairrosN 1 cidadesN 1 O segundo modelo é centrado em TIPOS_TELEFONES e apresentam as entidades de relacionamentos N:M já prontas para implementação em um SGBD Relacional. Modelo de Dados com referência em TIPOS_TELEFONES. O terceiro modelo é centrado na entidade FUNCIONÁRIOS e apresenta a maior parte do Modelo de Dados, com os 'submodelos' juntos em um diagrama. nf_vendas_itens nf_vendasN N 1 duplicatas funcionarios armazens produtos movimentos funcoesdepartamentos editoras N 1 1 N 1 N 1 N 1 1 N 11 N 1 historico_profissional niveis_de_educacao habilitacoes consultas funcionarios_planos cores instituicoes_ensino autorias fornecimentos autores atividades area_estudo_disciplinas N1 professores passagens onibus veiculos modelos_veiculos inventarios medicos empresas livros atuacoes capacitacoes bibliografia atribuicoes area_estudo_cursos ord_de_comprasord_compras_itens movimentos_tipos setores_de_atuacao marcas_veiculos espec_medicas fabricantesseguros palavras_livros palavras_chaves disciplinas cursosarea_estudo_livros area_estudo viagens tarefas_projetostarefas rotas_viarias tipos_veiculos projetos N 1 1N cidades 1N 1N N 1 1N N1 N1 N1 N N 1 N1 fornecedores1N planos_de_saude 1 1N N 1 N 1 N 11 N N 1N 1 1 N N 1 N 1 N 1 N 1 N 1 N 1 N 1 1 N N1 N 1 1 N N 1 N 1 N 1 N 1 N 1 N 1 seguradoras1N N 1 N 1 1 N N1 N 1 N 1 N1 1 N N 11 N 1 N N 1 N 1 N 1 1 N N1 N 1 N 1 N 1 N 1 1 N N 1 N 1 funcionarios_tarefprojs N 1 N 1 cursosN 1 sinistros sinistros_veiculos 1 N N 1 N 1 nf_comprasnf_compras_itens 1N 1NN1 clientes 1 N faturas 1 N N 1 logradouros N 1 N 1 titulos titulacoesN1 1 N Modelo de Dados com referência em FUNCIONARIOS. Dicionário de dados O dicionário de dados desta base é apresentado na tabela 1. 1. area_estudo Campo Tipo PK FK Ind. Nulo Padrão id_area_estudo int(3) S Prim Não PK da Tabela tx_nome_area varchar(250) Não Nome da area de conhecimento tx_descricao_area text(2500) Não Descrição detalhada e completa de uma Área de Estudo. dt_cadastro date Sim NULL Data de geração do registro 2. area_ estudo _cursos Campo Tipo PK FK Ind. Nulo Padrão id_curso int(5) S S Sim Não Parte da PK e FK indicando o código do Curso id_area_ estudo int(3) S S Sim Não Parte da PK e FK indicando o código da Área de Estudo dt_cadastro date Sim NULL Data de geração do registro 3. area_estudo_disciplinas Campo Tipo PK FK Ind. Nulo Padrão id_disciplina int(4) S S Sim Não Parte da PK e FK indicando o código da Disciplina. id_area_estudo int(3) S S Sim Não Parte da PK e FK indicando o cód. Área de Estudo. dt_cadastro Date Não Data de geração do registro 4. area_ estudo _livros Campo Tipo PK FK Ind. Nulo Padrão id_livro int(9) S S Sim Não Parte da PK e FK indicando o código do livro id_area_ estudo int(3) S S Sim Não Parte da PK e FK indicando o código da Área de Estudo nu_grau_influencia int(3) Sim NULL Percentagem de cobertura da Área de Estudo no livro (num. inteiro) dt_cadastro date Sim NULL Data de geração do registro 5. armazens Campo Tipo PK FK Ind. Nulo Padrão id_armazem int(4) S Prim Não PK da Tabela tx_nome_armazem varchar(20) Não Nome curto ou usual. tx_descricao_geral text(2000) Sim NULL Texto para descrição geral do armazém. id_logradouro int(6) S Sim Sim FK indicando o bairro da cidade onde se localiza o armazém. tx_complemento Varchar(25) Sim NULL id_cliente int(6) S Sim Não FK indicando o cliente que é dono ou aluga o armazém. nu_telefone char(12) Sim NULL Numero de telefone no formato OP-DD-TTTT-RRRR, sem o ZERO no inicio nu_cep char(8) Sim NULL CEP do endereço (sem traço) qt_area double(15,2) Não Número inteiro indicando a área total. dt_cadastro date Não Data de geração do registro Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter 6. atividades Campo Tipo PK FK Ind. Nulo Padrão id_atividade int(4) S Prim Não PK da Tabela tx_nome_atividade varchar(40) Não Nome curto ou usual. tx_descricao varchar(200) Sim NULL Descrição detalhada e completa de uma atividade profissional. dt_cadastro date Não Data de geração do registro 7. atribuicoes Campo Tipo PK FK Ind. Nulo Padrão id_professor int(3) S S Sim Não Parte da PK e FK indicando o código do professor id_disciplina int(4) S S Sim Não Parte da PK e FK indicando o código da disciplina qt_horas_atribuidas int(5) Não Quantidade de horas de uma disciplina atribuídas ao professor. dt_atribuicao Date Sim NULL Data de atribuição da disciplina ao professor 8. atuacoes Campo Tipo PK FK Ind. Nulo Padrão id_projeto char(6) S S Sim Não Parte da PK e FK indicando o código de projeto id_funcionario int(6) S S Sim Não Parte da PK e FK indicando o código de funcionário dt_inicio date S Não 0000-00-00 Parte da PK é a Data de inicio de atuação do Funcionário no projeto dt_termino date Sim NULL Data de término de atuação do funcionário no projeto qt_tempo_duracao decimal(5,2) Sim NULL Quantidade de horas de duração da participação do funcionário no projeto. dt_cadastro date Não Data de geração do registro 9. autores Campo Tipo PK FK Ind. Nulo Padrão id_autor int(6) S Prim Não PK da Tabela tx_nome_autor char(90) Não Nome completo do autor. id_logradouro int(6) S Sim SimNULL FK com o código do bairro da cidade. tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL CEP do endereço (sem traço) dt_nascimento date Sim NULL Data de nascimento do autor dt_cadastro date Não Data de geração do registro 10. autores_tels Campo Tipo PK FK Ind. Nulo Padrão id_autor_tel int(5) S Prim Não PK da Tabela id_autor int(6) S Sim Não FK para a tabela autores id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 11. autorias Campo Tipo PK FK Ind. Nulo Padrão id_livro int(9) S S Sim Não Parte da PK e FK indicando o código do livro id_autor int(6) S S Sim Não Parte da PK e FK indicando o código do autor dt_cadastro date Não Data de geração do registro 12. bairros Campo Tipo PK FK Ind. Nulo Padrão id_bairro int(6) S S Sim Não Parte da PK e FK indicando o código da disciplina tx_nome_bairro varchar(100) Sim NULL Texto com o bairro. id_cidade int(4) S Sim Sim NULL FK com o código da cidade. dt_cadastro date Não Data de geração do registro 13. bibliografia Campo Tipo PK FK Ind. Nulo Padrão id_disciplina int(4) S S Sim Não Parte da PK e FK indicando o código da disciplina id_livro int(9) S S Sim Não Parte da PK e FK indicando o código do livro ao_tipo char(1) Não Letra indicando o tipo de bibliografia Básico ou Complementar dt_adocao_do_livro date Não Data de geração do registro 14. capacitacoes Campo Tipo PK FK Ind. Nulo Padrão id_curso int(5) S S Sim Não Parte da PK e FK indicando o código do curso id_funcionario int(6) S S Sim Não Parte da PK e FK indicando o código do funcionário. dt_capacitacao date S Não Parte da PK é a data de capacitação do funcionário (quando terminou o curso) dt_registro date Não Data de registro do diploma do funcionário (em órgão público competente) dt_cadastro date Não Data de geração do registro (no Banco de Dados) 15. cidades Campo Tipo PK FK Ind. Nulo Padrão id_cidade int(4) S Prim Não PK da Tabela tx_nome_cidade varchar(250) Sim NULL Nome completo da cidade tx_forma_acesso text(2000) Sim NULL Descrição das formas de acesso à cidade (hidrovias, estrada, ferrovias, etc) qt_populacao double(10) Sim NULL População estimada qt_area double(6,0) Não Area total municipal dt_cadastro date Não Data de geração do registro 16. clientes Campo Tipo PK FK Ind. Nulo Padrão id_cliente int(6) S Prim Não PK da Tabela tx_nome_cliente varchar(250) Não Nome usual completo (sem abreviações) do cliente tx_razao_social varchar(250) Sim NULL Razão social completa do Cliente id_logradouro int(4) S Sim Sim NULL FK com o código do logradouro de residência do cliente tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP vl_limite_compra double(15,2) Não Valor limite de compra para o cliente dt_cadastro date Não Data de geração do registro 17. clientes_tels Campo Tipo PK FK Ind. Nulo Padrão id_cliente_tel int(5) S Prim Não PK da Tabela id_cliente int(6) S Sim Não FK para a tabela clientes id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 18. consultas Campo Tipo PK FK Ind. Nulo Padrão id_funcionario int(6) S S Sim Não Parte da PK e FK indicando o código do funcionário. id_medico int(6) S S Sim Não Parte da PK e FK indicando o código do médico. dt_hora_consulta datetime S Não Parte da PK é a Data e hora da consulta (programada). dt_hora_realizada datetime Sim NULL Data de hora de realização da consulta. id_plano_de_saude int(4) S Sim Não FK com o código do plano de saúde. ao_situacao_consulta char(1) Não Atributo Operacional indicando Agendada, Realizada ou Cancelada dt_cadastro date Não Data de geração do registro 19. cores Campo Tipo PK FK Ind. Nulo Padrão id_cor int(6) S Prim Não PK da Tabela tx_nome_cor varchar(250) Não Nome usual completo (sem abreviações) nu_pantone int(6) Não Número da cor na tabela Pantone (indicativo de cor) dt_cadastro date Não Data de geração do registro 20. cursos Campo Tipo PK FK Ind. Nulo Padrão id_curso int(5) S Prim Não PK da Tabela tx_nome_curso varchar(200) Não Nome usual completo (sem abreviações) id_instituicao int(3) S Sim Não FK com o código da instituição de ensino. qt_carga_horaria int(3) Não Quantidade de horas do curso dt_cadastro date Não Data de geração do registro 21. departamentos Campo Tipo PK FK Ind. Nulo Padrão id_depto char(3) S Prim Não PK da Tabela tx_nome_depto varchar(36) Não Nome usual completo (sem abreviações) id_funcionario_gerente int(6) S Sim Sim NULL FK com o código do funcionário gerente do departamento. id_depto_superior char(3) S Sim Sim NULL FK indicando a PK na mesma tabela. Código do departamento superior na empresa. tx_localizacao varchar(80) Sim NULL Descrição da localização do departamento (Bloco, andar, sala,etc) qt_area_total int(6) Sim NULL Quantidade da área ocupada pelo departamento dt_criacao_depto date Sim NULL Data da criação do departamento na empresa dt_cadastro date Não Data de geração do registro 22. departamentos_tels Campo Tipo PK FK Ind. Nulo Padrão id_depto_tel int(5) S Prim PK da Tabela id_depto char(3) S Sim Não FK para a tabela departamentos id_tipo_telefone int(2) S Sim Não FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 23. disciplinas Campo Tipo PK FK Ind. Nulo Padrão id_disciplina int(4) S Prim Não PK da Tabela id_curso int(5) S Sim Não FK para a tabela cursos tx_nome varchar(250) Não Nome usual completo (sem abreviações) tx_ementa varchar(250) Sim NULL Texto com a ementa disciplinar qt_horas int(4) Não Quantidade de horas-aulas (de 60 min.) que ocupa e disciplina dt_cadastro date Não Data de geração do registro 24. duplicatas Campo Tipo PK FK Ind. Nulo Padrão id_duplicata int(7) S Prim Não PK da Tabela id_nf_venda int(6) S Sim Não FK para a tabela nf_vendas dt_vencimento Date Não Data de vencimento da duplicata vl_duplicata Double(10,2) Sim NULL Valor da Duplicata vl_desconto Double(10,2) Não Valor de Desconto vl_liquido Double(11,2) Não Valor Líquido da Duplicata vl_multa Double(10,2) Não Valor da Multa por atraso de pagamento da Duplicata 25. editoras Campo Tipo PK FK Ind. Nulo Padrão id_editora int(5) S Prim Não PK da Tabela tx_nome_editora char(70) Não Nome usual completo (sem abreviações) tx_razao_social varchar(250) Sim NULL Razão social completa. id_logradouro int(4) S Sim Sim NULL FK com o código do logradouro da editora tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP dt_cadastro Date Não Data de geração do registro 26. editoras_tels Campo Tipo PK FK Ind. Nulo Padrão id_editora_tel int(5) S Prim PK da Tabela id_editora int(5) S Sim Não FK para a tabela editoras id_tipo_telefone int(2) S Sim Não FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 27. empresas Campo Tipo PK FK Ind. Nulo Padrão id_empresa int(5) S Prim Não PK da Tabela tx_nome_usual varchar(100) Não Nome usual completo (sem abreviações) tx_razao_social varchar(250) Não Razão social completa id_logradouro int(6) S Sim Sim NULL FK com o código do logradouro da empresa tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP id_setor_atuacao int(4) S Sim Sim NULL FK com o código do setor de atuação da empresa. dt_cadastro DateNão Data de geração do registro 28. empresas_tels Campo Tipo PK FK Ind. Nulo Padrão id_empresa_tel int(5) S Prim PK da Tabela id_empresa int(5) S Sim Não FK para a tabela empresas id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 29. espec_medicas Campo Tipo PK FK Ind. Nulo Padrão id_especialidade int(4) S Prim Não PK da Tabela tx_nome_especialidade varchar(200) Não Nome usual completo (sem abreviações) dt_cadastro date Não Data de geração do registro 30. fabricantes Campo Tipo PK FK Ind. Nulo Padrão id_fabricante int(3) S Prim Não PK da Tabela tx_nome varchar(250) Não Nome usual completo (sem abreviações) tx_razao_social varchar(250) Não Razão social completa. id_logradouro int(4) S Sim Sim NULL FK com o código do logradouro do fabricante tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP dt_cadastro date Não Data de geração do registro 31. fabricantes_tels Campo Tipo PK FK Ind. Nulo Padrão id_fabricante_tel int(5) S Prim PK da Tabela id_fabricante int(3) S Sim Não FK para a tabela fabricantes id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 32. fornecedores Campo Tipo PK FK Ind. Nulo Padrão id_fornecedor int(6) S Prim Não PK da Tabela tx_nome varchar(250) Sim NULL Nome usual completo (sem abreviações) tx_razao_social varchar(250) Sim NULL Razão social completa. id_logradouro int(4) S Sim Sim NULL FK com o código do logradouro do fabricante tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP vl_limite_venda double(15,2) Não Valor limite de venda do fornecedor dt_cadastro date Não Data de geração do registro 33. fornecedores_tels Campo Tipo PK FK Ind. Nulo Padrão id_fornecedor_tel int(6) S Prim PK da Tabela id_fornecedor int(5) S Sim Não FK para a tabela fornecedores id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 34. fornecimentos Campo Tipo PK FK Ind. Nulo Padrão id_produto int(6) S S Sim Não Parte da PK e FK indicando o código do produto. id_fornecedor int(5) S S Sim Não Parte da PK e FK indicando o código do fornecedor. dt_ultimo_fornecimento date Não Data do ultimo fornecimento consultado para compra. vl_ultimo_fornecimento double(15,2) Não Valor do ultimo fornecimento consultado para compra. dt_cadastro date Não Data de geração do registro 35. funcionarios_planos Campo Tipo PK FK Ind. Nulo Padrão id_funcionario int(6) S S Sim Não Parte da PK e FK indicando o código do funcionário. id_plano_de_saude int(4) S S Sim Não Parte da PK e FK indicando o código do plano de saúde. dt_vinculacao date S Não Parte da PK é a Data de vinculação do funcionário ao plano de saúde. dt_desligamento date Não Data de desligamento do funcionário ao plano de saúde 36. funcionarios_tarefprojs Campo Tipo PK FK Ind. Nulo Padrão id_functarefprojs int(6) S Prim. Não PK da tabela id_funcionario int(6) S Sim Não FK indicando o código de funcionário que trabalha em tarefas de projetos id_tarefprojeto int(6) S Sim Não FK indicando o código de Tarefa-Projeto dt_inicio date Não 0000-00-00 Data de inicio de atuação do Funcionário no projeto dt_termino date Sim NULL Data de término de atuação do funcionário no projeto qt_tempo_duracao decimal(5,2) Sim NULL Quantidade de horas de duração da participação do funcionário no projeto. dt_cadastro date Não Data de geração do registro 37. funcionarios Campo Tipo PK FK Ind. Nulo Padrão id_funcionario int(6) S Prim Não PK da Tabela tx_primeiro_nome varchar(12) Não Primeiro nome usual completo (sem abreviações) tx_iniciais_medias char(1) Sim NULL Iniciais dos nomes do meio tx_sobre_nome varchar(15) Não Sobrenome completo (sem abreviações) id_depto char(3) S Sim Sim NULL FK com o código do departamento onde trabalha id_funcao int(3) S Sim Sim NULL FK com o código da função nu_ramal char(4) Sim NULL Número do ramal telefônico do funcionario id_logradouro int(6) S Sim Sim NULL FK com o código do Logradouro de moradia do Funcionário tx_complemento Varchar(25) Sim NULL dt_contratacao date Sim NULL Data de contratação id_nivel_educacao int(2) S Sim Sim NULL FK com o código do nível de educação (escolaridade) ao_sexo char(1) Sim NULL Atributo Operacional indicando o Sexo como Masculino e Feminino dt_nascimento date Sim NULL Data de nascimento tx_resenha text (3000) Sim NULL Texto descrevendo a personalidade e dinâmica profissional do funcionário vl_salario decimal(9,2) Sim NULL Valor do salário. vl_bonus decimal(9,2) Sim NULL Valor do Bônus de ganho (se não houver deve ser 0-Zero). vl_comissao decimal(9,2) Sim NULL Valor de Comissão (se não houver deve ser 0-Zero) nu_cep char(8) Sim NULL Número do CEP dt_cadastro date Não Data de geração do registro 38. funcionarios_tels Campo Tipo PK FK Ind. Nulo Padrão id_funcionario_tel int(5) S Prim PK da Tabela id_funcionario int(6) S Sim Não FK para a tabela funcionarios id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 39. funcoes Campo Tipo PK FK Ind. Nulo Padrão id_funcao int(3) S Prim Não PK da Tabela tx_nome_funcao varchar(60) Não Nome completo e sem abreviações dt_cadastro date Não Data de geração do registro 40. habilitacoes Campo Tipo PK FK Ind. Nulo Padrão id_curso int(5) S S Sim Não Parte da PK e FK indicando o código do curso. id_professor int(3) S S Sim Não Parte da PK e FK indicando o código do professor. dt_habilitacao date S Não Parte da PK é a Data de habilitação do professor para ministrar a disciplina. dt_capacitacao date Não Data quando o professor conseguiu a capacitação para ministrar a disciplina. dt_cadastro date Não Data de geração do registro 41. historico_profissional Campo Tipo PK FK Ind. Nulo Padrão id_historico int(6) S Prim Não PK da Tabela id_funcionario int(6) S Sim Não FK para tabela funcionários. id_empresa int(5) S Sim Sim NULL FK para tabela empresas. id_atividade int(4) S Sim Não FK para tabela atividades. dt_inicio date Não Data de inicio de atividade do funcionário na empresa (na atividade) dt_termino date Não Data de termino de atividade do funcionário na empresa (na atividade) dt_cadastro date Não Data de geração do registro 42. instituicoes_ensino Campo Tipo PK FK Ind. Nulo Padrão id_instituicao int(3) S Prim Não PK da Tabela tx_nome_instituicao varchar(200) Não Nome usual completo (sem abreviações) id_logradouro int(6) S Sim Sim NULL FK com o código do logradouro da instituição de ensino. tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP dt_cadastro date Não Data de geração do registro 43. instituicoes_tels Campo Tipo PK FK Ind. Nulo Padrão id_instituicao_tel int(5) S Prim PK da Tabela id_instituicao int(3) S Sim Não FK para a tabela instituições de ensino id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 44. inventarios Campo Tipo PK FK Ind. Nulo Padrão id_produto int(6) S S Sim Não 0 Parte da PK e FK indicando o código do produto. id_funcionario int(6) S S Sim Não 0 Parte da PK e FK indicando o código do funcionário. dt_inventario date S Não Parte da PK é a Data de realização do inventário de estoque.qt_estoque decimal(12,2) Não Quantidade contabilizada do item de produto. tx_local varchar(128) Sim NULL Local de realização do Inventário dt_cadastro date Não Data de geração do registro 45. livros Campo Tipo PK FK Ind. Nulo Padrão id_livro int(9) S Prim Não PK da Tabela tx_titulo_acervo varchar(90) Não Texto com o título do acervo id_editora int(5) S Sim NULL FK com o código da editora que publicou o livro. dt_publicacao date Sim NULL Data de publicação do Livro nu_ano_publicacao year(4) Sim NULL Ano de Publicação do Livro qt_exemplares_acervo int(3) Sim NULL Quantidade total do livro no acervo, é alterada no movimento de retirada qt_exemplares_consulta int(2) Sim NULL Quantidade mínima (em consulta) para o livro no acervo dt_cadastro date Não Data de geração do registro Denise Typewriter Denise Typewriter Denise Typewriter 46. logradouros Campo Tipo PK FK Ind. Nulo Padrão id_logradouro int(6) S S Sim Não 0 PK da tabela. tx_nome_logradouro varchar(120) Não Texto com o nome do logradouro com o tipo (praça, rua, etc.) indicado. id_bairro int(6) S Sim Sim NULL FK para a tabela de Bairros. dt_cadastro date Data de geração do registro 47. marcas_veiculos Campo Tipo PK FK Ind. Nulo Padrão id_marca int(6) S Prim Não PK da Tabela. tx_nome_marca varchar(90) Não Nome completo e sem abreviações id_fabricante int(3) S Sim Não FK com o código do fabricante da marca. dt_cadastro date Não Data de geração do registro 48. medicos Campo Tipo PK FK Ind. Nulo Padrão id_medico int(6) S Prim Não PK da Tabela tx_nome_medico varchar(200) Não Nome completo e sem abreviação nu_crm int(8) Uniq Não Número do registro do médico no Conselho Regional dos médicos. id_especialidade int(4) S Sim Não FK com o código da especialidade médica id_logradouro_moradia int(6) S Sim Sim NULL FK com o código do Logradouro de moradia do Médico tx_complemento_moradia Varchar(25) Sim NULL id_logradouro_clinica int(6) S Sim Sim NULL FK com o código do Logradouro da Clínica Principal do Médico tx_complemento_clinica Varchar(25) Sim NULL dt_cadastro date Não Data de geração do registro 49. modelos_veiculos Campo Tipo PK FK Ind. Nulo Padrão id_modelo int(4) S Não PK da Tabela id_marca int(6) S Sim Não FK com o código da marca de veiculos feitos por fabricantes tx_descricao_modelo varchar(250) Não Texto com a descrição do modelo ao_tipo_combustivel char(1) Não Atributo Operacional: tipo de combustível Álcool, Gasolina, Diesel, GáS ou Flex dt_cadastro date Não Data de geração do registro 50. movimentos Campo Tipo PK FK Ind. Nulo Padrão id_movimento int(6) S Não PK da Tabela id_livro int(9) S Sim Sim NULL FK com o código do livro movimentado id_funcionario int(5) S Sim Sim NULL FK com o código do funcionário que faz o movimento dt_movimento date Não Data de realização do movimento id_tipo_movimento int(3) S Sim Sim NULL FK com o código do tipo de movimento dt_prevista_devolucao date Sim NULL Data prevista de devolução do livro dt_real_devolucao date Sim NULL Data real da devolução dt_cadastro date Não Data de geração do registro 51. movimentos_tipos Campo Tipo PK FK Ind. Nulo Padrão id_tipo_movimento int(3) S Não PK da Tabela tx_nome_tipomov varchar(80) Não Nome do tipo de movimento (sem abreviações). ao_permiteretirada char(1) Não Assume S ou N para tipo de movimento que permita ou não retirada dt_cadastro date Não Data de geração do registro 52. nf_compras Campo Tipo PK FK Ind. Nulo Padrão id_nf_compra int(6) S Prim Não PK da Tabela id_fornecedor int(6) S Sim Não FK com o código do fornecedor da Nota de Compra. dt_nf_compra date Sim NULL Data de realização da venda que gera a nota de venda id_funcionario int(6) S Sim Sim NULL FK com o código do funcionário. vl_total_nf_compra double(15,2) Sim NULL Valor total da Nota de Compra ao_situacao char(1) Sim NULL Indicador da situação da Nota como "A" (a pagar) ou "P" (paga). tx_comentarios varchar(1000) Sim NULL Comentário geral sobre a Nota de Compra dt_cadastro date Não Data de geração do registro 53. nf_compras_itens Campo Tipo PK FK Ind. Nulo Padrão id_nf_compra int(6) S S Sim Não Parte da PK e FK com o código da nota fiscal de venda id_produto int(4) S S Sim Não Parte da PK e FK com o código do produto na nota qt_vendida int(8) Não Quantidade de produto vendida vl_unitario double(10,2) Não Valor unitário do produto na Nota de venda (pode ser ≠ do valor do estoque) 54. nf_vendas Campo Tipo PK FK Ind. Nulo Padrão id_nf_venda int(6) S Prim Não PK da Tabela id_cliente int(4) S Sim Sim NULL FK com o código do Cliente da venda. id_funcionario int(6) S Sim Sim NULL FK com o código do funcionário. id_armazem int(4) S Sim Sim NULL FK com o código do armazém de destino da nota vl_total_nf_venda double(15,2) Sim NULL Valor total da nota fiscal de venda dt_venda date Não 0000-00-00 Data de realização da venda que gera a nota de venda dt_emissao date Não 0000-00-00 Data de emissão da nota de venda dt_cadastro date Não Data de geração do registro 55. nf_vendas_itens Campo Tipo PK FK Ind. Nulo Padrão id_nf_venda int(6) S S Sim Não Parte da PK e FK com o código da nota fiscal de venda id_produto int(4) S S Sim Não Parte da PK e FK com o código do produto na nota qt_vendida int(8) Não Quantidade de produto vendida vl_unitario double(10,2) Não Valor unitário do produto na Nota de venda (pode ser ≠ do valor do estoque) 56. niveis_de_educacao Campo Tipo PK FK Ind. Nulo Padrão id_nivel_educacao int(2) S Não PK da Tabela tx_nome_comum varchar(30) Não Nome do nível de educação (sem abreviações). qt_anos_de_estudo int(2) Não Quantidade de anos de duração do nível dt_cadastro date Não Data de geração do registro 57. onibus Campo Tipo PK FK Ind. Nulo Padrão id_onibus int(6) S Prim Não PK da Tabela id_placa char(7) Não Placa do carro (somente letras e números) tx_apelido Varchar(60) Sim Nome de apelido do ônibus id_modelo int(4) S Sim Sim NULL FK indicando o código do modelo. id_cor int(11) S Sim Sim NULL FK indicando o código da cor. qt_capacidade int(2) Não Quantidade de acentos no ônibus nu_ano_fabricacao year(4) Não Ano de fabricação do carro dt_cadastro date Não Data de geração do registro 58. ord_compras Campo Tipo PK FK Ind. Nulo Padrão id_ordem_compra int(7) S Não PK da Tabela id_fornecedor int(6) S Sim Sim NULL FK com o código do fornecedor dt_ordem_compra date Sim NULL Data de realização da Compra id_funcionario int(6) S Sim Sim NULL FK com o código do funcionário. vl_total_ordem_compra double(15,2) Sim NULL Valor total da ordem de compra ao_situacao char(1) Sim NULL Atributo Operacional indicando: Aberto, Entregue Pago tx_comentarios varchar(1000) Sim NULL Texto com comentários complementares da ordem de compra. dt_cadastro date Não Data de geração do registro 59. ord_compras_itens Campo Tipo PK FK Ind. Nulo Padrão id_ordem_compra int(7) S S Sim Não Parte da PK e FK com o código da Ordem de Compra id_produto int(6) S S Sim Não Parte da PK e FK com o código do produto qt_comprada int(5) Não Quantidade comprada vl_unitatio double(10,2) Não Valor unitário negociado com o fornecedor 60. palavras_chaves Campo Tipo PK FK Ind. Nulo Padrão id_palavra int(6) S Prim Não PK da Tabela tx_nome_palavra varchar(15) Não Palavra-chave de pesquisa complete e se abreviações dt_cadastro date Não Data de geração do registro 61. palavras_livros Campo Tipo PK FK Ind. Nulo Padrão id_palavra int(6) S S Sim Não Parte da PK e FKcom o código da Palavra-Chave de Pesquisa id_livro int(9) S S Sim Não Parte da PK e FK com o código do livro dt_cadastro date Não Data de geração do registro 62. passagens Campo Tipo PK FK Ind. Nulo Padrão id_viagem int(4) S Prim Não PK da Tabela - FK apontando para a Tabela Viagens id_poltrona Int(2) Não Pk da Tabela (indica o número da poltrona do ônibus) id_funcionario int(6) S Sim Sim NULL FK com o código do funcionário. dt_cadastro date Não Data de geração do registro 63. planos_de_saude Campo Tipo PK FK Ind. Nulo Padrão id_plano_de_saude int(4) S Prim Não PK da Tabela tx_nome_plano varchar(200) Não Nome completo e usual para o plano de saúde tx_razao_social varchar(250) Sim NULL Razão social completa. id_logradouro Int(6) Sim NULL FK com o código do logradouro do escritório do Plano de Saúde. tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP dt_cadastro date Não Data de geração do registro 64. planos_tels Campo Tipo PK FK Ind. Nulo Padrão id_planos_tel int(5) S Prim PK da Tabela id_plano_de_saude int(4) S Sim Não FK para a tabela planos de saúde id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 65. produtos Campo Tipo PK FK Ind. Nulo Padrão id_produto int(6) S Prim Não PK da Tabela tx_nome varchar(128) Sim NULL Nome completo e usual vl_preco decimal(12,2) Sim NULL Valor do preço vl_preco_promocao decimal(12,2) Sim NULL Valor do preço de venda para promoção (com desconto máximo) vl_preco_minimo double(13,2) Sim NULL Valor do preço mínimo (contabilizando os custos de produção) qt_estoque double(15,2) Sim NULL Quantidade do produto em estoque. qt_dias_promocao int(3) Sim NULL Quant. De dias para execução de uma promoção do produto tx_descricao_completa varchar(2000) Sim NULL Texto com a descrição complete do produto. dt_cadastro date Não Data de geração do registro 66. professores Campo Tipo PK FK Ind. Nulo Padrão id_professor int(3) S Prim Não PK da Tabela tx_nomeprofessor varchar(250) Não Nome complete e sem abreviações id_logradouro int(6) S Sim Sim NULL FK com o código do Logradouro de residência do Professor. tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP dt_nascimento date Sim NULL Data de nascimento dt_cadastro date Sim NULL Data de geração do registro 67. professores_tels Campo Tipo PK FK Ind. Nulo Padrão id_professor_tel int(4) S Prim PK da Tabela id_professor int(3) S Sim Não FK para a tabela professores id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 68. projetos Campo Tipo PK FK Ind. Nulo Padrão id_projeto char(6) S Prim Não PK da Tabela tx_nome_projeto varchar(24) Não Nome complete e sem abreviações id_depto char(3) S Sim Sim NULL FK com o código do departamento que lidera ou coordena o projeto id_funcionario_responsavel int(6) S Sim Sim NULL FK com o código do funcionário responsável pelo projeto vl_estimado decimal(5,2) Sim NULL Valor estimado do projeto dt_inicio date Sim NULL Data de inicio do projeto (após conclusão de estudos de viabilidade) dt_termino date Sim NULL Data de término do projeto (após a conclusão dos testes) id_projeto_superior char(6) S Sim Sim NULL FK com o código de projeto superior. dt_cadastro date Não Data de geração do registro 69. rotas_viarias Campo Tipo PK FK Ind. Nulo Padrão id_rota int(5) S Prim Não PK da Tabela. tx_nome_rota varchar(60) Não Nome completo e sem abreviações. tx_descr_periodo varchar(250) Não Texto com a descrição do período de ocorrência de viagens na rota viária id_cidade_origem int(4) S Sim Sim NULL FK com o código da cidade de origem da rota viária id_cidade_destino int(4) S Sim Sim NULL FK com o código da cidade de destino da rota viária dt_cadastro date Não Data de geração do registro 70. seguradoras Campo Tipo PK FK Ind. Nulo Padrão id_seguradora int(4) S Prim Não PK da Tabela. tx_nome_seguradora varchar(250) Não Nome completo e sem abreviações. id_logradouro int(6) S S Sim NULL Texto com o endereço de residência. tx_complemento Varchar(25) Sim NULL nu_cep char(8) Sim NULL Número do CEP dt_cadastro date Não Data de geração do registro 71. seguradoras_tels Campo Tipo PK FK Ind. Nulo Padrão id_seguradora_tel int(5) S Prim PK da Tabela id_seguradora int(4) S Sim Não FK para a tabela seguradoras id_tipo_telefone int(2) S Sim Sim NULL FK para a tabela tipos_telefones nu_telefone char(15) Não Número do telefone (somente os números) 72. seguros Campo Tipo PK FK Ind. Nulo Padrão id_numero_apolice int(6) S Prim Não PK da Tabela. id_veiculo int(6) S Sim Não FK com o código do veículo. id_seguradora int(4) S Sim Não FK com o código da Seguradora dt_contratacao date Não Data da contratação dt_limite_cobertura date Não Data limite da cobertura do seguro. vl_cobertura double(15,2) Não Valor da cobertura da apólice de seguro dt_cadastro date Não Data de geração do registro 73. setores_de_atuacao Campo Tipo PK FK Ind. Nulo Padrão id_setor_atuacao int(4) S Prim Não PK da Tabela. tx_nome_curto varchar(90) Não Nome completo e sem abreviações tx_descricao varchar(250) Não Texto descrevendo o setor de atuação dt_cadastro date Não Data de geração do registro 74. sinistros Campo Tipo PK FK Ind. Nulo Padrão id_sinistro int(4) S Prim Não PK da Tabela. tx_nome_sinistro varchar(90) Não Nome completo e sem abreviações id_logradouro_principal int(6) S Sim Sim NULL FK com o código do Logradouro principal da ocorrência do sinistro. id_logradouro_sedundario int(6) S Sim Sim NULL FK com o código do Logradouro secundário da ocorrência do sinistro tx_descricao varchar(250) Não Texto descrevendo o sinistro que pode ocorrer em um veículo (incêndio, roubo, etc) dt_cadastro date Não Data de geração do registro 75. sinistros_veiculos Campo Tipo PK FK Ind. Nulo Padrão id_ocorrencia int(4) S Prim Não PK da Tabela. id_sinistro int(4) S Não FK indicando o código do sinistro id_veiculo int(6) S Não FK indicando o código do veículo que sofreu o sinistro id_numero_apolice int(6) S Não FK indicando o código do seguro que cobre o sinistro do veículo tx_logradouro_ocorrencia varchar(250) Texto descrevendo os logradouros e localidade da ocorrência do sinistro. dt_cadastro date Não Data de geração do registro 76. tarefas Campo Tipo PK FK Ind. Nulo Padrão id_tarefa int(4) S Prim Não PK da Tabela tx_nome_tarefa char(15) Não Nome curto da ação de projeto tx_descricao_tarefa varchar(250) Não Descrição completa de uma ação que é usada em projetos. qt_horas_padrao int(4) Sim NULL Quantidade de Horas padrão para a ação em qualquer projeto. dt_cadastro date Sim NULL Data de geração do registro 77. tarefas_projetos Campo Tipo PK FK Ind. Nulo Padrão id_tarefprojeto int(6) S Prim Não PK da tabela id_projeto char(6) S Sim Não FK indicando o código do projeto id_tarefa int(4) S Sim Não FK indicando o código da tarefas de projeto qt_horas_envolvidas int(3) Não Quantidade de horas comprometidas da ação no projeto nu_ordem_acao int(11) Sim NULL Número de ordem da tarefa dentro do projeto dt_cadastro date Sim NULL Data de geração do registro 78. tipos_telefones Campo Tipo PK FK Ind. Nulo Padrão id_tipo_telefone int(6) S Prim Não PK da Tabela tx_descricao varchar(35) Não Texto descrevendo o tipo de telefonedt_cadastro date Não Data de geração do registro 79. tipos_veiculos Campo Tipo PK FK Ind. Nulo Padrão id_tipo_veiculo int(6) S Prim Não PK da Tabela tx_descricao varchar(250) Não Texto descrevendo o tipo de veiculo (carro, caminhonete, motocicleta, etc) dt_cadastro date Não Data de geração do registro 80. titulacoes Campo Tipo PK FK Ind. Nulo Padrão id_professor Int(3) S S Sim Não FK para professores e parte da PK da tabela id_titulo int(4) S S Sim Não FK para titulos e parte da PK da tabela dt_cadastro date Não Data de cadastro da titulação 81. titulos Campo Tipo PK FK Ind. Nulo Padrão id_titulo int(4) S Prim Não Pk da tabela tx_nome_titulo varchar(150) Não Descrição do Título dt_cadastro date Não Data de cadastro do título 82. veiculos Campo Tipo PK FK Ind. Nulo Padrão id_veiculo int(6) S Prim Não PK da Tabela id_placa char(7) Não Placa do carro (somente letras e números) id_funcionario int(6) S Sim Não FK indicando o código do funcionário. id_tipo_veiculo int(6) S Sim Não FK indicando o código do tipo de veiculo. id_modelo int(4) S Sim Sim NULL FK indicando o código do modelo. id_cor int(11) S Sim Sim NULL FK indicando o código da cor. ao_status char(1) Não Indica o status do veículo do Funcionário (P=Principal e S=Secundário). nu_ano_fabricacao year(4) Não Ano de fabricação do carro dt_cadastro date Não Data de geração do registro 83. viagens Campo Tipo PK FK Ind. Nulo Padrão id_viagem int(6) S Prim Não PK da Tabela id_onibus int(6) S Sim Não FK com o código do ônibus que realiza a Viagem. id_rota int(5) Sim NULL FK com o código da rota viária da viagem. dt_viagem date Não Data de realização da viagem hr_saida time Não Hora de saída da viagem Tabela 1. - Dicionário de dados da Base de Exercício em SQL. Este dicionário de dados apresenta DIFERENÇAS em relação ao que foi desenvolvido na base adm_exerc_sql. Considere tudo o que está neste dicionário como CERTO. Portanto, acerte as estruturas de TODAS as tabelas de sua base de dados MySQL. Aconselho que este trabalho seja feito em dupla. Enquanto um trabalha editando os campos das tabelas o outro fica com o dicionário aberto e verificando o andamento do trabalho de acerto da base. Isso pode ser feito até que se conclua o acerto do dicionário de dados da Base. Depois que a base estiver CERTA exportem as definições e prossigam separadamente com o trabalho. Prática de Comandos SQL Podemos explorar o ambiente com comandos SQL. Para isso, acesse o phpmyadmim, depois acesse a base de dados adm_exerc_sql. Clique no botão SQL no alto do menu do lado esquerdo. Uma janela vai aparecer sobreposta e "solta" do phpmyadmin. Esta janela "envia" os comandos para a outra. Deste modo podemos escrever os comandos na janela flutuante e o resultado do comando será visto na janela fixa. Teste alguns comandos. Vamos fazer assim: Você testa os comandos propostos neste documento E escreve no espaço abaixo as suas observações. No fim da sua jornada espero que você tenha aprendido muita coisa sobre o SQL. NOTE: Execute o comando mesmo. Esta É A MELHOR FORMA DE APRENDER: PRATICANDO! Como vocês estão trabalhando com a versão PDF aconselho que os comentários sejam escritos usando o programa FOXIT (http://cdn01.foxitsoftware.com/pub/foxit/reader/desktop/win/4.x/4.3/enu/FoxitReader431_enu_Setup.exe ). Este programa permite colocar janela de texto sobre os PDF. Se você conhece outro que faça isso, tudo bem. Use-o, mas saiba que seu trabalho será corrigido com o programa FOXIT, ou seja: TESTE seu PDF de resposta antes de me enviar. Note: alguns comandos podem estar ERRADOS. Podem estar com falta de algum campo ou parte necessária para a execução. Interprete-os mesmo assim e apresente a versão CORRETA dos comandos na área de interpretação. Vocês devem testar estes comandos tanto em MySQL como no PostgreSQL. ACONSELHO que vocês façam o trabalho andando lado a lado, ou de outra forma: teste o comando no MySQL e o mesmo comando no PotgreSQL. Para testar os comandos você pode usar a janela de comandos que o phpmyadmin e o phppgadmin disponibilizam. Em ambos os programas, depois de acessado a base de dados, vocês podem encontrar um acesso para uma janela onde é possível escrever comandos SQL e na janela principal visualizar o resultado (dados ou mensagens de erro). NOTE: vocês da equipe deverão apresentar somente UM arquivo PDF com as respostas tanto do ambiente MySQL como do ambiente do PostgreSQL. Por isso, mesmo que vocês respondam de modo separado as perguntas, depois copiem as respostas em um só arquivo. Sinceramente eu acho mais prático fazer assim: um dos alunos acessa um computador com a base MySQL e abre também o TESTESQL, outro acessa um outro computador com a base PostgreSQL, os testes devem ocorrer em paralelo e as interpretações escritas no computador com o TESTESQL aberto. Acho que deste modo será mais produtivo. Bem, vamos aos comandos em SQL. 1. SELECT * FROM funcionarios WHERE id_depto='A01'; (*) existe diferença entre as letras maiúsculas ou minúsculas (execute o mesmo comando com letras diferentes para os nomes de tabelas, campos e parâmetro de comparação)? Interpretação (MySQL): Denise Typewriter Denise Typewriter Através de uma seleção, feita na tabela funcionarios, será mostrado as tuplas do atributo id_depto que possuem valor 'A01'. O tipo de letra, não interfere no resultado solicitado apenas para tabelas ou para campos. Já para parâmetro de comparação, os resultados se alteram, ou seja, há diferenças quando você muda a letra de maiúscula para minúscula Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter 2. SELECT tx_primeiro_nome, dt_nascimento FROM funcionarios ORDER BY id_depto, id_funcao; Interpretação (MySQL): Denise Typewriter Denise Typewriter O resultado dos campos solicitados serão referente à tabela funcionarios aparecerá ordenadamente, através de uma projeção. Primeiro será selecionado, em ordem, os valores do atributo id depto. Depois, será selecionado, em ordem, os valores do atributo id funcao, mas apenas se os valores de id depto forem iguais. Denise Typewriter 3. SELECT id_depto, id_funcao, tx_primeiro_nome, tx_sobre_nome, dt_nascimento FROM funcionarios WHERE id_depto BETWEEN 'A01' AND 'D01' ORDER BY id_depto, id_funcao; Interpretação (MySQL): Denise Typewriter O resultado dos campos solicitados referente a tabela funcionarios aparecerá ordenadamente, através de uma projeção. Primeiro será selecionado, em ordem, os valores do atributo id_depto que estão dentro de um intervalo fechado ['A01', 'D01']. Depois, será selecionado, em ordem, os valores do atributo id_funcao, mas apenas se os valores de id_depto forem iguais. Denise Typewriter Denise Typewriter Denise Typewriter 4. Veja este comando: SELECT id_depto, id_funcao, tx_primeiro_nome, tx_sobre_nome, dt_nascimento FROM funcionarios WHERE id_depto BETWEEN 'A01' AND 'D11' ORDER BY id_depto, id_funcao; Agora se escrevermos: SELECT id_depto, id_funcao, tx_primeiro_nome, tx_sobre_nome, dt_nascimento FROM funcionarios WHERE id_depto IN ('A01','D11') ORDER BY id_depto, id_funcao; Interprete os comandos e a diferença entre eles. Interpretação (MySQL): Denise Typewriter PRIMEIRO: O resultado dos campos da tabela funcionarios aparecerá em ordem, através de uma projeção. Primeiro será selecionado os valores do atributo id_depto que estão no intervalo fechado ['A01', 'D11']. Depois, será selecionado os valores do atributoid_funcao, mas caso os valores de id_depto forem iguais. SEGUNDO: Com uma projeção, os resultados da tabela funcionario aparecerão em ordem. Primeiro será selecionado os valores do atributo id_depto que estão no conjunto ('A01','D11') e depois os valores do atributo id_funcao. A diferença entre os dois é que um mostra resultados de um intervalo fechado e o outro mostra os resultados de um conjunto de valores. Denise Typewriter Denise Typewriter 5. ALTER TABLE funcionarios ADD COLUMN id_chefe int(6) NOT NULL AFTER id_funcionario; Interpretação (MySQL): Denise Typewriter Comando faz uma alteração na tabela funcionarios, e acrescenta, depois da coluna id_funcionario, a coluna id_chefe. Denise Typewriter 6. ALTER TABLE nf_vendas ADD FOREIGN KEY (id_armazem) REFERENCES armazens (id_armazem) ON DELETE CASCADE ON UPDATE CASCADE; O Comando tratado aqui é o ALTER TABLE, vale um comentário: Sintaxe: ALTER TABLE <TAB> ADD FOREIGN KEY ( <CampoDaTab> ) REFERENCES <TAB da CE> (<CAMPO CE>) ON DELETE [cascade |set null | no action | restrict] ON UPDATE [cascade |set null | no action | restrict] (*) O estudo de cada ação do UPDATE ou DELETE é particular para cada tabela. Teste comandos para tabelas diferentes construindo diferentes FK. Faça uma consulta nas notas_fiscais_vendas com o código de armazém igual a '3'. Mais tarde aprenderemos a alterar valores em campos. O que será que vai acontecer se trocarmos o valor de '3' para '4' na tabela armazens? Mais tarde implemente e interprete este comando. (**) Execute o comando ALTER TABLE ADD FOREIGN KEY para TODAS as tabelas que apresentem relacionamentos. Este trabalho vai se refletir no Script que você vai gerar no final do trabalho e no tratamento de consistência de valores quando você estiver escrevendo seu programa aplicativo. Interpretação (MySQL): Denise Typewriter Para alterar a tabela e adicionar uma FK precisa fazer referencia a tabela armazem. Fazendo essa referencia, poderá fazer o delete ou update normalmente, mas assim que fizer uma dessas alterações, não pode esquecer de alterar a tabela que foi referenciada. Denise Typewriter 7. ALTER TABLE funcionarios DROP COLUMN id_chefe; Interpretação (MySQL): Denise Typewriter Primeiro altera-se a tabela funcionarios, em seguida, exclui a coluna id_chefe Denise Typewriter 8. SELECT * FROM funcionarios WHERE id_depto='A01' AND id_nivel_educacao>15 OR dt_contratacao<'2000-01-01'AND tx_sobre_nome LIKE "%E%"; Tente usar () delimitando ou agrupando condições e observe o resultado. Veja como funciona a combinação dos operadores lógicos AND e OR quando contidos entre (). No operador LIKE teste as seguintes situações; - com EM, como argumento de pesquisa - com um UNDERLINE "_" no lugar do % da esquerda na pesquisa - com DOIS UNDERLINE "_" no lugar do % da esquerda na pesquisa - com um UNDERLINE "_" no lugar do % da direita na pesquisa - com uma LETRA no lugar do % da direita na pesquisa Interpretação (MySQL): Denise Typewriter A seleção executará as tuplas da tabela funcionarios que possuem a coluna id_depto='A01' e id_nivel_educacao>15, ou dt_contratacao<'2000-01-01' e tx_sobre_nome com a letra E. Se colocar o () ele irá alterar a ordem dos comandos AND e OR. Se colocar o EM no lugar de E, ele irá localizar tuplas com EM; se colocar o '_', ele deixará de procurar algo que pode ter um número qualquer de caracteres anteriores ou posteriores ao caracter "E" para especificar a quantidade de caracteres de acordo o número de "_"; e '%' mostrará tuplas com qualquer letra. Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter 9. SELECT * FROM funcionarios WHERE id_funcionario IN (SELECT id_funcionario_gerente FROM departamentos); Dica: execute primeiro o comando da sub-query. Interprete este resultado e depois escreva o comando completo. Interpretação (MySQL): Denise Typewriter Nesse comando é possível realizar uma subquery em id_funcionario_gerente da tabela departamentos. Depois, o resultado será mostrado se o valor das tuplas estiverem nos campos id_funcionario da tabela funcionarios e id_funcionario_gerente da tabela departamentos ao mesmo tempo. Denise Typewriter Denise Typewriter 10. SELECT * FROM funcionarios, departamentos WHERE funcionarios.id_depto=departamentos.id_depto depto AND funcionarios.id_funcionario IN (10,80,170,280); Interpretação (MySQL): Denise Typewriter O comando terá que juntar as duas tabelas, funcionarios e departamentos, e mostrar os id_depto que estão presentes nas duas tabelas ao mesmo tempo. Só poderá mostrar que estão presentes no conjunto (10,80,170,280). Denise Typewriter 11. SELECT * FROM funcionarios, atuacoes, projetos WHERE funcionarios.id_funcionario=atuacoes.id_funcionario AND atuacoes.id_projeto=projetos.id_projeto; Interpretação (MySQL): Denise Typewriter Esse comando irá juntar as tabelas funcionarios, atuacoes e projetos, Depois irá mostrar os funcionarios que estiverem nas tabelas funcionarios e atuacoes ao mesmo tempo, e os projetos que estiverem nas tabelas atuacoes e projetos ao mesmo tempo. O resultado será os dados completos dos funcionarios e de suas atuaçoes em cada projeto. Denise Typewriter 12. CREATE TABLE func1 AS (SELECT * FROM funcionarios WHERE id_depto IN ('A01','E21')); CREATE TABLE func2 AS (SELECT * FROM funcionarios WHERE funcionarios.dt_contratacao<'2000-01-01'); CREATE TABLE dept AS (SELECT * FROM departamentos WHERE id_depto IN ('A01','D11')); Interpretação (MySQL): Denise Typewriter Os 3 comandos possibilitam criar tabelas: - a primeira com nome func1, irá mostrar os funcionários que possuem valor igual a 'A01' ou 'E21'; - a segunda com nome func2, irá mostrar os funcionários que foram contratados antes do dia 01/01/2000; - e a terceira com nome dept, irá mostrar os departamentos com valores iguais a 'A01' ou 'D11' Denise Typewriter 13. SELECT * FROM funcoes, funcionarios as func1, (SELECT * FROM departamentos WHERE id_depto_superior='A01') as dept WHERE funcoes.id_funcao=func1.id_funcao AND func1.id_depto=dept.id_depto; Interpretação (MySQL): Denise Typewriter O comando pede para juntar as tabelas funcoes, funcionarios e dept. As tabelas funcoes e funcionarios deverão ser renomeadas para func1, e a tabela dept surgirá a partir de uma seleçao feita na tabela departamentos, onde mostra as tuplas do campo id_depto_superior que possuem valores 'A01'. Feito isso, o resultado irá conter os valores do campo id_funcao desde que pertença às tabelas funcoes e func1, e mostrar também os valores de id_depto desde que esteja nas tabelas func1 e dept. Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter 14. SELECT funcoes.id_funcao, funcoes.tx_nome_funcao, func1.id_funcionario, tx_primeiro_nome, tx_sobre_nome, func1.id_depto, dept.id_depto, tx_nome_depto FROM funcoes, func1, departamentos as dept WHERE funcoes.id_funcao=func1.id_funcao AND func1.id_depto=dept.id_depto; (*) Por que algunscampos apresentados entre o SELECT e o FROM têm a indicação do nome da tabela e outros não? Interpretação (MySQL): Denise Typewriter Assim que projetar as colunas id_funcao e tx_nome_funcao da tabela funcoes; id_funcionario, tx_primeiro_nome, tx_sobre_nome e id_depto da tabela func1; e id_depto e tx_nome_depto da tabela departamentos, deverá juntar as tabelas funcoes, func1 e departamentos, e depois mudar seu nome para dept. A junção resultará nas colunas com as tuplas do campo id_funcao da tabela funcoes e da tabela func1; e nas colunas com as tuplas do campo id_depto da tabela func1 e da tabela dept. Em outras palavras, irá obter dados dos funcionários e suas funçoes em cada departamento. 15. SELECT * FROM funcoes INNER JOIN func1 ON funcoes.id_funcao=func1.id_funcao INNER JOIN dept ON func1.id_depto=dept.id_depto Interpretação (MySQL): Denise Typewriter Pede-se que junte a tabela funcoes, func1 e dept. O resultado terá que mostrar as tuplas do campo id_funcao da tabela funcoes, mas essa mesma tupla tem que estar na tabela func1; e terá que mostrar também as tuplas do campo id_depto da tabela func1, mas essa mesma tupla tem que estar na tabela dept também. Denise Typewriter 16. Select * FROM func1 UNION ALL (Select * FROM func2) (*) O que acontece se tiramos a palavra ALL? Quantas Linhas são recuperadas em cada um dos comandos? Interpretação (MySQL): Denise Typewriter A partir de uma união feita com as tabelas, o comando irá mostrar uma soma entre as tuplas de func1 e func2. Assim que retirar a palavra ALL do comando, ele irá eliminar aquelas tuplas que aparecem mais de uma vez, mostrando elas apenas uma vez e assim, com menos tuplas do que o comando original apresentou. 17. SELECT id_funcionario, tx_primeiro_nome, tx_iniciais_medias, tx_sobre_nome, id_depto, nu_telefone, dt_contratacao FROM (Select * FROM func1 UNION (Select * FROM func2) ) AS T1; Interpretação (MySQL): Denise Typewriter O comando pede para que una as tabelas func1 e func2, e faça uma projeção dos campos citados acima. A coluna nu_telefone terá que ser renomeada para nu_ramal porque não existe no dicionário de dados. Denise Typewriter 18. Select * FROM funcionarios WHERE id_funcionario NOT IN (Select id_funcionario FROM func2); Interpretação (MySQL): Denise Typewriter O comando projeta todos os campos da tabela funcionarios, trazendo as tuplas que nao apresentam o valor id_funcionario presente no conjunto de valores id_funcionario da tabela func2. Denise Typewriter 19. SELECT * FROM funcionarios WHERE id_funcionario NOT IN (SELECT T1.id_funcionario FROM (SELECT * from func1 UNION (SELECT * FROM func2)) AS T1); Tente escrever as expressões da álgebra relacional que poderia ser traduzida neste comando SQL. Interpretação (MySQL): Denise Typewriter Assim que for feita a união entre as tabelas func1 e func2, o comando irá fazer uma projeção com os campos da tabela funcionarios, e depois irá trazer as tuplas que não possuem o valor da coluna id_funcionario presentes no conjunto que será obtidos a partir dessa união. 20. SELECT * FROM funcionarios INNER JOIN func1 USING (id_funcionario); Interpretação (MySQL): Denise Typewriter Com uma junção natural entre as tabelas, o resultado mostrará o valor de id_funcionario, cada um em uma tupla, mesmo se ele for o mesmo valor para as duas tabelas, ou seja, não importa se tiver valores repetidos. Denise Typewriter Denise Typewriter 21. SELECT * FROM funcionarios LEFT JOIN dept ON funcionarios.id_depto=dept.id_depto UNION (SELECT * FROM funcionarios RIGHT JOIN dept ON funcionarios.id_depto=dept.id_depto); Interpretação (MySQL): Denise Typewriter O comando irá fazer uma união com o resultado obtido entre os dois tipos de junções que deverá ser feita: primeiro é feita uma junção aberta pela esquerda com as tabelas funcionarios e depto, e depois, é feita uma junção aberta pela direita com essas mesmas tabelas. Em cada junção feita, será usada a coluna id_depto. Denise Typewriter 22. SELECT funcionarios.id_funcionario, funcionarios.tx_primeiro_nome, dept.id_depto, dept.tx_nome_depto FROM funcionarios, dept WHERE funcionarios.id_depto=dept.id_depto; Compare o comando acima com os seguintes abaixo (comente as diferenças); SELECT funcionarios.id_funcionario, funcionarios.tx_primeiro_nome, dept.id_depto, dept.tx_nome_depto FROM funcionarios LEFT JOIN dept ON funcionarios.id_depto=dept.id_depto; Ou ainda: SELECT funcionarios.id_funcionario, funcionarios.tx_primeiro_nome, dept.id_depto, dept.tx_nome_depto FROM funcionarios LEFT JOIN dept ON funcionarios.id_depto=dept.id_depto ORDER BY dept.id_depto DESC; Interpretação (MySQL): Denise Typewriter O primeiro comando é uma junção completa. O segundo e o terceiro são uma junção aberta pela esquerda, a diferença entre os dois é que, no terceiro comando seu resultado deverá aparecer em ordem decrescente.No primeiro e no segundo comando, o resultado será as tuplas dos campos id_funcionario e tx_primeiro_nome da tabela funcionarios e as tuplas do campo id_depto e tx_nome_depto da tabela dept. E no terceiro comando, o resultado será as tuplas do campo os valores de id_depto, da tabela dept, em ordem decrescente. Denise Typewriter Denise Typewriter 23. Qual a diferença entre os seguintes comandos? SELECT * FROM dept RIGHT JOIN funcionarios ON funcionarios.id_depto=dept.id_depto; SELECT * FROM funcionarios RIGHT JOIN dept ON funcionarios.id_depto=dept.id_depto Interpretação (MySQL): Denise Typewriter A diferença entre os dois comandos são: o primeiro projeta as colunas da junção das tabelas dept e funcionarios, sendo uma junção aberta pela direita e pela tabela funcionarios, e mostra as tuplas da coluna id_depto. Já o segundo, projeta as mesmas colunas da junção das tabelas dept e funcionarios, mas ela é aberta pela tabela dept. Denise Typewriter Denise Typewriter 24. Comente a diferença entre os seguintes comandos: SELECT * FROM tarefas, tarefas_projetos, projetos WHERE tarefas.id_tarefa = tarefas_projetos.id_tarefa AND tarefas_projetos.id_projeto=projetos.id_projeto; SELECT * FROM tarefas JOIN tarefas_projetos ON tarefas.id_tarefa=tarefas_projetos.id_tarefa JOIN projetos ON tarefas_projetos.id_projeto=projetos.id_projeto; Interpretação (MySQL): Denise Typewriter A partir de uma projeção de todos os campos das tabelas: tarefas, tarefas_projetos e projetos, e a partir da junção natural entre elas, utilizando como condição de emparelhamento entre as tabelas tarefas e tarefas_projetos o campo id_tarefa e entre acoes_projetos e projetos o campo id_projeto. Denise Typewriter Denise Typewriter Denise Typewriter 25. SELECT * FROM tarefas, tarefas_projetos, projetos WHERE tarefas.id_tarefa=tarefas_projetos.id_tarefa AND tarefas_projetos.id_projeto=projetos.id_projeto ORDER BY projetos.id_projeto asc; Teste mudanças na ordenação com ASC ou DESC Interpretação (MySQL):Denise Typewriter Através de uma junção natural entre as tabelas tarefas, tarefas_projetos e projetos, pede-se as tuplas do campo id_projeto em ordem ascendente. O DESC irá trocar a ordem dos resultados, que aparecerá em ordem decrescente. Denise Typewriter 26. SELECT * FROM tarefas, tarefas_projetos, projetos WHERE tarefas.id_tarefa=tarefas_projetos.id_tarefa AND tarefas_projetos.id_projeto=projetos.id_projeto GROUP BY projetos.id_projeto ORDER BY projetos.id_projeto asc; Experimente este comando sem o "Group by" e sem o "Order by" depois execute o mesmo comando com estes dois complementos. Comente a diferença. Interpretação (MySQL): Denise Typewriter Com uma junção natural entre as tabelas citadas, o resultado deverá ser as tuplas do campo id_projeto, da tabela projetos. Ele deve estar agrupado e em ordem ascendente. O ''GROUP BY'' retira o resultado do grupo, e o "ORDER BY" não mostra o resultado ordenado. Denise Typewriter 27. SELECT * FROM (select id_projeto as idp, tx_nome_projeto from projetos) as p1, atuacoes, (select id_funcionario as idf, tx_primeiro_nome from funcionarios) as f1 WHERE p1.idp=atuacoes.id_projeto AND atuacoes.id_funcionario=f1.idf; Para estudar este comando escreva antes este: SELECT * FROM projetos, atuacoes, funcionários WHERE projetos.id_projeto=atuacoes.id_projeto AND atuacoes.id_funcionario=funcionarios.id_funcionario e veja a estrutura de campos montada, repare nos nomes de campos repetidos. Depois execute e analise o comando proposto acima. Interpretação (MySQL): Denise Typewriter O comando pede para que renomeie o campo id_projeto por idp e id_funcionario por idf. Depois, ele pede para que selecione os campos idp e tx_nome_projeto da tabela projetos, e renomeie-os para p1. Depois, ele pede para que selecione os campos idf e tx_primeiro_nome da tabela funcionarios, e renomeie-os para f1. Depois, ele pede para que faça uma junção entre as tabelas p1, f1 e atuacoes. Com isso, será feito uma junção nas tuplas de idp e id_projeto das tabelas p1 e atuacoes, e id_funcionario e idf das tabelas atuacoes e f1. Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter Denise Typewriter 28. SELECT id_depto, (vl_salario+vl_bonus+vl_comissao) as Remuneracao FROM funcionarios WHERE (vl_salario+vl_bonus+vl_comissao) > 80000 GROUP BY id_depto ORDER by id_depto Interpretação (MySQL): Denise Typewriter Esse comando projeta o id_depto e a remuneração total de um funcionario de um departamento. Essa remuneração total é calculada com base na soma de vl_salario, vl_bonus e vl_comissao. Os resultados serão agrupados e ordenados com as remunerações totais maiores que 80000. Denise Typewriter Denise Typewriter 29. SELECT id_depto, (vl_salario+vl_bonus+vl_comissao) as Remuneracao FROM funcionarios GROUP BY id_depto HAVING Remuneracao>80000 ORDER by id_depto Comente o uso do subcomando HAVING Interpretação (MySQL): Denise Typewriter Esse comando projeta o id_depto e a remuneração total de um funcionario de um departamento. Essa remuneração total é calculada com base na soma de vl_salario, vl_bonus e vl_comissao. Os resultados serão as tuplas de cada departamento com os dados do funcionário que tem remuneração maior que 80000. Essas tuplas serão agrupadas e ordenadas. Denise Typewriter 30. SELECT id_funcionario as CodFunc, vl_salario as Salario, (vl_salario * 1.2314521) as SalCorr1, TRUNCATE(vl_salario * 1.2314521,1 ) as SalCorr2 FROM funcionarios WHERE vl_salario < 60000 ORDER BY id_funcionario Dê atenção ao uso da função TRUNCATE. Interprete e depois troque a função TRUNCATE por ROUND. Interpretação (MySQL): Denise Typewriter O comando projeta as colunas id_funcionario renomeadas para CodFunc, e vl_salario renomeadas para Salario. A condição pede que calcule duas vezes o vl_salario multiplicado por 1.2314523: uma será renomeado para SalCorr1 e a outra será renomeada para SalCorr2, onde registrará sua soma com uma casa decimal. Ele irá ordenar somente as tuplas que apresentam um valor na coluna vl_salario < 60000. Quando trocamos o TRUNCATE por ROUND conseguimos arredondar o valor da multiplicação e também deixá-los com uma casa decimal. Denise Typewriter 31. SELECT SUBSTR(tx_primeiro_nome,2, 5) FROM funcionarios; Mude os valores 2 e 5 e interprete a mudança PESQUISE e escreva pelo menos mais 5 (CINCO) funções de tratamento de textos no MySQL e no PostgreSQL Interpretação (MySQL): Denise Typewriter Esse comando irá mostrar os nomes dos funcionários, com 5 letras cada e a partir da 2ª letra, da tabela funcionário. O número 2 indica onde o nome começará a ser exibido, e o número 5 indica a quantidade de letras de cada nome.Portanto, se alterar esses números, ele irá mostrar a partir de outra letra e com outra quantidade de letras. Denise Typewriter Denise Typewriter 32. SELECT SUM(vl_salario) AS "Total", AVG(vl_salario) AS "Média", MIN(vl_salario ) AS "MIN", MAX(vl_salario) AS "MAX", COUNT(*) AS "Conta", id_depto AS "Dept." FROM funcionarios GROUP BY id_depto ORDER BY id_depto Execute este comando sem o GROUP BY e avalie a diferença Interpretação (MySQL): Denise Typewriter Nesse comando, é necessário que faça com os salários a soma, a média, os valores maximo e minimo e a quantidade de funcionários. Feito os cálculos, é necessário que mude os nomes para "Total" quando fizer a soma, "Média" quando achar a média, "MIN" quando achar o valor mínimo, "MAX" quando achar o valor máximo e "Conta" para mostrar a quantidade de funcionários. O "Dept" serve para mostrar os departamentos. Feito isso, as tuplas deverão ser agrupadas em ordem. 33. SELECT count(tarefas_projetos.id_tarefa) as 'qtd acao', projetos.id_projeto FROM tarefas, tarefas_projetos, projetos WHERE tarefas.id_tarefa=tarefas_projetos.id_tarefa AND tarefas_projetos.id_projeto=projetos.id_projeto GROUP BY projetos.id_projeto HAVING count(tarefas_projetos.id_tarefa)>=10 ORDER BY projetos.id_projeto asc; Teste este comando tirando o subcomando HAVING e avalie a diferença. Interpretação (MySQL): Denise Typewriter O comando mostra a quantidade de tarefas de cada projeto, através de uma junção feita com as tabelas tarefas, tarefas_projetos e projetos. Essa quantidade de tarefas será ordenada pelo resultado das tuplas de id_projeto de maneira ascendente. 34. SELECT id_depto, ao_sexo, sum( vl_salario ) FROM funcionarios GROUP BY (concat( id_depto, ao_sexo )) ORDER BY id_depto, ao_sexo Teste este comando com ORDER BY concat( id_depto, ao_sexo ) e avalie a diferença. Interpretação (MySQL): Denise Typewriter O comando mostra as tuplas de id_depto, ao_sexo e a soma as tuplas do campo vl_salario, da tabela funcionarios. O concat ajudará a mostrar os resultados de maneira que, separe as tuplas do sexo masculino com as tuplas do sexo feminino. Essas tuplas serão agrupadas e ordenadas a partir das tuplas das colunas id_depto e ao_sexo. Denise Typewriter 35. SELECT id_depto,
Compartilhar