Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 2 Sumário UNIDADE I - CONCEITOS DE BANCOS DE DADOS ................................................................................ 3 1. Características de Sistemas de Bancos de Dados .................................................................................. 4 2. Transações ............................................................................................................................................. 5 3. Vantagens de se Utilizar um SGBD ...................................................................................................... 8 UNIDADE II -MODELO RELACIONAL ..................................................................................................... 15 1. O Modelo Relacional ........................................................................................................................... 16 2. Introdução à Modelagem ..................................................................................................................... 17 3. Atributos .............................................................................................................................................. 19 4. Tipos de Atributos ............................................................................................................................... 21 5. Domínio ............................................................................................................................................... 23 6. Chave Estrangeira (Foreign Key) ........................................................................................................ 23 UNIDADE III - SQL BÁSICO ....................................................................................................................... 31 1. SQL.......................................................................................................................................................... 32 2. Restrições ................................................................................................................................................ 35 3. Consultas Básicas em SQL ...................................................................................................................... 37 4. Comandos de Modificação de Dados em SQL ........................................................................................ 38 UNIDADE IV - MAIS SQL ............................................................................................................................ 41 1. Consultas Envolvendo NULL ................................................................................................................. 42 2. Consultas Aninhadas (Subqueries) .......................................................................................................... 53 3. Consultas Utilizando Joins ....................................................................................................................... 57 4. Comandos de Alteração de Schema ......................................................................................................... 61 5. Inserindo, Modificando e Excluindo Registros ....................................................................................... 65 6. Transações ............................................................................................................................................... 68 7. Visões ...................................................................................................................................................... 69 8. Índices...................................................................................................................................................... 72 9. Segurança ................................................................................................................................................ 74 CONCLUSÃO ............................................................................................................................................... 82 REFERÊNCIAS ............................................................................................................................................ 82 3 UNIDADE I - CONCEITOS DE BANCOS DE DADOS 4 1. Características de Sistemas de Bancos de Dados Banco de Dados - Representa o arquivo físico de dados, armazenado em dispositivos periféricos, onde estão armazenados os dados de diversos sistemas, para consulta e atualização pelo usuário. Tabelas Lógicas - Representam as estruturas de armazenamento de dados (arquivos) dos sistemas. S.G.D.B. (Sistema Gerenciador de Banco de Dados) - É o software responsável pelo gerenciamento (armazenamento e recuperação) dos dados no Banco de Dados. Dado - É o valor do campo quando é armazenado no Banco de Dados. Ex. O valor do campo "nome do cliente" para quem está fazendo a entrada de dados. Conteúdo do campo - É o valor do campo armazenado no Banco de Dados. Ex. O valor do campo "nome do cliente" sem estar, momentaneamente, sendo utilizado. Informação - É o valor que este campo representa para as atividades da empresa. Ex. Resposta a uma consulta. Qual os nomes do clientes localizados no Rio de Janeiro? Modelo de Banco de Dados: Modelo Relacional, Modelo Hierárquico e Modelo em Rede. Representa a estrutura física no qual o armazenamento dos dados foram projetados. O modelo identifica a estrutura interna de recuperação e armazenamento dos dados no qual o SGBD foi projetado. 5 Visões do Banco de Dados: a - Visão Interna - É aquela vista pelo responsável pela manutenção e desenvolvimento do SGBD. Existe a preocupação com a forma de recuperação e manipulação dos dados dentro do Banco de Dados. b - Visão Conceitual - É aquela vista pelo analista de desenvolvimento e pelo administrador das bases de dados. Existe a preocupação na definição de normas e procedimentos para manipulação dos dados, para garantir a sua segurança e confiabilidade, o desenvolvimento de sistemas e programas aplicativos e a definição no banco de dados de novos arquivos e campos. Na visão conceitual, existem 2 (duas) linguagens de operação que são: 1) Linguagem de definição dos dados (DDL) - Linguagem que define as aplicações, arquivos e campos que irão compor o banco de dados (comandos de criação e atualização da estrutura dos campos dos arquivos). 2) Linguagem de manipulação dos dados (DML) - Linguagem que define os comandos de manipulação e operação dos dados (comandos de consulta e atualização dos dados dos arquivos). c - Visão Externa - É aquela vista pelo usuário que opera os sistemas aplicativos, através de interfaces desenvolvidas pelo analista (programas), buscando o atendimento de suas necessidades. 2. Transações O conceito de transação é fundamental em muitas áreas da computação e parti- cularmente fundamental em sistemas de banco de dados. Consideramos como 6 transação uma determinada “unidade de trabalho”, que é realizada em qualquer sistema computacional de um modo coerente e independente de outras transa- ções. Essas transações devem permitir que o sistema esteja num estado coerente antes e depois de sua execução, independente de falhas ou outros problemas que possam ocorrer. Devem permitir também que vários clientes diferentes acessem concorrentemente o sistema sem que isso possa corromper ou levar a estados que não sejam considerados coerentes. Uma definição clássica do conceito de transações envolve o acrônimo ACID, oriundo das propriedades de Atomicidade, Consistência, Isolamento e Durabilidade. Atomicidade: a propriedade atomicidade de banco de dados advém do con- ceito de átomo da física – o qual até recentemente supunha-se indivisível. Essa indivisibilidade pressupõeque as operações realizadas numa transação sejam todas realizadas por completo ou que nenhuma seja realizada. Popularmente seria o conceito do “tudo ou nada”. Isso permite que durante a nossa interação com um banco de dados possamos agrupar vários comandos relacionados com a garantia de que todos sejam executados – de modo que as informações arma- zenadas permaneçam num estado consistente após a execução da transação. Consistência: a propriedade de consistência assegura que a execução de qualquer transação trará o banco de dados de um estado consistente para outro estado também consistente. No caso, a “consistência” implica que todos os dados de um banco de dados devem ser válidos de acordo com um conjunto de regras que podem incluir restrições de tipo, valor, referências entre informações etc. Isolamento: a propriedade de isolamento determina que o resultado da execução concorrente de um conjunto de transações terá o mesmo resultado de sua execução em série (uma após a outra). O isolamento transacional é o que garante e permite o acesso concorrente de 7 múltiplos usuários ao mesmo SGBD. Durabilidade: a propriedade de durabilidade garante que uma vez que uma transação tenha sido finalizada com sucesso, os dados terão a garantia de terem sido armazenados corretamente – independentemente da eventualidade de falhas, falta de energia, erros de aplicação etc. Em nossa opinião, é justamente a propriedade de durabilidade que faz com que os bancos de dados sejam posicionados como “ferramentas sagradas” em muitas empresas. Novamente, não há menosprezo algum em dizer que o mais importante é o código que atende aos processos de negócios. Durabilidade é essencial: imagine qualquer empresa perdendo todos os seus dados. A continuidade do próprio negócio está em risco. Mas mais importante do que os dados em si é o uso que se faz deles. Sistemas tradicionais que vêm sendo desenvolvidos nas últimas décadas sempre tiveram como premissa em seus dados sua corretitude (grau em que o software executa suas funções de modo correto). Isso normalmente implicou na utilização de um banco de dados que pudesse satisfazer as pro- priedades ACID. Com o aumento da quantidade de informações e usuários nas aplicações, o fator disponibilidade passou em alguns casos a ser mais importante do que a própria consistência das informações. Estado flexível e Eventualmente consistente. O BASE tornou- se uma sigla bastante comum ao lidar com bancos de dados não relacionais. Uma reflexão que vale a pena ser feita é: para os novos desafios e empreita- recomendado e em quais outras situações o BASE mostra-se mais adequa- do? 8 Papéis assumidos pelos usuários de SGBDs: DESENVOLVEDORES DE SGBDS São pessoas que projetam e codificam os SGBDs. Exem- plos de pessoas nesses papéis incluem os funcionários de empresas como Oracle, IBM e Microsoft que atuam diretamente na programação do software SGBD. No caso de SBGDs livres, podem ser também voluntários ou pes- soas e empresas interessadas na evolução do software. Normalmente são programadores altamente qualificados que trabalham no código-fonte do SBGD. Mas voluntários de projetos de software livre também podem contribuir em outras atividades, como documentação, por exemplo. DESENVOLVEDORES DE APLICAÇÕES E ADMINISTRADORES DE BANCOS DE DADOS (DBAS – DATABASE ADMINISTRATORS) São pessoas que desenvolvem software que armazena as informações em um SGBD. Tradicionalmente, em abordagens mais tradicionais e conservadoras, as equipes de desenvolvimento são separadas em desenvolvedores e DBAs. Os primeiros desenvolvem o software que acessa o SGBD. Os segundos projetam os bancos de dados e os mantêm. Em abordagens de desenvolvimento mais modernas, tende-se a eliminar essa distinção entre os papéis, pois quanto maior a distância entre os membros da equipe envolvidos no projeto de software, menor tende a ser a qualidade do software entregue. USUÁRIOS FINAIS São pessoas que não interagem diretamente com os bancos de dados, e sim com as aplicações criadas pelos desenvolvedores de software que armazenam suas informações em SGBDs. A maioria das pessoas enquadra-se nessa categoria e, embora sejam os grandes beneficiados pela tecnologia dos sistemas de bancos de dados, raramente possuem ciência do fato. 3. Vantagens de se Utilizar um SGBD Definições: Sistema Tradicional - São aqueles em que os dados do sistema estão armazenados fisicamente separados um do outro. O acesso é feito pelos programas de aplicação, associando o nome externo dos arquivos e definindo todo o registro independente da utilização dos campos. Sistema de Banco de Dados - É aquele em que os dados são definidos para o S.G.B.D., através da DDL (linguagem de definição de dados). Fisicamente estão armazenados em um único local, sendo o acesso realizado apenas através do S.G.B.D. Nos programas de aplicação, é necessário apenas definir os campos que 9 serão utilizados pelo programa. Vantagens do Banco de Dados: 1 - Redução ou Eliminação de Redundâncias - Possibilita a eliminação de dados privativos de cada sistema. Os dados, que eventualmente são comuns a mais de um sistema, são compartilhados por eles, permitindo o acesso a uma única informação sendo consultada por vários sistemas. 2 - Eliminação de Inconsistências - Através do armazenamento da informação em um único local com acesso descentralizado e, sendo compartilhada à vários sistemas, os usuários estarão utilizando uma informação confiável. A inconsistência ocorre quando um mesmo campo tem valores diferentes em sistemas diferentes. Exemplo, o estado civil de uma pessoa é solteiro em um sistema e casado em outro. Isto ocorre porque esta pessoa atualizou o campo em um sistema e não o atualizou em outro. Quando o dado é armazenado em um único local e compartilhado pelos sistemas, este problema não ocorre. 3 - Compartilhamento dos Dados - Permite a utilização simultânea e segura de um dado, por mais de uma aplicação ou usuário, independente da operação que esteja sendo realizada. Deve ser observada apenas o processo de atualização concorrente, para não gerar erros de processamento (atualizar simultaneamente o mesmo campo do mesmo registro). Os aplicativos são por natureza multiusuário. 4 - Restrições de Segurança - Define para cada usuário o nível de acesso a ele concedido (leitura, leitura e gravação ou sem acesso) ao arquivo e/ou campo. Este recurso impede que pessoas não autorizadas utilizem ou atualizem um determinado arquivo ou campo. 10 5 - Padronização dos Dados - Permite que os campos armazenados na base de dados sejam padronizados segundo um determinado formato de armazenamento (padronização de tabela, conteúdo de compôs, etc) e ao nome de variáveis seguindo critérios padrões preestabelecido pela empresa. Ex. Para o campo "Sexo" somente será permitido armazenamento dos conteúdos "M" ou "F". 6 - Independência dos Dados - Representa a forma física de armazenamento dos dados no Banco de Dados e a recuperação das informações pelos programas de aplicação. Esta recuperação deverá ser totalmente independente da maneira com que os dados estão fisicamente armazenados. Quando um programa retira ou inclui dados o SGBD compacta-os para que haja um menor consumo de espaço no disco. Este conhecimento do formato de armazenamento do campo é totalmente transparente para o usuário. A independência dos dados permite os seguintes recursos: a - Os programas de aplicação definem apenas os campos que serão utilizados independente da estrutura interna dos arquivos b - Quando há inclusão de novos campos no arquivo, será feita manutenção apenas nos programas que utilizam esses campos, não sendo necessário mexer nos demais programas. Obs.: Nos sistemas tradicionaiseste tipo de operação requer a alteração no lay-out de todos os programas do sistema que utilizam o arquivo. 7 - Manutenção da Integridade - Consiste em impedir que um determinado código ou chave em uma tabela não tenha correspondência em outra tabela. Ex. Um código de uma determinada disciplina na tabela “Histórico Escolar” sem a sua descrição na tabela “Disciplina”. 11 LEITURA COMPLEMENTAR: BANCOS DE DADOS OPEN SOURCE: PRESENTE OU FUTURO? Cezar Taurion Nos eventos sobre Open Source, volta e meia surge uma pergunta sobre bancos de da- dos Open Source. Bem, tenho minha opinião pessoal e quero compartilhar com você. Vamos ver se vai gerar muita discordância. Os softwares de banco de dados são um dos mais importantes componentes de softwa- re de uma organização. Nesse ambiente, as alternativas de software livre já são bastante conhecidas e frequentemente são mencionadas na mídia, como MySQL, PostgreSQL, Ingres e Derby. O MySQL é um produto de uma empresa privada, a MySQL AB. Seu código é desenvolvi- do pelos funcionários da empresa e com isso ela garante a propriedade intelectual sobre o produto. Existe uma comunidade envolvida, mas submissões de código são restritas apenas à correção de bugs. Uma pergunta: o MySQL pode ser considerado realmente Open Source, uma vez que não adota o modelo de desenvolvimento colaborativo? O MySQL é ofertado tanto em GPL como sob licença comercial. As duas versões são fun- cionalmente equivalentes, sendo diferenciadas pelo nível de suporte e certificação. In- discutivelmente é o banco de dados Open Source mais popular, com o maior mindshare do setor. Outro software é o PostgreSQL, que tem suas origens no Postgres desenvolvido pela Universidade de Berkeley. Podemos citar também o Ingres, que foi um banco de dados da Computer Associates e agora pertence a uma organização independente, a Ingres Corporation (<www.ingres.com>) e o Derby, originalmente o Cloudscape da IBM e re- centemente doado para a Apache Software Foundation, onde agora é o projeto Derby. O Derby (<http://db.apache.org/derby/>) é um banco de dados em Java, geralmente embarcado em outros softwares. A IBM, por exemplo, o utiliza embutido em diversos softwares das famílias WebSphere, Tivoli e Lotus. Nas minhas andanças pelo mercado tenho visto que na prática os bancos de dados Open Source só aparecem como competidores dos produtos mais avançados nas apli- cações pouco sofisticadas ou bem específicas. Por sua vez, os sistemas de banco de dados proprietários buscam http://www.ingres.com/ http://www.ingres.com/ http://db.apache.org/derby/ http://db.apache.org/derby/ 12 competir com funcio- nalidades diferenciadoras, principalmente as relacionadas com administração de am- bientes complexos; escalabilidade; desempenho com grande volume de transações; alta disponibilidade e capacidade de recuperação rápida; e recursos de data warehousing. Além disso, foi criado um ecossistema de negócios em torno dos principais softwares de banco de dados proprietários, com diversas empresas independentes oferecendo ferra- mentas de software complementares (geradores de relatórios, analisadores estatísticos e outros), serviços de suporte técnico especializado e formação de recursos humanos, e assim por diante, o que também cria uma barreira de entrada difícil de transpor por qualquer novo entrante. Já o ecossistema empresarial criado em torno dos bancos de dados Open Source (onde se gera dinheiro) ainda é incipiente, sendo formado por pequenas empresas com abrangência de atuação bastante limitada. Ano passado, a MySQL gerou cerca de 50 milhões de dólares em receita (<http://news.com.com/MySQL+hits+50+million+reve- nue,+plans+IPO/2100-7344_3-6179290.html>), mas ainda é um traço (cerca de 0,03%) no gráfico que mostra o mercado global de bancos de dados relacionais, estimado pelo IDC em 16 bilhões de dólares. Como comparativo, o IDC estima que, nesse mesmo ano, a receita da IBM com a família de produtos DB2 foi de aproximadamente 3,5 bilhões de dólares. Qual o papel que os bancos de dados Open Source desempenharão? Na minha opinião, estarão atuando (pelo menos nos próximos 3 a 4 anos) na chamada faixa de produtos com funcionalidades comoditizadas, onde as características de preço são as de maior importância. Os usuários típicos serão organizações e aplicações que não precisam de recursos mais sofisticados. Como avaliar a qualidade de um banco de dados Open Source? Existem diversos crité- rios que podem e devem ser considerados em uma análise para seleção de um banco de dados. Os níveis de importância das variáveis da análise estão diretamente relacionados com os objetivos do negócio e das necessidades a serem impostas aos softwares de bancos de dados. Alguns dos principais fatores a serem considerados são: a. Recursos de gerenciamento e administração. São as ferramentas de apoio às ta- refas do administrador do banco de dados. b. Desempenho e escalabilidade. Os recursos que o software oferece para garantir desempenho adequado, nos volumes de transações que serão demandados. http://news.com.com/MySQL%2Bhits%2B50%2Bmillion%2Breve- http://news.com.com/MySQL%2Bhits%2B50%2Bmillion%2Breve- http://news.com.com/MySQL%2Bhits%2B50%2Bmillion%2Breve- 13 c. Recursos técnicos. Disponibilidade de recursos como triggers, stored procedu- res, cursors, subqueries, capacidade de replicação, recursos de indexação, aderência a padrões (ANSI SQL), particionamento, backup/recovery, suporte a dados não es- truturados, independência de plataforma e recursos de segurança. d. Custos de Propriedade. e. Suporte técnico e disponibilidade de recursos humanos. Abrangência do ecos- sistema em termos de serviços de suporte e qualificação de recursos humanos. f. Disponibilidade de aplicativos. g. Recursos de data warehousing e BI. h. Recursos de desenvolvimento de aplicações. i. Modalidade de licenciamento. j. Visão, estratégia e road map do produto. k. Tamanho e participação/envolvimento da comunidade. l. Modelo de governança adotado pela comunidade. m. Base instalada e adoção pelo mercado. Bem e quanto a uma pergunta que muitos me fazem... Minha empresa deve adotar um banco de dados Open Source? Para mim, para mudar um software de banco de dados deve haver uma estratégia impulsionada por razões fortes e consistentes. Por exemplo, se houver desconfianças que o atual fornecedor esteja saindo do mercado; falta de fun- cionalidade do software (não é mais adequado às necessidade das novas aplicações da empresa); falta de visão estratégica por parte do fornecedor do software atual; custos de manutenção e operação muito elevados para o resultado obtido; falta de pessoal gaba- ritado, que esteja disponível no mercado; carência de consultorias e serviços de suporte externos; relacionamento com o fornecedor cada vez mais deteriorado... Mudar para um banco de dados Open Source simplesmente por questões ideológicas deve estar fora de cogitação, pois banco de dados é muito sério para ser tratado de forma simplista. OK. E quais seriam então os custos e riscos da migração? Existem custos de migração que não podem ser subestimados. Temos os custos da conversão de dados, custos da codificação, testes e o que chamamos reconciliação entre as aplicações no novo e no antigo ambiente, sempre considerando que dificilmente conseguiremos fazer uma mi- gração estilo big bang, mas que esta será gradual. Quanto mais complexas forem as aplicações a serem convertidas, mais custosa será a migração. Essa complexidade pode ser medida pelo número de programas, número de tabelas relacionais, restrições 14 de integridade referencial e tamanho do banco de dados. Existem custos indiretos como a construção de interfaces entre as aplicações já con- vertidas e as que ainda estão no banco de dados antigo.Também os custos de supor- te técnicos aos dois ambientes implicam, muitas vezes, em gastos adicionais elevados, principalmente quando o novo banco de dados não for de completo domínio da equipe técnica da empresa. Em resumo, os custos da migração afetam os cálculos de custos totais de propriedade. A maioria das empresas é extremamente cautelosa em trocar de fornecedor de softwares críticos. O perigo de uma interrupção nos seus negócios decorrente de uma troca mal planejada ou inadequada faz com que os custos de troca possam ser extremamente elevados e desestimuladores. Migrar de um banco de dados para outro é sempre uma tarefa complexa e de alto risco, que só deve ser efetuada quando os benefícios forem claramente demonstráveis. Fonte:Taurion (2007, online). 15 UNIDADE II -MODELO RELACIONAL 16 1. O Modelo Relacional Definição: Consiste em mapear o mundo real do sistema em um modelo gráfico que irá representar o modelo e o relacionamento existente entre os dados. Entidade - Identifica o objeto de interesse do sistema e tem "vida" própria, ou seja, a representação abstrata de um objeto do mundo real sobre o qual desejamos guardar informações. Exemplo: Clientes, Fornecedores, Alunos, Funcionários, Departamentos, etc. Não são entidades: - Entidade com apenas 1 elemento; - Operações do sistema; - Saídas do sistema; - Pessoas que realizam trabalhos (usuários do sistema); - Cargos de direção Instância de Entidade - São os elementos da entidade. Exemplo: Cliente 10, Funcionário João, Aluno Pedro, etc. Atributo - Informações que desejamos guardar sobre a instância de entidade. Exemplo: Nome do aluno, Número da turma, Endereço do fornecedor, Sexo do funcionário, etc. 17 Domínio do Atributo - Universo de valores que um atributo pode armazenar. Exemplo: -Conjunto de valores do atributo Sexo do funcionário: M ou F; -Conjunto de valores do atributo Nome do aluno: 40 caracteres alfanumérico. -Conjunto de valores do atributo salário: inteiro maior que 5000 2. Introdução à Modelagem Representação Gráfica: - Entidade - Relacionamento - Atributo Relacionamento - Representa a associação entre os elementos do conjunto de um entidade com outra entidade. Exemplo: O João está matriculado na disciplina de Banco de Dados onde: - João - Elemento do conjunto de valores do atributo Nome do aluno da entidade Aluno; - Banco de Dados - Elemento do conjunto de valores do atributo Nome da disciplina da entidade Disciplina; 18 - matriculado - Ligação existente entre um aluno e uma disciplina. Cardinalidade de Relacionamentos Representa a frequência com que existe o relacionamento. Exemplo: Relacionamento 1:1 - O João é casado com a Maria. onde: - João - Elemento do conjunto de valores do atributo Nome da entidade Homem. - Maria - Elemento do conjunto de valores do atributo Nome da entidade Mulher. - casado - Ligação entre um homem e uma mulher, sendo que um homem pode ser casado com uma e apenas uma mulher, assim como uma mulher pode ser casada com um e apenas um homem. Relacionamento 1:N ou N:1 - O Pedro trabalha no Departamento Pessoal. onde: - Pedro - Elemento do conjunto de valores do atributo Nome da entidade Funcionário. - Depart. Pessoal - Elemento do conjunto de valores do atributo Nome do departamento da entidade Departamento. - trabalha - Ligação entre um Funcionário e um Departamento, onde um funcionário pode trabalhar em um e somente um departamento e um departamento pode ter vários funcionários. 19 Relacionamento N : M - O Antônio está matriculado na disciplina Banco de Dados. onde: - Antônio - Elemento do conjunto de valores do atributo Nome da entidade Aluno. - Banco de Dados - Elemento do conjunto de valores do atributo Nome da Disciplina da entidade Disciplina. - matriculado - Ligação existente entre um aluno e uma disciplina, onde um aluno pode estar matriculado em várias disciplinas e cada disciplina pode ter vários alunos matriculados. 3. Atributos Os atributos são propriedades utilizadas para descrever uma entidade, podemos afirmar que os Atributos são as características contidas nas Entidades, por exemplo, em uma Entidade Cliente, podemos relacionar os atributos CPF, NOME, IDADE, ENDEREÇO, BAIRRO, CIDADE etc. Vamos ao exemplo passo a passo: 20 3°) Outra maneira de demonstrar uma Entidade e Atributos é em forma de Planilha: Observando a figura abaixo, verificamos que a tabela PRODUTOS contém Atributos que são os nomes das colunas e um conceito novo chamado de TUPLA. Definindo de modo formal, uma linha é denominada de Tupla. 21 4. Tipos de Atributos Atributos Simples e Compostos: Podemos classificar um atributo como sendo simples ou composto. Atributo simples: seu valor é indivisível. Por exemplo, os atributos sexo e saldo da conta são simples. Atributo composto: seu valor pode ser decomposto em partes. Por exemplo, dependendo da aplicação que se deseja desenvolver, o endereço pode ser decomposto em tipo do logradouro, nome do logradouro, número, complemento, bairro, CEP, cidade, estado e país. Atributos Monovalorados e Multivalorados Os atributos também podem ser classificados como sendo monovalorados ou multivalorados. Atributo monovalorado: possui apenas um valor num dado instante. Por exemplo, o nome de uma pessoa é monovalorado, pois uma pessoa não pode ter dois nomes ao mesmo tempo. Atributo multivalorado: pode ter diversos valores ao mesmo tempo. Por exemplo, o apelido de uma pessoa é multivalorado, pois uma pessoa pode ter vários apelidos ao mesmo tempo. Observe que, dependendo da aplicação, o atributo telefone pode ser monovalorado ou multivalorado. Se for suficiente conhecer apenas um telefone da entidade, o atributo será monovalorado. Se precisarmos conhecer vários telefones da entidade (residencial, comercial, celular etc), o atributo será multivalorado. 22 Atributos Requeridos e Valores Nulos Um atributo é requerido se o seu valor não pode ser nulo, ou seja, não pode ser omitido. Por exemplo, o nome do aluno, em geral, é requerido, pois não faz sentido cadastrar um aluno sem nome. Quando um atributo não é requerido, seu valor para uma determinada entidade pode ser nulo. Isso pode ocorrer quando a informação está indisponível. Por exemplo, um aluno pode ter valor indisponível para o atributo CPF, se esse aluno ainda não tiver tirado seu CPF. Nesse caso, o valor do CPF desse aluno será nulo. Outra situação que pode levar ao surgimento de valores nulos ocorre quando o a informação não se aplica àquela entidade. Por exemplo, atributo número do certificado de reservista não se aplica às alunas. Nesse caso, pode ser adequado reformular o modelo de dados. Como veremos mais adiante, a introdução de valores nulos no banco de dados pode trazer consequências indesejáveis e por isso deve ser evitada. Atributos Derivados Um atributo é derivado se o seu valor pode ser obtido a partir de outros dados contidos no BD. Por exemplo, se já tivermos o atributo data de nascimento, o atributo idade é derivado, pois seu valor pode ser obtido a partir da data de nascimento. Nesse caso, não vale a pena ter o atributo idade. Vejamos outro exemplo. Num banco é preciso armazenar dados de todas as operações (saques, depósitos, transferências etc.) que ocorrem nas contas dos clientes. Com essas informações é possível calcular o saldo da conta de qualquer cliente somando o valor das operações de crédito e subtraindo o valor das operações de débito naquela conta. No entanto, esse cálculo pode ser bem demorado.Por esse motivo, para melhorar o desempenho do BD, vale a pena incluir o atributo derivado saldo da conta. 23 5. Domínio As restrições de domínio especificam que o valor de cada atributo deve ser um valor atômico que, para cada atributo criado, devemos associar um tipo a ele. A essa associação, damos o nome de domínio. A seguir, demonstraremos alguns tipos: ■ Numéricos: inteiros e reais. ■ Caracteres. ■ Booleanos. ■ Cadeias de caracteres de tamanho fixo e tamanho variável. ■ Data. ■ Hora. A seguir, iremos criar uma tabela chamada Funcionário, contendo NOME DO CAMPO, TIPOS e TAMANHO para exemplificar a aplicação dos tipos. Propriedades dos campos da tabela Funcionário: NOME DO CAMPOS TIPO DO CAMPO TAMANHO Matrícula Inteiro 3 Nome Caractere 40 Idade Inteiro 3 Data Admissão Data 8 6. Chave Estrangeira (Foreign Key) No modelo relacional a única forma de relacionar dados que existem em uma tabela com dados que existem em outra tabela é através de atributos comuns. Assim, vão existir atributos especiais (chaves estrangeiras) que servem para fazer a ligação com outras tabelas, onde esses mesmos atributos são usados para identificar, unicamente, cada uma das linhas (chaves primárias). Os tipos de chaves podem sem: 24 Chave Primária: chave que identifica cada tupla(linha) Chave Estrangeira: atributo ou conjunto de atributos de uma relação, que é chave primária em outra relação Uma chave primária (atributo identificador) é uma coluna ou um grupo de colunas que assegura a unicidade das linhas dentro de uma tabela. Uma chave primária que tenha mais de uma coluna é chamada de chave primária composta. Chaves primárias são geralmente indicadas pela sigla PK (primary key) Exemplos de Chaves Primárias: Produto (codigo_produto (PK), Descrição, ...) Veiculo (chassi (PK), Cor, Tipo, ...) Usuario (login (PK), Senha, ...) Conta_Bancaria(agencia (PK),conta_corrente (PK), Titular) Para criação de chaves primárias, algumas regras são definidas, conforme a seguir: Valores de chave primária não podem ser nulos (not null): Valores de chaves primarias não podem ser nulos porque uma linha sem chave primaria não se distingue de outras linhas da mesma tabela; Colunas com chaves primarias não podem ter valores duplicados Um valor duplicado é um valor exatamente igual a outro de uma ou mais linhas da mesma coluna na mesma tabela; Se a coluna possui valores duplicados esta não pode servir de identificador da linha; Recomendações: 1. Selecione chaves primarias absolutamente disciplinada e que permaneçam únicas; 2. Selecione chaves primarias que não tenham qualquer tendência a alterações; 25 3. Se possível seleciona chaves primarias simples; 4. De preferência a colunas numéricas para chaves primarias; 5. Selecione chaves primarias que sejam familiares; 6. Se não houver nenhuma coluna com chave primaria candidata, utilize chaves primarias atribuídas pelo sistema (autonumeração). Uma chave estrangeira é uma coluna ou grupo de colunas que pode ou não ser chave primária da tabela em questão, mas, com certeza é chave primária de outra tabela. Uma chave estrangeira formada por mais de uma coluna é chamada de chave estrangeira composta. Chaves estrangeiras são indicadas pela sigla FK (Foreign Key) Exemplos de Chave Estrangeira: Dependentes (codigo_dependente, codigo_socio(FK)) Pedido (nota_fiscal, codigo_cliente(FK)) Como estudamos, toda entidade (tabela) deverá possuir um atributo único e não nulo que identifique um registro. Esse atributo é chamado de chave primária ou primary key. A constraint primary key é equivalente às cláusulas NOT NULL + UNIQUE juntas. Em uma tabela deve-se existir apenas uma constraint primary key, enquanto podem existir variadas ocorrências da cláusula UNIQUE. Veja os exemplos abaixo para a criação de Primary Key: 26 A constraint REFERENCES permite fazer a validação das chaves estrangeiras. Isto é, não se podem inserir nos campos referenciados como chaves estrangeira valores que não existam na tabela onde os campos são chave primária. Veja exemplo na qual o campo codigo_postal é uma chave estrangeira da tabela POSTAL, para isso foi usado o comando REFERENCES, onde o campo codigo_postal da tabela PESSOA refere-se ao campo codigo da tabela POSTAL: 27 LEITURA COMPLEMENTAR A REVOLUÇÃO DO BIG DATA ESTÁ PRESTES A ACONTECER Cezar Taurion O termo Big Data começa a despertar muita atenção, mas ainda é um conceito mal de- finido e compreendido. Com uma rápida pesquisa no Google, identifiquei, pelo menos, uma dúzia de definições. Neste artigo, vou falar um pouco sobre o assunto e debater alguns desafios que temos para conseguir colocar projetos de Big Data em ação. Sem entrar em definições e nos atendo apenas a conceitos, podemos resumir com uma fórmula simples o que é Big Data: volume + variedade + velocidade de dados. Volume porque, além dos dados gerados pelos sistemas transacionais, temos a imensidão de da- dos gerados pelos objetos na Internet das Coisas, como sensores e câmeras, e os gerados nas mídias sociais, via PCs, smartphones e tablets. Variedade porque estamos tratando tanto de dados textuais estruturados quanto dos não estruturados, como fotos, vídeos, emails e tuítes. E, por fim, velocidade porque, muitas vezes, precisamos responder aos eventos quase que em tempo real. Ou seja, estamos falando de criação e tratamento de dados em volumes massivos. Outro desafio: criar e tratar apenas de dados históricos, como o veterano Data Warehou- se e as tecnologias de BI (Business Intelligence) começam a se mostrar lentos demais para a velocidade com que os negócios precisam tomar decisões. Aliás, o termo BI já tem mais de 50 anos. Ele foi cunhado por Hans Peter Luhn, pesquisador da IBM em um artigo escrito nos idos de 1958. Quando falamos em volume, os números são gigantescos. Se olharmos globalmente, estamos falando em zetabytes ou 10²¹ bytes. Grandes corporações armazenam múlti- plos petabytes e mesmo as pequenas e médias empresas trabalham com dezenas de terabytes de dados. Esse volume tende a crescer geometricamente. Em um mundo cada vez mais competitivo e rápido, as empresas precisam tomar decisões baseadas não ape- nas em palpites, mas em dados concretos. Assim, para um setor de marketing, faz todo sentido ter uma visão 360° de um cliente, olhando não apenas o que ele comprou da empresa, como registrado no ERP, mas saber o que ele pensa e diz sobre a empresa e como os faz - pelo Facebook e Twitter, por exemplo. Hoje, já é consenso que dados são os recursos naturais da nova Revolução Industrial. Na atual sociedade industrial, ter apenas recursos naturais, como minério, e exportá-los de forma bruta - 28 importando em troca produtos manufaturados - não garante a competiti- vidade de um país no longo prazo. O importante é a tecnologia e o conhecimento que cria produtos manufaturados. Afinal, um quilo de satélite vale imensamente mais do que um quilo de minério de ferro. Fazendo um paralelo, na sociedade da informação, é crucial saber tratar dos dados na velocidade adequada. Dados não tratados e analisados em tempo hábil são dados como tal, podem - e deverão - ser quantificados economicamente. Big Data representa um desafio tecnológico, pois demanda atenção à infraestrutura e tecnologias analíticas. O processamento de volumes massivos de dados pode ser facili- tado pelo modelo de computação em nuvem, desde, é claro, que esse imenso volume não seja transmitido repetidamente via Internet. Só para lembrar, os modelos de co- brança pelo uso de nuvens públicas tendem a gerar processamentos muito baratos, mas tornam caro a transmissão de muitos dados. A principal base tecnológica para Big Data Analyticsé o Hadoop e os bancos de dados NoSQL, onde“No” significa Not Only SQL, ou seja, usa-se bases de dados SQL e não SQL. A importância do “Not Only” SQL explica-se pelo fato do modelo relacional ser base- ado na época de sua criação, no início dos anos 70. Nessa época, acessar, categorizar e normalizar dados era bem mais fácil do que hoje. Praticamente não existiam dados não estruturados circulando pelos computadores da época. Também não foi desenhado para escala massiva ou para um processamento muito rápido. Seu objetivo básico era possibilitar a criação de queries que acessassem bases de dados corporativas e, portan- to, estruturadas. Para soluções Big Data, tornam-se necessárias várias tecnologias, desde bancos de dados SQL a softwares que utilizem outros modelos, que lidem melhor com documentos, grafos, processamento paralelo etc. A complexidade do Big Data vem à tona quando lembramos que não estamos falan- do apenas de armazenamento e tratamento analítico de volumes massivos de dados, mas de revisão, ou criação, de processos que garantam a qualidade desses dados e de processos de negócios que usufruam dos resultados obtidos. Portanto, Big Data não é apenas um debate sobre tecnologias, mas, principalmente, sobre como os negócios poderão usufruir da montanha de dados que está agora à sua disposição. Aí emerge a questão da integração: como integrar bases de dados estruturadas e não estruturadas com diversos softwares envolvidos? O Big Data abre oportunidades profissionais bem amplas. Na minha 29 opinião, existe es- paço para dois perfis profissionais: um mais voltado para os negócios e qualificados para tratar analiticamente as informações geradas por essas imensas bases de dados e outro com viés mais técnico ou Data Architect. Pelo viés dos negócios, um artigo interessante que foi publicado há poucos meses pelo Wall Street Journal, na edição brasileira, aponta como problema a escassez de talentos. Ele fala que muitas empresas americanas começaram a procurar profissionais que sai- bam interpretar os números usando a análise de dados, também conhecida como inte- ligência empresarial. Mas encontrar profissionais qualificados tem se mostrado difícil. O resultado foi que várias faculdades americanas, como a Faculdade de Pós-Graduação em Administração da Universidade Fordham e a Faculdade de Administração Kelley, da Universidade de Indiana, começaram a oferecer disciplinas eletivas, cursos de extensão e mestrados em análise de dados. Já o Data Architect deve lidar com tecnologias SQL e NoSQL, conhecer profundamente conceitos como stream processing e Event Driven Architecture (EDA) e, portanto, ter capacidade de desenhar estratégias para manusear e analisar grandes volumes de dados de formatos diferentes, quase que em tempo real. A ideia de stream processing, ou stream computing, é fantástica; é um novo paradigma. No modelo de data mining tradicional, uma empresa filtra dados dos seus vários siste- mas e, após criar um data warehouse, dispara “queries”. Na prática, faz-se uma garim- pagem em cima de dados estáticos, que não refletem o momento, mas sim o contexto de horas, dias ou mesmo semanas atrás. Com o stream computing, essa garimpagem é efetuada em tempo real. Em vez de disparar queries em cima de uma base de dados estática, coloca-se uma corrente contínua de dados (streaming data) atravessando um conjunto de queries. Podemos pensar em inúmeras aplicações, sejam estas em finanças, saúde e mesmo manufatura. Vamos ver este último exemplo: um projeto em desenvolvimento com uma empresa de fabricação de semicondutores monitora em tempo real o processo de deteção e classi- ficação de falhas. Com o stream computing, as falhas nos chips que estão sendo fabri- cados são detetadas em minutos e não em horas ou semanas. Os wafers defeituosos podem ser reprocessados e, mais importante ainda, pode- se fazer ajustes em tempo real nos próprios processos de fabricação. Quanto ao EDA, pode-se começar a estudar o assunto acessando seu verbete na Wiki- pedia. O termo Big Data vai aparecer na tela do radar dos CIOs em breve. Aliás, já aparece no canto da tela de um ou outro CIO, e, 30 provavelmente, em alguns anos, já será um dos temas mais prioritários das tradicionais listas de “tecnologias do ano”. Portanto, é bom estar atento à sua evolução e começar a colocar em prática algumas provas de conceito. Fonte: Taurion (2012, online). O maior evento da comunidade brasileira de NoSQL: <http://nosqlbr.com/>. http://nosqlbr.com/ 31 UNIDADE III - SQL BÁSICO 32 1. SQL A primeira versão da linguagem SQL, chamada SEQUEL (Structured Query English Language), surgiu em 1974 nos laboratórios da IBM (Califórnia). Entre 1976 e 1977 ela foi revisada e ampliada, tendo então o seu nome alterado para SQL. Devido ao sucesso da nova forma de consulta e manipulação de dados dentro de um ambiente de banco de dados, sua utilização tornou-se cada vez maior. Vários SGBD’s atuais utilizam o SQL como a linguagem padrão para o acesso às bases de dados. Entre eles podemos citar: DB2 da IBM ORACLE da Oracle Corporation; RDB da Digital SYBASE da Sybase INC SQL Server da Microsoft Ingres da Computer Associates Em 1982 o American National Standard Institute (ANSI) tornou a SQL a linguagem padrão para a manipulação de dados em ambiente relacional. A linguagem SQL pode ter vários enfoques: Definições de Dados e Tipos em SQL: Linguagem interativa de consulta (query AdHoc) Através de comandos SQL os usuários podem montar consultas poderosas, sem a necessidade da criação de um programa, podendo utilizar ferramentas front-end para a montagem de relatórios. 33 Linguagem de programação para acesso às bases de dados Comandos SQL embutidos em programas de aplicação (escritos em C, C++, Java, Visual Basic e etc) acessam os dados armazenados em uma base de dados relacional. Linguagem de administração de banco de dados O responsável pela administração do banco de dados (DBA) pode utilizar comandos SQL para realizar tarefas relacionadas com a manutenção dos schemas do banco de dados. Linguagem de consulta em ambiente cliente/servidor Os programas sendo processados nos computadores dos clientes (front ends) usam comandos SQL para se comunicarem, através de uma rede, com um SGBD sendo processado em uma máquina servidora (back end); Linguagem para bancos de dados distribuídos A linguagem SQL é também a linguagem padrão para a manipulação de dados em uma base de dados distribuída. 34 Linguagem de definição de dados (DDL) Permite ao usuário a definição da estrutura e organização dos dados armazenados, e das relações existentes entre eles. Linguagem de manipulação de dados (DML) Permite a um usuário, ou a um programa de aplicação, a execução de operações de inclusão, remoção, seleção ou atualização de dados previamente armazenados na base de dados. Controle de acesso Protege os dados de manipulações não autorizadas. Integridade dos dados Auxilia no processo de definição da integridade dos dados, protegendo contra corrupções e inconsistências geradas por falhas do sistema de computação, ou por erros nos programas de aplicação. 35 2. Restrições Podemos apontar as seguintes vantagens no uso da linguagem SQL: Independência de fabricante A linguagem SQL é adotada por praticamente todos os SGBD’s relacionais existentes no mercado, além de ser uma linguagem padronizada (ANSI). Com isso, pelo menos em tese, posso mudar de SGBD sem me preocupar em alterar os programas de aplicação. Portabilidade entre plataformas de hardware e software Pode ser utilizada tanto em máquinas Intel rodando Windows, passandopor workstations RISC rodando UNIX, até mainframes rodando sistemas operacionais proprietários. Redução dos custos com treinamento Com base no item anterior, as aplicações podem se movimentar de um ambiente para o outro sem que seja necessária uma reciclagem da equipe de desenvolvimento. Usa inglês estruturado de alto nível O SQL é formado por um conjunto bem simples de sentenças em inglês, oferecendo um rápido e fácil entendimento. Permite consultas interativas Permite aos usuários acesso fácil e rápido aos dados a partir de um front end que permita a edição e a submissão de comandos SQL. 36 Múltiplas visões dos dados Permite ao criador do banco de dados levar diferentes visões dos dados aos diferentes usuários. Definição dinâmica dos dados Através da linguagem SQL pode-se alterar, expandir ou incluir, dinamicamente, as estruturas dos dados armazenados, com máxima flexibilidade. Porém, existem também algumas desvantagens no uso da linguagem SQL: Críticas (segundo C.J. Date) Falta de ortogonalidade nas expressões, funções embutidas, variáveis indicadoras, referência a dados correntes, constante NULL, conjuntos vazios, e etc; Definição formal da linguagem após sua criação; Discordância com as linguagens hospedeiras (geralmente procedurais e orientadas para registros e não para conjuntos); Falta de algumas funções; Não dá suporte a alguns aspectos do modelo relacional (join explícito, domínios, e etc.) 37 3. Consultas Básicas em SQL As tabelas a seguir serão usadas nos exemplos que se seguem: CLIENTE (cod_cli, nome_cli, endereco, cidade, cep, uf) VENDEDOR (cod_vend, nome_vend, sal_fixo, faixa_comiss) PEDIDO ( num_ped, prazo_entr, cd_cli, cd_vend) ITEM_PEDIDO (no_ped, cd_prod, qtd_ped) PRODUTO (cod_prod, unid_prod, desc_prod, val_unit) 38 4. Comandos de Modificação de Dados em SQL O comando CREATE TABLE é usado para criar uma tabela. A sua forma geral é: CREATE TABLE <nome_tabela> (<descrição das colunas>, <descrição das chaves>); onde: <nome_tabela> dever ser substituído pelo nome da tabela a ser criada. <descrição das colunas> deve ser substituída pela relação das colunas da tabela e seus respectivos tipos de dados (por exemplo, smallint, char, varchar, integer, number, float e etc). <descrição das chaves> deve ser substituída pela lista das colunas que são tratadas como chaves estrangeiras. Algumas colunas podem receber o valor NULL (nulo), e a coluna definida como chave primária, além de não poder receber NULL, deve ser uma coluna UNIQUE (sem repetições; isto é, chave primária) Script de Criação das Tabelas dos Exemplos create table cliente ( cod_cli smallint not null, nome_cli varchar(40) not null, endereco varchar(40) null, cidade varchar(20) null, cep char(08) null, uf char(02) null, primary key (cod_cli)); create table vendedor ( cod_vend smallint not null, nome_vend varchar(40) not null, sal_fixo number(9,2) not null, 39 faixa_comiss char(01) not null, primary key (cod_vend)); create table produto ( cod_prod smallint not null, unid_prod char(03) not null, desc_prod varchar(20) not null, val_unit number(9,2) not null, primary key (cod_prod)); create table pedido ( num_ped smallint not null, prazo_entr smallint not null, cd_cli smallint not null REFERENCES CLIENTE (cod_cli), cd_vend smallint not null REFERENCES VENDEDOR (cod_vend), primary key (num_ped)); create table item_pedido ( no_ped smallint not null REFERENCES PEDIDO (num_ped), cd_prod smallint not null REFERENCES PRODUTO (cod_prod), qtd_ped float not null); Para excluirmos uma tabela existente devemos usar o comando DROP TABLE. A sua forma geral é: DROP TABLE <nome_tabela>; onde: <nome_tabela> dever ser substituído pelo nome da tabela a ser excluída. Exemplos drop table item_pedido; drop table pedido; drop table vendedor; drop table produto; drop table cliente; 40 LEITURA COMPLEMENTAR BANCOS DE DADOS LIVRES CRESCEM NO BRASIL Uma nova geração de bancos de dados livres começa a ganhar adesão de várias empre- sas do setor financeiro e industrial do país, revela estudo. Uma nova geração de bancos de dados livres começa a ganhar adesão de várias empre- sas do setor financeiro e industrial do país, para aplicações específicas ou embarcadas em equipamentos de comunicação, e já está criando um impacto positivo entre os de- senvolvedores. Essa é uma conclusão do consultor independente Fernando Lozano, community mana- ger da Java.net, apresentada na quarta- feira (17/08) no Developer’s World 2005, realiza- do pelo IDG Brasil, no Hotel Jaraguá, em São Paulo. Lozano vem trabalhando na implementação de projetos de banco de dados livres em várias empresas, como o Instituto Brasileiro de Petróleo e Gás, Elephant Internet, iBest e Amsterdam Sauer. “O banco de dados livre é hoje uma alternativa viável e de alta per- formance, além de comercialmente atraente, pois pode utilizar qualquer ferramenta de desenvolvimento para acesso aos dados”, diz ele. Para Thiago José Macieira, desenvolvedor central do KDE, uma das principais comunidades de open source do mundo, com quase 20 colaboradores brasileiros, o interesse pelo software livre no Brasil é cada vez maior, principalmente depois que o governo federal decidiu estimular a adoção do produto em licitações públicas. “Muitos desenvolvedores estão decididos a contribuir para o avanço do open source, mesmo sem ter qualquer espécie de retorno financeiro, no máximo um outro patrocínio para participar em congressos internacionais”, afirma Macieira. Fonte: Cesar (2005, online). 41 UNIDADE IV - MAIS SQL 42 1. Consultas Envolvendo NULL 1.1 Selecionando Colunas Específicas de uma Tabela SELECT <lista_de_colunas> FROM <nome_tabela>; Problema: Listar todos os produtos com as respectivas descrições, unidades e valores unitários. select desc_prod,unid_prod,val_unit from produto; DESC_PROD UNI VAL_UNIT -------------------- --- ---------- Chapa de Aco kg 2,5 Cimento kg 4,5 parafuso 3.0X10.5 mm kg 2 Fio plastico m ,2 Solvente PRW l 5 5 linhas selecionadas. Problema: Listar os nomes dos clientes, as cidade e os estados onde eles estão localizados. select nome_cli,cidade,uf from cliente; NOME_CLI CIDADE UF ---------------------------------------- -------------------- -- Supermercado Carrefour rio de janeiro rj Supermercado Baratao rio de janeiro rj Supermercado Arariboia niteroi rj UFF niteroi rj CSN volta redonda rj Pegeout resende rj Ind. Quimicas Paulistas sao paulo sp Ford Caminhoes sao paulo sp Riocel Celulose guaiba rs Elevadores Sur guaiba rs 43 1.2 Selecionando todas as Colunas de uma Tabela SELECT * FROM <nome_tabela>; Problema: Listar o conteúdo de todas as tabelas da base de dados dos exemplos. select * from cliente; COD_CLI NOME_CLI ENDERECO CIDADE CEP UF ---------- ---------------------------------------- -------------------- - ------------------- -------------------- -------- -- 1000 Supermercado Carrefour Av. das Americas rio de janeiro 20000001 rj 2000 Supermercado Baratao Rua Rolando Lero rio de janeiro 20000002 rj 3000 Supermercado Arariboia Rua Itaoca niteroi 20000003 rj 4000 UFF Cidade Univers. niteroi 20000004 rj 5000 CSN Rua do Aco volta redonda 20000005 rj 6000 Pegeout Rodovia Pres. Dutra resende 20000006 rj 7000 Ind. Quimicas Paulistas Rua Tuiuti sao paulo 11000001 sp 8000 Ford Caminhoes Rua Henry Ford sao paulo 11000002 sp 9000 Riocel Celulose Rua Gen. Arouca guaiba 30000001 rs 10000 Elevadores Sur RuaPlanejada guaiba 30000001 rs select * from produto; COD_PROD UNI DESC_PROD VAL_UNIT ---------- --- -------------------- ---------- 100 kg Chapa de Aco 2,5 200 kg Cimento 4,5 300 kg parafuso 3.0X10.5 mm 2 400 m Fio plastico ,2 500 l Solvente PRW 5 44 select * from vendedor; COD_VEND NOME_VEND SAL_FIXO F ---------- ---------------------------------------- ---------- - 11 Paulo Alberto 1500 b 12 Ana Cristina 2100 a 13 Cassia Andrade 900 c 14 Armando Pinto 2500 a 15 Maria Paula 900 c select * from pedido; NUM_PED PRAZO_ENTR CD_CLI CD_VEND ---------- ---------- ---------- ---------- 1111 10 1000 11 1112 5 1000 11 1113 30 1000 15 2111 15 3000 14 2112 18 3000 15 2113 3 3000 12 3111 13 4000 12 3112 7 4000 11 4111 7 6000 11 4112 7 6000 14 5111 10 8000 14 6111 30 9000 14 6112 60 9000 12 7111 20 10000 15 select * from item_pedido; NO_PED CD_PROD QTD_PED ---------- ---------- ---------- 1111 100 100 1111 200 100 1111 300 200 1112 400 100 1112 500 1000 1113 100 300 2111 100 500 2111 500 400 2112 200 100 2112 300 200 2113 500 500 3111 400 300 3112 100 400 3112 200 600 4111 300 700 4112 500 1000 4112 500 500 5111 200 100 5111 300 500 6111 400 100 6112 300 400 6112 400 200 7111 100 500 45 1.3 Selecionando Apenas Alguns Registros da Tabela SELECT <lista_de_colunas> FROM <nome_tabela> WHERE <condição_de_seleção>; Onde a cláusula WHERE tem a seguinte forma: WHERE <nome_da_coluna> <operador> <valor> 1.3.1 Operadores Relacionais: = igual <> ou != diferente < menor que > maior que >= maior ou igual a <= menor ou igual a Quando a coluna é do tipo caracter, o <valor> deve estar entre aspas simples ('). Exemplo: 'parafuso' Observação: Na linguagem SQL existe diferença entre caracteres maiúsculos e minúsculos; logo, 'PARAFUSO' é diferente de 'parafuso'. Problema: Listar o número do pedido, o código do produto e a quantidade pedida dos itens de um pedido, onde a quantidade pedida seja igual a 500. select no_ped,cd_prod,qtd_ped from item_pedido where qtd_ped = 500; 46 NO_PED CD_PROD QTD_PED ---------- ---------- ---------- 2111 100 500 2113 500 500 4112 500 500 5111 300 500 7111 100 500 5 linhas selecionadas. Problema: Quais são os clientes localizados na cidade de Niterói? select nome_cli from cliente where cidade = 'niteroi'; NOME_CLI ---------------------------------------- Supermercado Arariboia UFF 2 linhas selecionadas. 1.3.2 Operadores Lógicos AND conjunção OR disjunção NOT negação Problema: Quais são os produtos que têm unidade igual a 'kg' e valor unitário maior do que R$ 2,00? select desc_prod from produto where unid_prod = 'kg' and val_unit > 2.00; DESC_PROD -------------------- Chapa de Aco Cimento 2 linhas selecionadas. 47 Problema: Liste todos os clientes localizados na cidade de São Paulo ou que tenham CEP entre 20000005 e 20000010. select nome_cli,cidade,cep from cliente where cidade = 'sao paulo' or (cep>='20000005' and cep<='20000010'); NOME_CLI CIDADE CEP ---------------------------------------- -------------------- -------- CSN volta redonda 20000005 Pegeout resende 20000006 Ind. Quimicas Paulistas sao paulo 11000001 Ford Caminhoes sao paulo 11000002 4 linhas selecionadas. Observação: A prioridade do operador AND é maior do que a prioridade do operador OR; logo, neste exemplo, a utilização dos parênteses é opcional. Problema: Mostrar todos os pedidos que não tenham prazo de entrega superior a 15 dias. select num_ped from pedido where not (prazo_entr > 15); NUM_PED ---------- 1111 1112 2111 2113 3111 3112 4111 4112 5111 9 linhas selecionadas. 48 1.3.3 Operadores BETWEEN e NOT BETWEEN WHERE <nome_coluna> BETWEEN <valor1> AND <valor2> WHERE <nome_coluna> NOT BETWEEN <valor1> AND <valor2> Este operador possibilita a seleção de uma faixa de valores sem a necessidade do uso dos operadores >=, <= e AND. <valor1> e <valor2> têm que ter o mesmo tipo de dado que <nome_coluna>. Problema: Liste o código e a descrição dos produtos que tenham o valor unitário na faixa de R$ 0,10 a R$ 3,00. select cod_prod,desc_prod from produto where val_unit between 0.10 and 3.00; COD_PROD DESC_PROD ---------- -------------------- 100 Chapa de Aco 300 parafuso 3.0X10.5 mm 400 Fio plastico 3 linhas selecionadas. 1.3.4 Operadores LIKE e NOT LIKE WHERE <nome_coluna> LIKE <valor> WHERE <nome_coluna> NOT LIKE <valor> Aplicáveis apenas a colunas dos tipos CHAR e VARCHAR. Funcionam de modo análogo aos operadores = e <>, porém o poder dos operadores LIKE e NOT LIKE está na utilização dos símbolos % e _, que podem fazer o papel de “coringa”: 49 % substitui uma palavra _ substitui um caracter qualquer Exemplos: 'apis%' se aplicaria às seguintes cadeias de caracteres: 'lapis preto' 'lapis cera' 'lapis borracha' 'broca n_' se aplicaria às seguintes cadeias de caractere: 'broca n1' 'broca n9' 'broca n3' Problema: Listar todos os produtos que tenham a sua unidade começando por k (lembre- se de que a coluna unid_prod foi definida como char(03)). select cod_prod,desc_prod from produto where unid_prod like 'k '; COD_PROD DESC_PROD ---------- -------------------- 100 Chapa de Aco 200 Cimento 300 parafuso 3.0X10.5 mm 3 linhas selecionadas. Problema: Listar todos os vendedores cujos os nome não comecem por 'A'. 50 select cod_vend,nome_vend from vendedor where nome_vend not like 'A%'; COD_VEND NOME_VEND ---------- ---------------------------------------- 11 Paulo Alberto 13 Cassia Andrade 15 Maria Paula 3 linhas selecionadas. 1.3.5 Operadores IN e NOT IN WHERE <nome_coluna> IN <lista_de_valores> WHERE <nome_coluna> NOT IN (<lista_de_valores>) Seleciona as linhas cujo o valor da coluna <nome_coluna> pertença ao conjunto <lista_de_valores>. Problema: Listar todos os vendedores cujas as faixas de comissão sejam 'a' ou 'b'. select cod_vend,nome_vend from vendedor where faixa_comiss in ('a','b'); COD_VEND NOME_VEND ---------- ---------------------------------------- 11 Paulo Alberto 12 Ana Cristina 14 Armando Pinto 3 linhas selecionadas. 1.3.6 Operadores IS NULL e IS NOT NULL WHERE <nome_coluna> IS NULL WHERE <nome_coluna> IS NOT NULL 51 A utilização do valor nulo (NULL) é problemática, pois as diversas implementações da linguagem SQL podem adotar qualquer representação para o valor nulo. Problema: Mostrar os clientes que não tenham endereço cadastrado. select nome_cli from cliente where endereco is null; NOME_CLI ---------------------------------------- 0 linhas selecionadas. 1.4 Ordenando os Dados Selecionandos SELECT <lista_de_colunas> FROM <nome_tabela> WHERE <condição_de_seleção> ORDER BY {<nome_coluna>|<num_col> [ASC|DESC]} Onde <nome_coluna> se refere à coluna segundo a qual as linhas serão ordenadas, e <num_col> se refere à posição relativa da coluna na <lista_de_colunas> projetadas, contada da esquerda para a direita, e não à posição na tabela original. As cláusulas ASC e DESC denotam ordenação ascendente e descendente respectivamente. A forma ascendente de ordenação é assumida caso nenhuma opção seja informada explicitamente. Problema: Mostrar em ordem alfabética a lista de vendedores e seus respectivos salários fixos. select nome_vend,sal_fixo from vendedor order by nome_vend; 52 NOME_VEND SAL_FIXO ---------------------------------------- ---------- Ana Cristina 2100Armando Pinto 2500 Cassia Andrade 900 Maria Paula 900 Paulo Alberto 1500 5 linhas selecionadas. Problema: Listar os nomes, as cidades e os estados de todos os clientes, ordenados por estado e cidade de forma descendente. select nome_cli,cidade,uf from cliente order by uf desc,cidade desc; NOME_CLI CIDADE UF ---------------------------------------- -------------------- -- Ind. Quimicas Paulistas sao paulo sp Ford Caminhoes sao paulo sp Riocel Celulose guaiba rs Elevadores Sur guaiba rs CSN volta redonda rj Supermercado Carrefour rio de janeiro rj Supermercado Baratao rio de janeiro rj Pegeout resende rj Supermercado Arariboia niteroi rj UFF niteroi rj 10 linhas selecionadas. Problema: Mostrar a descrição e o valor unitário de todos os produtos que tenham unidade 'kg' em ordem ascendente de valor unitário. select desc_prod,val_unit from produto where unid_prod = 'kg' order by 2; DESC_PROD VAL_UNIT -------------------- ---------- parafuso 3.0X10.5 mm 2 Chapa de Aco 2,5 Cimento 4,5 3 linhas selecionadas. 53 2. Consultas Aninhadas (Subqueries) Podemos criar dinamicamente um campo que não pertença à tabela original através de operações executadas sobre os campos projetados. Problema: Exibir o novo salário fixo dos vendedores da faixa de comissão ‘C’, calculado com base no reajuste de 75% sobre o salário atual acrescido de R$ 120,00 de bonificação. Ordene a relação resultante pelo nome do vendedor. select nome_vend,((sal_fixo*1.75)+120) as from vendedor where faixa_comiss='c' order by nome_vend; NOME_VEND NOVO_SAL ---------------------------------------- ---------- Cassia Andrade 1695 Maria Paula 1695 2 linhas selecionadas. 2.5.1 Máximos (MAX) e Mínimos (MIN) Problema: Mostrar o menor e o maior salário entre os vendedores. select MIN(sal_fixo),MAX (sal_fixo) from vendedor; MIN(SAL_FI MAX(SAL_FI ---------- ---------- 900 2500 1 linha selecionada. 2.5.2 Totalizando Colunas (SUM) Problema: Mostrar a quantidade total pedida para o produto cimento, de código 200. 54 select SUM(qtd_ped) from item_pedido where cd_prod=200; SUM(QTD_PE ---------- 900 1 linha selecionada. 2.5.3 Calculando Médias (AVG) Problema: Qual é a média dos salários fixos dos vendedores? select AVG(sal_fixo) from vendedor; AVG(SAL_FI ---------- 1580 1 linha selecionada. 2.5.4 Contando as Linhas (COUNT) Problema: Quantos vendedores ganham acima de R$ 2.000,00 de salário fixo? select COUNT(*) from vendedor where sal_fixo>2000; COUNT(*) ---------- 2 1 linha selecionada. 2.5.5 A Palavra-Chave DISTINCT Várias linhas de uma tabela podem conter os mesmos valores para as suas colunas (duplicidade), com exceção da chave primária. Quando desejarmos eliminar a duplicidade, podemos inserir a palavra-chave DISTINCT após a palavra-chave SELECT. 55 Problema: Em que cidades as nossa empresa possui clientes? select DISTINCT cidade from cliente; CIDADE -------------------- guai ba nite roi rese nde rio de janeiro sao paulo volta redonda 6 linhas selecionadas. i. Agrupando a Informação Selecionada (GROUP BY) Existem ocasiões em que desejamos aplicar uma função de agregação não somente a um conjunto de tuplas, mas também organizar a informação em determinadas categorias. Isto é possível através do uso da cláusula GROUP BY. Problema: Listar o número de itens existente em cada pedido. select no_ped, count(*) as total_itens from item_pedido group by no_ped; NO_PED TOTAL_ITEN ---------- ------- --- 1111 3 1112 2 1113 1 2111 2 2112 2 2113 1 3111 1 3112 2 4111 1 4112 2 5111 2 56 6111 1 6112 2 7111 1 14 linhas selecionadas. Inicialmente as linha são agrupadas através do(s) atributo(s) fornecido(s) na cláusula GROUP BY; neste caso, no_ped. Em um segundo passo, é aplicada a operação COUNT(*) para cada grupo de linhas que tenha o mesmo número de pedido. Após a operação de contagem de cada grupo, o resultado da consulta é apresentado. Normalmente, a cláusula GROUP BY é utilizada em conjunto com as operações COUNT e AVG. ii. A Cláusula HAVING Às vezes temos que definir condições e aplicá-las aos grupos ao invés de fazê- lo a cada linha separadamente. Por exemplo, suponha que desejemos listar todos os pedidos que possuam mais de um item. Esta condição não se aplica a uma única linha separadamente, mas a cada grupo definido pela cláusula GROUP BY. Para exprimir tal consulta, usamos a cláusula HAVING. A condição da cláusula HAVING é aplicada após a formação dos grupos; logo, podemos usar funções de agregação na construção das condições da cláusula HAVING. Problema: Listar os pedidios que possuam mais de um item. select no_ped,count(*) as total_itens from item_pedido group by no_ped having count(*)>1; NO_PED TOTAL_ITEN ---------- ------- --- 1111 3 1112 2 2111 2 2112 2 3112 2 4112 2 5111 2 6112 2 8 linhas selecionadas. 57 3. Consultas Utilizando Joins Algumas consultas necessitam acessar simultaneamente várias tabelas, o que leva à realização de junções (JOINS) entre as tabelas para poder extrair as informações necessárias para a consulta formulada. 3.6.1 Qualificadores de Nomes Um qualificador de nome consiste do nome da tabela, seguido de um ponto, seguido por um nome de uma coluna da tabela. Por exemplo, o qualificador da coluna DESC_PROD da tabela PRODUTO será PRODUTO.DESC_PROD. Os qualificadores de nome são utilizados em uma consulta para efetivar a junção (JOIN) entre as tabelas. Problema: Faça uma junção da tabela de clientes com a de pedidos, exibindo o nome do cliente, o código do cliente e o número do pedido. select cod_cli,nome_cli,pedido.num_ped from cliente,pedido; COD_CLI NOME_CLI NUM_PED ---------- ---------------------------------------- ---------- 1000 Supermercado Carrefour 1111 2000 Supermercado Baratao 1111 3000 Supermercado Arariboia 1111 4000 UFF 1111 5000 CSN 1111 6000 Pegeout 1111 7000 Ind. Quimicas Paulistas 1111 8000 Ford Caminhoes 1111 9000 Riocel Celulose 1111 10000 Elevadores Sur 1111 1000 Supermercado Carrefour 1112 2000 Supermercado Baratao 1112 3000 Supermercado Arariboia 1112 4000 UFF 1112 5000 CSN 1112 6000 Pegeout 1112 7000 Ind. Quimicas Paulistas 1112 8000 Ford Caminhoes 1112 9000 Riocel Celulose 1112 10000 Elevadores Sur 1112 1000 Supermercado Carrefour 1113 2000 Supermercado Baratao 1113 58 3000 Supermercado Arariboia 1113 4000 UFF 1113 5000 CSN 1113 6000 Pegeout 1113 7000 Ind. Quimicas Paulistas 1113 8000 Ford Caminhoes 1113 9000 Riocel Celulose 1113 .............................................................. 1000 Supermercado Carrefour 6112 2000 Supermercado Baratao 6112 3000 Supermercado Arariboia 6112 4000 UFF 6112 5000 CSN 6112 6000 Pegeout 6112 7000 Ind. Quimicas Paulistas 6112 8000 Ford Caminhoes 6112 9000 Riocel Celulose 6112 10000 Elevadores Sur 6112 1000 Supermercado Carrefour 7111 2000 Supermercado Baratao 7111 3000 Supermercado Arariboia 7111 4000 UFF 7111 5000 CSN 7111 6000 Pegeout 7111 7000 Ind. Quimicas Paulistas 7111 8000 Ford Caminhoes 7111 9000 Riocel Celulose 7111 10000 Elevadores Sur 7111 140 linhas selecionadas. Neste exemplo foi executado um produto cartesiano das tabelas CLIENTE e PEDIDO, seguido de uma projeção das colunas exibidas. Neste caso, poucas informações úteis podem ser extraídas da relação resultante. Devemos então aplicar critérios de seleção à junção para podermos obter algum resultado concreto. Problema: A que clientes estão associados os pedidos existentes?Listar pelos nomes dos clientes. select nome_cli,pedido.cd_cli,pedido.num_ped from cliente,pedido where cliente.cod_cli=pedido.cd_cli; NOME_CLI CD_CLI NUM_PED ---------------------------------------- ---------- ---------- Supermercado Carrefour 1000 1111 Supermercado Carrefour 1000 1112 59 Supermercado Carrefour 1000 1113 Supermercado Arariboia 3000 2111 Supermercado Arariboia 3000 2112 Supermercado Arariboia 3000 2113 UFF 4000 3111 UFF 4000 3112 Pegeout 6000 4111 Pegeout 6000 4112 Ford Caminhoes 8000 5111 Riocel Celulose 9000 6111 Riocel Celulose 9000 6112 Elevadores Sur 10000 7111 14 linhas selecionadas. A equação apresentada na cláusula WHERE é chamada de EQUAÇÃO DE JUNÇÃO. Podemos utilizar os operadores LIKE, NOT LIKE, IN, NOT IN, NULL, NOT NULL, os operadores relacionais e operadores AND, OR e NOT, na cláusula WHERE de uma junção de tabelas. Problema: Quais são os clientes que têm pedidos com prazos de entrega superiores a 15 dias e que estão localizados nos estados de São Paulo ou do Rio de Janeiro? select nome_cli,uf,pedido.num_ped,pedido.prazo_entr from cliente,pedido where cliente.cod_cli=pedido.cd_cli and uf in ('rj','sp') and prazo_entr>15; NOME_CLI UF NUM_PED PRAZO_ENTR ---------------------------------------- -- ---------- ---------- Supermercado Carrefour rj 1113 30 Supermercado Arariboia rj 2112 18 2 linhas selecionadas. Problema: Mostrar os pedidos dos clientes e seus respectivos prazos de entrega, ordenados do maior para o menor. select nome_cli,pedido.num_ped,pedido.prazo_entr from cliente,pedido where cliente.cod_cli=pedido.cd_cli order by prazo_entr DESC; 60 NOME_CLI NUM_PED PRAZO_ENTR ---------------------------------------- ---------- ---------- Riocel Celulose 6112 60 Supermercado Carrefour 1113 30 Riocel Celulose 6111 30 Elevadores Sur 7111 20 Supermercado Arariboia 2112 18 Supermercado Arariboia 2111 15 UFF 3111 13 Supermercado Carrefour 1111 10 Ford Caminhoes 5111 10 UFF 3112 7 Pegeout 4111 7 Pegeout 4112 7 Supermercado Carrefour 1112 5 Supermercado Arariboia 2113 3 14 linhas selecionadas. 5.6.2 Sinônimos Para que não seja necessário escrever o nome da tabela nas qualificações de nomes, podemos utilizar ALIASES definidos na própria consulta. A definição dos ALIASES é feita na cláusula FROM, sendo então utilizada nas outras cláusulas (WHERE, ORDER BY, GROUP BY, HAVING e SELECT) de uma consulta. Problema: Exibir os vendedores (ordenados por nome) que emitiram pedidos com prazos de entrega superiores a 15 dias e que tenham salários fixos iguais ou superiores a R$ 1.000,00. select distinct nome_vend,prazo_entr from vendedor V, pedido P where V.cod_vend=P.cd_vend and V.sal_fixo>1000 and prazo_entr>15 order by nome_vend; NOME_VEND PRAZO_ENTR ---------------------------------------- ---------- Ana Cristina 60 Armando Pinto 30 2 linhas selecionadas. 61 4. Comandos de Alteração de Schema Problema: Exiba a relação dos clientes localizados no Rio de Janeiro (ordenados alfabeticamente) que têm pedidos do produto Chapa de Aco com prazos de entrega superirores a 15 dias. select nome_cli,desc_prod,no_ped,prazo_entr from cliente C,pedido P,item_pedido IP,produto PR where C.cod_cli=P.cd_cli and P.num_ped=IP.no_ped and IP.cd_prod=PR.cod_prod and PR.desc_prod='Chapa de Aco' and P.prazo_entr>15 and C.uf='rj' order by C.nome_cli; NOME_CLI PRAZO_ENTR DESC_PROD NO_PED ---------------------------------------- -------------------- ---------- ---------- Supermercado Carrefour Chapa de Aco 1113 30 1 linha selecionada. Problema: Mostre os nome de todos os vendedores que venderam Chapa de Aco em quantidade superior a 300 Kg. select distinct nome_vend from vendedor V, pedido P, item_pedido IP, produto PR where V.cod_vend=P.cd_vend and p.num_ped=IP.no_ped and IP.cd_prod=PR.cod_prod and IP.qtd_ped>300 and PR.desc_prod='Chapa de Aco'; NOME_VEND ---------------------------------------- Armando Pinto Maria Paula Paulo Alberto 3 linhas selecionadas. 62 Problema: Quantos clientes fizeram pedidos com a vendedora Ana Cristina? select count(distinct cod_cli) from cliente C, pedido P, vendedor V where C.cod_cli=P.cd_cli and p.cd_vend=V.cod_vend and V.nome_vend='Ana Cristina'; COUNT(COD_ ---------- 3 1 linha selecionada. Problema: Quantos clientes das cidades do Rio de Janeiro e Niterói tiveram seus pedidos tirados com a vendedora Ana Cristina? select C.cidade,count(distinct cod_cli) as num_clientes from cliente C, pedido P, vendedor V where C.cod_cli=P.cd_cli and C.cidade in ('rio de janeiro','niteroi') and p.cd_vend=V.cod_vend and V.nome_vend='Ana Cristina' group by C.cidade; CIDADE NUM_CLIENT -------------------- ---------- niteroi 2 1 linha selecionada. 4.1 Utilizando Consultas Aninhadas (Subqueries) Chamamos de consulta aninhada à consulta cujo o resultado é utilizado por outra consulta, de forma encadeada e contida no mesmo comando SQL. Problema: Que produtos estão incluídos em um pedido qualquer com a quantidade pedida igual a 100? 63 select desc_prod from produto where cod_prod IN (select cd_prod from item_pedido where qtd_ped=100); DESC_PROD -------------------- Chapa de Aco Cimento Fio plastico 3 linhas selecionadas. Problema: Quais vendedores ganham um salário fixo abaixo da média? select nome_vend from vendedor where sal_fixo < (select avg(sal_fixo) from vendedor); NOME_VEND ---------------------------------------- Paulo Alberto Cassia Andrade Maria Paula 3 linhas selecionadas. Problema: Quais os vendedores que só venderam produtos comercializados em quilogramas (Kg)? select distinct cod_vend,nome_vend from vendedor V where 'kg'=ALL (select unid_prod from pedido P,item_pedido IP,produto PR where P.num_ped=IP.no_ped and IP.cd_prod=PR.cod_prod and P.cd_vend=V.cod_vend); 64 COD_VEND NOME_VEND ---------- ---------------------------------------- 15 Maria Paula 1 linha selecionada. Problema: Quais clientes realizaram mais de dois pedidos? select nome_cli from cliente C where exists (select count(*) from pedido where cd_cli=C.cod_cli having count(*)>2); NOME_CLI ---------------------------------------- Supermercado Carrefour Supermercado Arariboia 2 linhas selecionadas. Problema: Quais os produtos que não estão presentes em nenhum pedido? select cod_prod,desc_prod from produto P where not exists (select * from item_pedido where cd_prod=P.cod_prod); COD_PROD DESC_PROD ---------- -------------------- 0 linhas selecionadas. 65 5. Inserindo, Modificando e Excluindo Registros 5.1 Inserindo Registros em uma Tabela INSERT INTO <nome_tabela> (<lista_de_colunas>) VALUES (<lista_de_valores); Problema: Inserir o produto Tinta de PVC na tabela de produtos. insert into produto values (600,’l’,’Tinta PVC’,15.80); 1 linha processada. 5.2 Inserindo Registros Usando um SELECT INSERT INTO <nome_tabela> (<lista_de_colunas>) SELECT <lista_de_colunas> FROM <nome_tabela> WHERE <condição_de_seleção>; Problema: Cadastrar como clientes os vendedores que emitiram mais de 3 pedidos. Usar para o código de cliente o mesmo código do vendedor. O restante das colunas devem ser preenchidas com um espaço em branco. insert into cliente (cod_cli, nome_cli,endereco,cidade,cep,uf) select cod_vend,nome_vend,' ', ' ',' ',' ' from vendedor V where 3<(select count(*) from pedido P where V.cod_vend=P.cd_vend); 2 linhas processadas.
Compartilhar