Baixe o app para aproveitar ainda mais
Prévia do material em texto
INTEGRAÇÃO COM BANCO DE DADOS 1 Integração com Banco de Dados INTEGRAÇÃO COM BANCO DE DADOS 2 Integração com Banco de Dados Conceitos Básicos Dados e Informações Inicialmente vamos fazer a distinção entre dados e informações. Dados - São fatos, eventos, conceitos, instruções etc., antes de terem sido organizadas em um formato inteligível e útil para o usuário; Informações - Representam dados já formatados de uma maneira inteligível e útil ao usuário. Sistema de Banco de Dados Um sistema de banco de dados (SBD) é um sistema de informações, computadorizado, que possibilita o armazenamento, manuseio, alteração e divulgação das informações armazenadas. Essas informações se fazem representar por dados organizados e formatados, de maneira que estes sejam conhecidos e utilizados pelos usuários. Um SBD é constituído de: base de dados (dados e metadados), sistema gerenciador de banco de dados (SGBD) e os aplicativos que acessam os dados. INTEGRAÇÃO COM BANCO DE DADOS 3 Figura 1. Sistema de banco de dados Sistema Gerenciador de Banco de Dados (SGBD) Um sistema gerenciador de uma base de dados (SGBD) é uma coleção de programas que permite aos usuários criar e manipular uma base de dados. Um SGBD é assim, um sistema de software de propósito geral que facilita o processo de definir, construir e manipular a base de dados de diversas aplicações. Base de Dados A base de dados é composta pelos arquivos físicos nos quais são armazenados os dados e os metadados (informações sobre a organização dos dados). Banco de Dados (BD) Um banco de dados é uma coleção de dados logicamente relacionados, com algum significado. Associações aleatórias não podem ser chamadas de bancos de dados. INTEGRAÇÃO COM BANCO DE DADOS 4 Um banco de dados é projetado, construído e preenchido com dados específicos, possuindo um grupo de usuários e aplicações pré-concebidas de modo a satisfazer as necessidades dos usuários. Os bancos de dados ajudam as empresas a gerar informação que pode auxiliar a reduzir custos, aumentar os lucros, acompanhar atividades de negócios passados e abrir novas oportunidades de mercado. São mantidos por softwares gerenciadores (SGBD) que controlam a inserção, seleção, atualização e deleção dos dados. Com o armazenamento e o controle centralizado do banco de dados, podemos enumerar as seguintes vantagens: Compartilhamento de dados Os dados armazenados podem ser compartilhados pelas aplicações de um mesmo e/ou de diferentes sistemas, sem a necessidade de voltar a incluí-los; Redundância de dados eliminada e/ou controlada Em sistemas tradicionais, cada aplicativo do sistema pode ter seus próprios arquivos e, por consequência, trazer inúmeras redundâncias de dados armazenadas. No caso do banco de dados, esses dados podem ser compartilhados de forma que não haja redundâncias, ou se existirem, que possam ser controladas; Inconsistência de dados controlada Quando os dados redundantes estão sob o controle do SGBD, as operações que venham a modificá-los serão propagadas automaticamente, de maneira que todas as redundâncias se mantenham com os mesmos valores; INTEGRAÇÃO COM BANCO DE DADOS 5 Integridade dos dados controlada Controlar a integridade é assegurar que os dados do banco estão corretos. Isto é, eles representam efetivamente uma realidade que se quer guardar e, por consequência, toda e qualquer decisão e/ou operação que venha a utilizá-lo não será induzida a gerar resultados errados devido ao uso de valores incorretos; Segurança de acesso aos dados pode ser ampliada Com o controle do banco de dados, o SGBD pode, a partir das informações de restrição de acesso disponibilizadas pelo administrador do banco de dados (DBA), assegurar que o único acesso a esses dados se façam pelos procedimentos e usuários autorizados; Padrões de representação e/ou denominação de dados pode ser implementado Com o controle centralizado do banco de dados, o administrador do banco pode determinar os padrões que serão observados na representação dos dados que serão armazenados. Dentro desses padrões, podemos ressaltar os padrões de nomenclatura de dados e documentação, que são essenciais no compartilhamento de dados e também a compreensão comum pelos usuários. Conceitos e Arquiteturas de um SGBD Modelos de Dados Uma das principais características da abordagem banco de dados é que esta fornece alguns níveis de abstração de dados omitindo ao usuário final detalhes de como estes dados são armazenados. Um “modelo de dados” é um conjunto de conceitos que podem ser utilizados para descrever a estrutura em diferentes níveis de abstração. Conceituando, podemos enumerar que estes modelos podem ser basicamente de dois tipos: INTEGRAÇÃO COM BANCO DE DADOS 6 Alto nível: ou modelo de dados conceitual, que fornece uma visão mais próxima do modo como os usuários visualizam os dados realmente; Baixo nível: ou modelo de dados físico, que fornece uma visão mais detalhada do modo como os dados estão realmente armazenados no computador. Esquemas e Instâncias Em qualquer modelo de dados utilizado, é importante distinguir a “descrição” do banco de dados do “banco de dados” propriamente dito. A descrição de um banco de dados é chamada de “esquema de um banco de dados” e é especificada durante o projeto. Geralmente poucas mudanças ocorrem no esquema. Os dados armazenados em um BD em um determinado instante do tempo formam um conjunto chamado de “instância do banco de dados”. A instância se altera toda vez que uma alteração é feita no banco. O SGBD é responsável por garantir que toda instância do banco de dados satisfaça ao esquema do banco de dados, respeitando sua estrutura e suas restrições. A Arquitetura Três Esquemas A principal meta da arquitetura “três esquemas” (Figura 1) é separar as aplicações do usuário do banco de dados físico. Os esquemas podem ser definidos como: Nível interno: ou esquema interno, o qual descreve a estrutura de armazenamento físico do banco de dados; utiliza um modelo de dados e descreve detalhadamente os dados armazenados e os caminhos de acesso ao banco; INTEGRAÇÃO COM BANCO DE DADOS 7 Nível conceitual: ou esquema conceitual, o qual descreve a estrutura do banco de dados como um todo; é uma descrição global do BD, que não fornece detalhes do modo como os dados estão fisicamente armazenados; Nível externo: ou esquema de visão, o qual descreve as visões do banco de dados para um grupo de usuários; cada visão descreve a que porções do banco um grupo de usuários terá acesso. Figura 2. Arquitetura três esquemas INTEGRAÇÃO COM BANCO DE DADOS 8 Projeto de Banco de Dados O mundo real, numa generalização extrema, para efeitos de simplificação, pode ser visto como sendo composto por objetos relacionados. O mundo real se apresenta para o ser humano como algo caótico, nebuloso e normalmente complexo. Figura 3. O mundo real Quando escrevemos algum texto, estamos representando no papel algo que está em nossa mente, e nesse caso também estamos modelando. Quando nossa mente se abstrai e cria novos conceitos a partir de conceitos preexistentes, estes novos conceitos são modelos ou podem fazer parte de modelos mais complexos. Estamos nesse caso também modelando. Quando percebemos algum fenômeno, fatoou ideia, estamos criando em nossa mente simplificações destes, ou seja, criamos modelos ou representações simplificadas de minimundos ou parcelas do mundo real ou domínio do problema, uma vez que, naquele momento, nos abstraímos de muitos detalhes julgados irrelevantes. Pode-se afirmar então que o conhecimento humano é composto de modelos do mundo real ou criados a partir de outros modelos preexistentes em nossa mente. INTEGRAÇÃO COM BANCO DE DADOS 9 OBJETOS DO MUNDO REAL MINIMUNDO MUNDO REAL Figura 4. Minimundo O mapeamento (transformação) dos objetos de uma parcela do mundo real (minimundo ou domínio do problema) em um modelo processável que vai "residir" na memória de um computador é e sempre será um desafio para os cientistas da Informática. Modelagem É uma atividade através da qual se cria um modelo de uma parcela do mundo real (minimundo) ou sucessivamente um modelo a partir de outro modelo ou de ambos. Figura 5. Representação gráfica de um minimundo INTEGRAÇÃO COM BANCO DE DADOS 10 Modelar uma parcela do mundo real (minimundo) consiste em tentar compreendê-la, seja através da identificação inicial da estrutura dos objetos que compõem essa parcela do mundo real, seguida das operações que incidem sobre esses objetos; seja de maneira inversa, através da identificação inicial das operações que neles se realizam, e da posterior identificação da estrutura dos objetos afetados por estas operações, ou até mesmo procurando enfocar esses dois aspectos de forma simultânea. A principal razão para a construção de modelos de uma parcela do mundo real (minimundo) é a redução da complexidade de entendimento e tratamento desse minimundo. Tal tratamento é propiciado através dos modelos, visto que esses são uma simplificação de um minimundo. Modelagem de dados é uma denominação genérica para as atividades que visam à construção de modelos que enfocam ou procuram representar os dados relevantes de uma parcela do mundo real. A atividade de modelagem de dados, como será vista adiante, é um conjunto de regras que utilizam ferramentas de modelagem (modelos de dados) em concordância com requisitos de projeto (critérios de qualidade). Tais requisitos, em um projeto de banco de dados, são as características intrínsecas e as desejáveis dos BDs de um modo geral, vistas inicialmente. Componentes da Atividade de Modelagem Uma atividade de modelagem deve consistir na execução sistemática de atividades menos complexas, que podem eventualmente se subdividir sucessivamente até o nível de atividades elementares. Tais atividades, para que sejam executadas, necessitam de insumos e devem gerar produtos. Existem, no entanto, atividades que dependem de algum produto gerado INTEGRAÇÃO COM BANCO DE DADOS 11 por alguma outra executada anteriormente, ou seja, algumas atividades dependem de outras e assim sucessivamente, estabelecendo uma rede de dependências. Todo esse conjunto de atividades organizadas logicamente e com propósitos bem definidos forma uma metodologia, um dos componentes da atividade de modelagem. Não se mencionou ainda a forma como as atividades devem ser executadas transformando insumos em produtos. Tal forma nada mais é do que uma técnica. Quanto aos instrumentos utilizados na execução dessas atividades, recebem a denominação de ferramentas ou mais especificamente ferramentas de modelagem, que, como poderá ser visto posteriormente, são também denominadas modelos. Temos aqui então duas acepções para o termo modelo, uma como ferramenta de modelagem e outra como produto final da atividade de modelagem. Poderíamos então resumir estes componentes da seguinte forma: Metodologia: processo intelectual de abordagem de qualquer problema mediante análise prévia e sistemática de todas as vias de acesso à solução; Técnica: forma de execução de alguma atividade; Ferramenta: instrumento utilizado na execução de alguma atividade. Modelos Será explicado nos próximos itens o que se entende por modelo de dados, uma vez que não existe uma definição aceita universalmente para tal termo. As razões são inúmeras, dentre as quais podem ser citadas: Reduzida quantidade de modelos de dados definidos formalmente; INTEGRAÇÃO COM BANCO DE DADOS 12 Elevada quantidade de modelos de dados definidos informalmente; Impossibilidade de comparar modelos formais e informais e escolher (padronizar) o mais "útil e adequado". Nos últimos anos, dezenas de modelos de dados foram propostos, muitos dos quais intuitivamente e sem qualquer formalização. No entanto, todos objetivaram apresentar regras bem definidas de sintaxe e semântica, que caracterizassem de forma inequívoca as percepções dos usuários sobre o mundo real. Este termo é utilizado normalmente segundo dois pontos de vista diferentes: o primeiro como produto final da atividade de modelagem (modelo 1 e modelo 2 da Figura 5) e o segundo como ferramenta de modelagem (idem) a ser visto nos próximos itens. Dentro do primeiro enfoque, podemos defini-lo como uma representação abstrata da realidade, e a razão de sua existência é o fato de a realidade a qual substitui ser, via de regra, de alguma forma intratável. Nenhum modelo se propõe a ser tão perfeito quanto a parcela da realidade que pretende tratar, mesmo porque, se fosse, terminaria tão intratável quanto ela. Já como ferramenta de modelagem, podemos defini-lo como uma ferramenta que tem por objetivo permitir a especificação das estruturas de dados e das operações permitidas sobre as mesmas, ou seja, deve permitir a captura das propriedades estruturais e comportamentais da parcela do mundo real (minimundo) a ser modelada: As propriedades estruturais são as que definem seus componentes e seus relacionamentos com outros objetos; INTEGRAÇÃO COM BANCO DE DADOS 13 As propriedades comportamentais são as que correspondem à evolução natural dos objetos, ou seja, suas ações ou operações. Dentro desse contexto, um modelo de dados (relacional, de redes, hierárquico, semântico, orientado a objetos etc.) é uma ferramenta de modelagem que auxilia a realização da atividade de modelagem de dados num determinado nível de abstração. Esquema Um esquema consiste em uma definição de todos os tipos de objetos da aplicação, incluindo seus atributos, relacionamentos e restrições. É a representação de uma porção específica da realidade, construído através de um modelo de dados particular. Mais especificamente, é uma coleção de representações linguísticas ou gráficas, invariantes com o tempo, as quais descrevem a estrutura de dados de interesse. Instância Uma instância de um esquema é uma coleção de dados que variam com o tempo, de acordo com a estrutura de dados definida pelo esquema. Cada esquema pode ter múltiplas instâncias, e o estado do banco de dados em um particular instante corresponde a uma instância. A evolução do banco de dados pode ser vista como a transição de uma instância para outra, causada por alguma operação de modificação dos dados. Outra maneira de ver as diferenças entre esquema e instância é considerar o esquema como um "conhecimento intencional" e instância como "conhecimento extensional"; o primeiro denota as propriedades estruturais do dado; o último denota uma atribuição de valores aos dados. INTEGRAÇÃO COM BANCO DE DADOS 14 Projeto de Banco de Dados É o processo de projeto da estrutura lógica efísica de um ou mais bancos de dados para acomodar as informações necessárias aos usuários de uma organização para um definido conjunto de aplicações. Projetar um banco de dados é uma atividade eminentemente complexa. Essa complexidade é herdada do normalmente complexo minimundo correspondente e daquelas inerentes às próprias atividades de projeto de banco de dados, decorrentes da complexidade das ferramentas (modelos de dados) e dos requisitos de projeto a serem satisfeitos. Essa complexidade se deve, então, aos seguintes fatores: Complexidade do domínio do problema (parcela do mundo real ou minimundo); Dificuldade de entendimento do domínio do problema; Dificuldade na execução das atividades de projeto de banco de dados, visando o atendimento de todas as características básicas e desejáveis de um BD; Dificuldade de gerência (planejamento e controle) do processo de projeto do BD. Uma das formas de tratamento da complexidade é o particionamento. Quais serão, no entanto, essas partes ou fases que irão compor a atividade de projeto de banco de dados? Pode-se pensar inicialmente que ela pode ser dividida em duas fases: uma voltada para a produção de um modelo abstrato do minimundo, totalmente independente de qualquer Tecnologia da Informação, e outra na qual se concentrará nas INTEGRAÇÃO COM BANCO DE DADOS 15 características da Tecnologia da Informação a ser utilizada no processamento desse modelo abstrato. As fases acima mencionadas serão denominadas: Elaboração de um modelo abstrato do minimundo; Figura 6. Modelo abstrato do minimundo Elaboração de um modelo processável do minimundo. Figura 7. Modelo processável do minimundo Pela complexidade inerente a essa última, podemos dividi-la em duas subfases: ELABORAÇÃO DE UM MODELO PROCESSÁVEL A PARTIR DO MODELO ABSTRATO MODELO ABSTRATO TECNOLOGIA DA INFORMAÇÃO MODELO PROCESSÁVEL INTEGRAÇÃO COM BANCO DE DADOS 16 Elaboração de um modelo implementável, durante a qual endereçaremos uma classe de Tecnologia da Informação (ex.: bancos de dados relacionais); Elaboração de um modelo processável, durante a qual endereçaremos uma Tecnologia da Informação específica (ex.: SGBD Oracle). Figura 8. Modelo processável a partir de um modelo abstrato 4. Fases e Ferramentas do Projeto de Banco de Dados As três fases anteriormente determinadas serão denominadas respectivamente, em que pesem as críticas quanto a essa denominação, de: Projeto conceitual de banco de dados: visa produzir um modelo abstrato do minimundo, totalmente independente de Tecnologia da Informação; Projeto lógico de banco de dados: visa produzir um modelo Implementável do minimundo, dependente de uma classe de Tecnologia da Informação; Projeto físico de banco de dados: visa produzir um modelo processável do minimundo, dependente de uma Tecnologia da Informação específica. MODELO ABSTRATO CLASSE DA TECNOLOGIA DA INFORMAÇÃO MODELO IMPLEMENTÁVEL ELABORAÇÃO DE UM MODELO PROCESSÁVEL A PARTIR DO MODELO ABSTRATO TECNOLOGIA DA INFORMAÇÃO EFETIVA OU REAL MODELO PROCESSÁVEL INTEGRAÇÃO COM BANCO DE DADOS 17 A figura abaixo mostra as fases do projeto de banco de dados e das respectivas ferramentas a serem utilizadas nessas fases: Figura 9. Fases do projeto de banco de dados Modelagem Conceitual Modelo Entidade-Relacionamento (E-R) Tem por base a percepção do mundo real como um conjunto de objetos básicos, chamado entidades, e do relacionamento entre eles. As entidades são descritas no banco de dados por meio de seus atributos. Os valores de atributos que descrevem cada entidade ocupam a maior parte dos dados armazenados na base de dados. Um relacionamento é uma associação entre entidades. O modelo E-R também representa certas regras que o conteúdo do banco de dados precisa respeitar. Uma regra importante é o mapeamento das cardinalidades, as quais expressam o número de entidades às quais a outra entidade se relaciona por meio daquele conjunto de relacionamentos. PROJETO CONCEITUAL DE DADOS PROJETO LÓGICO DE DADOS PROJETO FÍSICO DE DADOS MODELO ENTIDADE RELACIONAMENTO LINGUAGEM SQL MODELO DE DADOS RELACIONAL REQUISITOS DE INFORMAÇÃO ESQUEMA CONCEITUAL DE DADOS GLOBAL (MODELO ABSTRATO) ESQUEMA LÓGICO DE DADOS (MODELO IMPLEMENTÁVEL) ESQUEMA FÍSICO DE DADOS (MODELO PROCESSÁVEL) DBA INTEGRAÇÃO COM BANCO DE DADOS 18 Esse modelo utiliza diagramas gráficos básicos para mostrar a organização e as relações entre os dados. Toda a estrutura lógica do banco de dados pode ser expressa graficamente por meio de diagrama E-R, cujos construtores são: Retângulos - Representam os conjuntos de entidades; Círculos - Representam os atributos; Losangos - Representam os relacionamentos entre os conjuntos de entidades; Linhas - Unem os atributos aos conjuntos de entidades e o conjunto de entidades aos seus relacionamentos. Entidades e Atributos O objeto básico tratado pelo modelo ER é a “entidade”, que pode ser definida como um objeto do mundo real, concreto ou abstrato, e que possui existência independente. Cada entidade possui um conjunto particular de propriedades que a descreve, chamado de “atributos”. Os atributos podem ser classificados de várias formas: Um atributo que pode ser dividido em diversas subpartes com significado independente entre si recebe o nome de “atributo composto”, enquanto aquele que não pode ser subdividido é chamado de “atributo simples” ou “atômico”; Os atributos que podem assumir apenas um determinado valor em uma determinada instância são denominados “atributos monovalorados”, enquanto que um atributo que pode assumir diversos valores em uma mesma instância é denominado “multivalorado”; INTEGRAÇÃO COM BANCO DE DADOS 19 Um atributo que não admite repetição em seus valores é denominado único; já se admite repetição, é não único; Os atributos que têm que ter valor, ou seja, que não podem ser nulos, são chamados de obrigatórios; já os que podem ser nulos são opcionais; Um atributo que é gerado a partir de outro é chamado de atributo derivado. Entidades Tipo, Atributo Identificador Um banco de dados costuma conter grupos de entidades similares, possuindo os mesmos atributos, porém, cada entidade com seus próprios valores para cada atributo. Este conjunto de entidades similares define uma “entidade-tipo”. Cada entidade-tipo é identificada por seu nome e pelo conjunto de atributos que define suas propriedades. A descrição da entidade-tipo é chamada de esquema, especificando o seu nome, o nome de cada um de seus atributos e qualquer restrição que incida sobre as entidades. Uma entidade-tipo pode possuir um atributo cujos valores são distintos para cada entidade individual. Este atributo é chamado de “atributo identificador”, e seus valores podem ser utilizados para identificar cada entidade de forma única. Cada atributo simples de um tipo entidade está associado com um conjunto de valores denominado “domínio”, o qual especifica o conjunto de valores que podem ser designados para este determinado atributo para cada entidade. INTEGRAÇÃO COM BANCO DE DADOS 20 Relacionamento-Tipo Além de conhecerdetalhadamente as entidades-tipo, é muito importante conhecer também os relacionamentos entre estas. Um relacionamento-tipo R entre n entidades E1, E2, ..., En é um conjunto de associações entre entidades deste tipo. Informalmente falando, cada instância de relacionamento r1 em R é uma associação de entidades, na qual a associação inclui exatamente uma entidade de cada tipo entidade participante no tipo relacionamento. Isto significa que estas entidades estão relacionadas de alguma forma no minimundo. Cardinalidade Geralmente, o relacionamento-tipo sofre certas restrições que limitam as possíveis combinações das entidades participantes. Estas restrições são derivadas de restrições impostas pelo estado destas entidades no minimundo. Veja o exemplo da Figura 10. Figura 10. Relacionamento Empregado - Gerência - Departamento No exemplo, temos a seguinte situação: um empregado pode gerenciar apenas um departamento, enquanto que um departamento pode ser gerenciado por apenas um empregado. A este tipo de restrição, nós chamamos de cardinalidade. A d3 d2 d1 e7 e6 e5 e4 e3 e2 e1 EMPREGADO Gerência DEPARTAMENTO INTEGRAÇÃO COM BANCO DE DADOS 21 cardinalidade indica o número de relacionamentos dos quais uma entidade pode participar. A cardinalidade pode ser: 0:1, 1:1, 1:N, 0:N. No exemplo, a cardinalidade é 1:1, pois cada entidade empregado pode gerenciar apenas um departamento e um departamento pode ser gerenciado por apenas um empregado. Modelo Relacional Proposto originalmente por E. F. Codd durante seu trabalho no Laboratório de Pesquisas da IBM em San Jose na segunda metade da década de 1960, o modelo relacional se baseia em conceitos matemáticos para proporcionar uma representação confiável para bancos de dados. Desde sua implantação no primeiro SGBDR (Sistema de Gerenciamento de Bancos de Dados Relacionais) da IBM, denominado System R, várias melhorias têm sido incluídas no modelo, o que o torna ainda atual e o mais utilizado no mercado. O modelo de dados relacional representa os dados em um BD através de um conjunto de relações (tabelas). Estas relações contêm informações sobre entidades ou relacionamentos existentes no domínio da aplicação utilizada como alvo para a modelagem. Informalmente uma relação pode ser considerada uma tabela de valores, da qual cada linha representa uma coleção de valores de dados inter-relacionados. Estes conjuntos de valores podem representar uma instância de uma entidade ou relacionamento da aplicação. Os nomes fornecidos às tabelas e às suas colunas podem auxiliar na compreensão do significado dos valores armazenados em cada uma das suas linhas. Na terminologia do modelo relacional, cada linha da relação é denominada de tupla, e o nome da coluna é denominado atributo da relação. INTEGRAÇÃO COM BANCO DE DADOS 22 Tabela 1. O domínio consiste em um grupo de valores atômicos a partir dos quais um ou mais atributos (ou colunas) retiram seus valores reais. Por exemplo: o domínio do atributo FCIDADE consiste no conjunto de todos os nomes legais de cidades. O esquema de uma relação consiste em um conjunto de atributos que descrevem as características dos elementos a ser modelados. É denotado por R (A1, A2, ...., An), em que cada atributo Ai toma seus valores a partir de um domínio Di; e R é o nome da relação. O número de atributos na relação n consiste no grau da relação. Os domínios a partir dos quais os atributos da relação retiram seus valores não precisam ser necessariamente distintos. Como exemplo, o esquema da relação apresentada na Tabela 1 é dado por: Fornecedor (FCodigo, FNome, FCategoria, FCidade) Como esquema de um BD relacional, entende-se o conjunto de intenções (esquemas das relações) definidas para todas as relações da base, e um conjunto de restrições de integridade. Sobre os nomes fornecidos aos atributos, é permitido àqueles que representem conceitos semelhantes possuir ou não o mesmo nome em diferentes relações. Da mesma forma, atributos representando conceitos diferentes podem possuir o mesmo nome. O conjunto de restrições de integridade define regras básicas que os valores dos atributos devem obedecer quando aparecerem em uma relação. A instância de uma relação consiste no conjunto de valores que cada atributo, definido no esquema, assume em um determinado instante, formando o conjunto de tuplas. FCODIGO FNOME FCATEGORIA FCIDADE F1 Santos 20 Piracicaba F2 Machado 10 São Paulo F3 Almeida 30 São Paulo F4 Ferreira 20 Campinas F5 Rodrigues 30 São Carlos INTEGRAÇÃO COM BANCO DE DADOS 23 Ou seja, as instâncias das relações formam os dados que são armazenados no BD. As relações apresentam as seguintes características: Não há tuplas duplicadas em uma relação; A ordem das tuplas na relação não é relevante para diferenciar as relações; Os valores dos atributos devem ser atômicos, não sendo divisíveis em componentes. Atributo Chave de uma Relação Uma relação pode ser definida como um conjunto de tuplas distintas. Isto implica que a combinação dos valores dos atributos em uma tupla não pode se repetir na mesma tabela. Existirá sempre um subconjunto de atributos em uma tabela que garante que não haverá valores repetidos para as diversas tuplas da mesma, garantindo que t1[SC] t2[SC]. SC é chamada de superchave de um esquema de relação. Toda relação possui ao menos uma superchave — o conjunto de todos os seus atributos. Uma chave C de um esquema de relação R é uma superchave de R com a propriedade adicional que, removendo qualquer atributo A de K, resta ainda um conjunto de atributos K’ que não é uma superchave de R. Uma chave é uma superchave da qual não se podem extrair atributos. Por exemplo, o conjunto: (RA, Nome, Endereço) é uma superchave para estudante, porém não é uma chave, pois se tirarmos o campo Endereço continuaremos a ter uma superchave. Já o conjunto (Nome da Revista, Volume, Nº da Revista) é uma superchave e uma chave, pois qualquer um dos atributos que retirarmos, deixaremos de ter uma superchave, ou seja, (Nome da Revista, Volume) não identifica uma única tupla. Em outras palavras, uma superchave é uma chave composta, ou seja, uma chave formada por mais de um atributo. Veja o exemplo abaixo: INTEGRAÇÃO COM BANCO DE DADOS 24 DEPENDENTES RG Responsá vel Nome Dependente Dt. Nascimento Relação Sexo 1010101 0 Jorge 27/12/86 Filho Masculin o 1010101 0 Luiz 18/11/79 Filho Masculin o 2020202 0 Fernanda 14/02/69 Cônjuge Feminino 2020202 0 Ângelo 10/02/95 Filho Masculin o 3030303 0 Fernanda 01/05/90 Filho Feminino Tabela 2. Dependentes Quando uma relação possui mais de uma chave (não confundir com chave composta) — como por exemplo RG e CIC para empregados —, cada uma destas chaves é chamada de chave candidata. Uma destas chaves deve ser escolhida como primária. Uma chave estrangeira CE de uma tabela R1 em R2 ou vice-versa especifica um relacionamento entre as tabelas R1 e R2. INTEGRAÇÃO COM BANCO DE DADOS 25 Tabela 3. Departamento; Tabela 4. Empregado Modelagem Lógica O mapeamento do modelo entidade relacionamento para o modelo relacional segue os seguintes passos: 1. Para cada entidade E no modelo ER é criada uma tabela T1 no modelo relacional que inclua todos os atributos simples de E; um dos atributos chaves de E deveser escolhida como a chave primária de T1; INTEGRAÇÃO COM BANCO DE DADOS 26 E E Figura 11. Modelagem de entidade 2. Para cada atributo composto, são inseridos apenas os componentes simples de cada um; E a1 a2 a1 a21 a22 a23 a23a22a21 E Figura 12. Modelagem de atributos compostos 3. Para cada atributo multivalorado A1, cria-se uma tabela T1, contendo o atributo multivalorado A1, mais o atributo chave C da tabela que representa a entidade ou relacionamento que contém A1; a chave primária de T1 será composta por A1 mais C; se A1 for composto, então a tabela T1 deverá conter todos os atributos de A1; a1 a2 E a1 a3 (_,N) a2 a1 a3 E A3_E Figura 13. Modelagem de atributos multivalorados INTEGRAÇÃO COM BANCO DE DADOS 27 4. Para cada relacionamento regular com cardinalidade 1:1 entre entidades E1 e E2 que geraram as tabelas T1 e T2 respectivamente, devemos escolher a chave primária de uma das relações (T1, T2) e inseri-la como chave estrangeira na outra relação; se um dos lados do relacionamento tiver participação total e outro parcial, então é interessante que a chave do lado com participação parcial seja inserida como chave estrangeira no lado que tem participação total; E1 a1 a2 a3 E2 b1 b2 b3 R c1 c2 (_,1) (_,1) Figura 14. Modelagem de relacionamento 1:1 5. Para cada relacionamento regular com cardinalidade 1:N entre entidades E1 e E2 respectivamente e que geraram as tabelas T1 e T2 respectivamente, deve-se inserir a chave primária de T1 como chave estrangeira em T2; a1 a2 a3 b1 c1 c2 E1 a1 a2 a3 E2 b1 b2 b3 R c1 c2 (_,N) (_,1) E1 Figura 15. Modelagem de relacionamento 1:n INTEGRAÇÃO COM BANCO DE DADOS 28 6. Para cada relacionamento regular com cardinalidade N:N entre entidades E1 e E2, cria-se uma nova tabela T1, contendo todos os atributos do relacionamento mais o atributo chave de E1 e o atributo chave de E2; a chave primária de T1 será composta pelos atributos chave de E1 e E2; a1 b1 c1 c2 E1 a1 a2 a3 E2 b1 b2 b3 R c1 c2 (_,M) (_,N) R Figura 16. Modelagem de relacionamento n:n Linguagem SQL SQL, ou Structured Query Language, ou Linguagem de Consulta Estruturada, é uma linguagem de pesquisa declarativa padrão para banco de dados relacional (base de dados relacionais). A álgebra relacional deu inspiração a muitas das suas características originais. O SQL foi criado por E.F. Codd, membro do laboratório de pesquisa da IBM na década de 1970. Com o sucesso da linguagem e o surgimento de vários “dialetos” criados por outros produtores, foi criado um padrão para a linguagem. Em 1986, a ANSI (American National Standards Institute) foi responsável por padronizar as implementações da linguagem e em 1987 pela ISO (International Organization for Standardization). INTEGRAÇÃO COM BANCO DE DADOS 29 Mesmo o SQL sendo padronizado pela ANSI e ISO, existem muitas variações e extensões criadas por diversos fabricantes de sistemas gerenciadores de bases de dados. A linguagem pode ser facilmente migrada entre as plataformas sem grandes mudanças nas suas estruturas principais. Visão Geral de SQL Tipos de Dados Para armazenar as informações em um banco de dados, é importante conhecer os tipos de dados existentes. Existem três grandes grupos de tipos de dados em um BD: os do tipo caractere, os numéricos e os de data e hora. Após conhecer os tipos de dados, é possível entender quais valores podem ser utilizados, quais tamanhos podem ter, as operações que podem ser realizadas e como armazenar as informações de maneira correta. Caracteres Os tipos de dados caracteres podem armazenar textos, dados binários, caracteres especiais, e seu tamanho não pode passar de 254 bytes. Seguem os caracteres mais utilizados: CHAR: string de caracteres de tamanho fixo; VARCHAR: string de caracteres de tamanho variável. Numéricos Os tipos de dados numéricos podem armazenar números exatos, inteiros, ponto flutuante, ponto fixo, aproximados, dentre outros. Seguem os tipos mais utilizados: INTEGER: números inteiros com 10 dígitos de precisão; não aceitam número fracionário; todos os números após o ponto decimal são truncados; INTEGRAÇÃO COM BANCO DE DADOS 30 NUMBER: números inteiros com 22 dígitos decimais de precisão; não é necessário indicar a precisão; DECIMAL: números inteiros com 22 dígitos decimais de precisão; é necessário indicar a precisão; SMALLINT: números inteiros com 5 dígitos de precisão; não aceitam número fracionário; todos os números após o ponto decimal são truncados; FLOAT: número de ponto flutuante de precisão simples; DOUBLE: número de ponto flutuante de precisão dupla; BIT: campo de um bit. Data e Hora Os tipos de dados data e hora podem armazenar datas e horas de diversos formatos. Seguem os tipos mais utilizados: DATE: armazena apenas datas, que podem ser exibidas e codificadas de diversas formas; TIME: armazena apenas horas, que podem ser exibidas e codificadas de diversas formas; TIMESTAMP: armazena data e hora ao mesmo tempo, que podem ser exibidas e codificadas de diversas formas. DML Linguagem de Manipulação de Dados, ou Data Manipulation Language (DML), é um subconjunto de linguagem usada para inserir, atualizar e apagar registros. Insert Comando utilizado para inserir registros em uma tabela. Exemplo: INSERT INTO nome_tabela VALUES (valor1, valor2, valor3,...) ou INTEGRAÇÃO COM BANCO DE DADOS 31 INSERT INTO nome_tabela (coluna1, coluna2, coluna3,...) VALUES (valor1, valor2, valor3,...); Update Comando utilizado para atualizar os registros de uma tabela. Exemplo: UPDATE nome_tabela SET campo = “novo_valor” WHERE condição Delete Comando utilizado para apagar os registros de uma tabela. Exemplo: DELETE FROM nome_tabela WHERE condição DTL Linguagem de Transação de Dados, ou Data Transaction Language (DTL), utilizada para transações como start transaction, commit e rollback. Start Transaction Marca o começo de uma transação no banco de dados, que pode ser completa ou não. Exemplo: START TRANSACTION; COMMIT Envia todos os dados da transação permanentemente para o banco de dados Exemplo: COMMIT ROLLBACK Desfaz todas as alterações feitas nas transações realizadas no banco de dados. INTEGRAÇÃO COM BANCO DE DADOS 32 Exemplo: ROLLBACK; DDL Linguagem de Definição de Dados, ou Data Definition Language (DDL), utilizada para definir novas tabelas e elementos associados. CREATE Comando utilizado para criar uma tabela dentro da base de dados. Exemplo: CREATE TABLE aluno (nome VARCHAR (50), matricula INT, PRIMARY KEY (matricula)); DROP Comando utilizado para apagar uma tabela dentro da base de dados. Exemplo: DROP TABLE aluno; DQL Linguagem de Consulta de Dados, ou Data Query Language (DQL), o mais importante dentre eles, pois as consultas são realizadas o tempo todo no BD, e o seu único comando é o SELECT, que é composto de várias cláusulas e opções. Cláusulas As cláusulas são condições utilizadas nas consultas para determinar os dados a serem selecionados e as regras a serem aplicadas. From - Utilizadopara definir a tabela na consulta para seleção dos registros; Where - Utilizado para definir as condições que os registros devem ter para serem selecionados; Group By - Utilizado para agrupar os registros com o mesmo conteúdo; Having - Utilizado para definir as condições que cada grupo deve ter; INTEGRAÇÃO COM BANCO DE DADOS 33 Order By - Utilizado para ordenar os registros, especificando a ordem (desc, asc); Distinct - Utilizado para selecionar registros distintos. Operadores Lógicos AND (“E”): compara dois ou mais valores; caso todos sejam corretos (iguais), devolve um valor verdadeiro; OR (“OU”): compara dois ou mais valores; caso um deles seja correto, devolve um valor verdadeiro; NOT: negação; devolve o valor contrário da expressão. Agregação As funções de agregação produzem um único resultado para todas as linhas que retornam de uma consulta. Seguem as funções mais utilizadas: AVG – Retorna a média dos registros selecionados; COUNT – Retorna a quantidade de linhas selecionadas; SUM – Retorna a soma todos os registros selecionados; MAX – Retorna o maior valor dos registros selecionados; MIN – Retorna o menor valor dos registros selecionados. Sintaxe de SQL As tabelas no banco de dados são identificadas por um nome (Aluno, Cliente, Empregado), e as linhas também conhecidas como registros contêm os dados da tabela. INTEGRAÇÃO COM BANCO DE DADOS 34 Tabela 5. Aluno A query (consulta em SQL) a seguir irá retornar todos os registros da tabela “ALUNO”: SELECT * FROM ALUNO É importante saber que o SQL não é case sensitive. Um Pouco mais sobre Select Vimos que o SELECT é o comando mais utilizado no banco de dados, tanto para consultas simples até consultas mais complexas. Então, para entendermos melhor todas as funcionalidades e aprender como utilizar esta ferramenta no BD, veremos agora alguns de seus principais recursos. A declaração SELECT é utilizada para selecionar os registros de um banco de dados, e o resultado de uma consulta SQL é apresentado em forma de tabela. A sintaxe de um SELECT é bem simples. Como já vimos, podemos selecionar os registros de duas formas: chamando o nome das colunas antes do FROM — desta forma, precisa-se saber o nome de cada coluna — ou chamando todas as colunas de uma vez utilizando o asterisco (*) antes do FROM; desta forma não é necessário saber o nome das colunas. Exemplos: SELECT nome_coluna1, nome_coluna2 FROM nome_tabela INTEGRAÇÃO COM BANCO DE DADOS 35 ou SELECT * FROM nome_tabela. Exemplo de SELECT na tabela “ALUNO”: Queremos selecionar o conteúdo das colunas MATRICULA e NOME. Usaremos a seguinte declaração SELECT: SELECT MATRICULA, NOME FROM ALUNO O resultado será: Tabela 6. Resultado da consulta na tabela ALUNO Select Distinct Em algumas tabelas do banco de dados, as informações contidas nas colunas podem conter valores duplicados. Se for preciso listar todos os valores distintos de uma coluna, o DISTINCT deve ser utilizado para retornar apenas os valores sem duplicidade. Sua sintaxe é a seguinte: SELECT DISTINCT nome_coluna FROM nome_tabela. Exemplo de SELECT DISTINCT na tabela “FUNCIONARIO”. INTEGRAÇÃO COM BANCO DE DADOS 36 Tabela 7. “FUNCIONARIO” Queremos selecionar apenas os valores distintos da coluna “DEPARTAMENTO” da tabela “FUNCIONARIO”; para isso, utilizaremos a seguinte consulta: SELECT DISTINCT DEPARTAMENTO FROM FUNCIONARIO O resultado será: Tabela 8. Departamento Cláusula Where A cláusula WHERE é utilizada para criar regras, nos casos em que somente os registros que tiverem os critérios utilizados serão extraídos. Sua sintaxe é a seguinte: SELECT nome_coluna FROM nome_tabela WHERE nome_coluna operador valor Exemplo de WHERE na tabela “PAIS”: INTEGRAÇÃO COM BANCO DE DADOS 37 Tabela 9. “PAIS” Queremos selecionar os países com P_ID igual a 2; para isso, utilizaremos a seguinte consulta: SELECT * FROM PAIS WHERE P_ID = 2 O resultado será: Tabela 10. Resultado da consulta WHERE na tabela “PAIS” Com relação ao campo de texto, deve ser escrito entre aspas simples (‘Brasil’); já valores numéricos não precisam das aspas (123). Forma correta: SELECT * FROM PAIS WHERE PAIS = ‘Portugal’ SELECT * FROM PAIS WHERE P_ID = 3 Forma errada: SELECT * FROM PAIS WHERE PAIS = Portugal SELECT * FROM PAIS WHERE P_ID = ‘3’ Para a cláusula WHERE, podem ser utilizados os seguintes operadores de comparação: INTEGRAÇÃO COM BANCO DE DADOS 38 Tabela 11. Operadores de comparação Order By A palavra-chave ORDER BY é utilizada para ordenar o resultado de uma consulta a partir de uma coluna determinada. O padrão da ordenação é crescente; caso queira ordenar de modo descendente, a palavra DESC deve ser utilizada. Sua sintaxe é a seguinte: SELECT nome_coluna FROM nome_tabela ORDER BY nome_coluna ASC|DESC Exemplo de ORDER BY DESC na tabela “PRODUTO”: Tabela 12. Produto INTEGRAÇÃO COM BANCO DE DADOS 39 Queremos selecionar todos os produtos classificados em ordem descendente por preço; para isso, utilizaremos a seguinte consulta: SELECT * FROM PRODUTO ORDER BY PRECO DESC O resultado será: Tabela 13. Produto LIKE O LIKE é utilizado para localizar um determinado padrão de palavra em uma coluna. Para definir a posição da palavra de busca, o “%” deve ser usado: No final para buscar palavras que começam com o padrão definido; No início para buscar palavras que terminam com o padrão definido; No final e no início para buscar palavras que contenham em qualquer posição o padrão definido. Sua sintaxe é a seguinte: SELECT nome_coluna FROM nome_tabela WHERE nome_coluna LIKE padrao Exemplo um de LIKE INTEGRAÇÃO COM BANCO DE DADOS 40 Tabela 14. DEPARTAMENTO Queremos selecionar apenas os nomes dos departamentos que começam com a letra “R”; para isso, utilizaremos a seguinte consulta: SELECT * FROM DEPARTAMENTO WHERE DEPARTAMENTO LIKE ‘R%’ O resultado será: Tabela 15. "DEPARTAMENTO” Exemplo dois de LIKE na tabela “DEPARTAMENTO”. Queremos selecionar apenas os nomes dos gerentes que terminam com a letra “O”. Para isso, utilizaremos a seguinte consulta: SELECT * FROM DEPARTAMENTO WHERE GERENTE LIKE ‘%o’ O resultado será: INTEGRAÇÃO COM BANCO DE DADOS 41 Tabela 16. ‘DEPARTAMENTO” Exemplo três de LIKE na tabela “DEPARTAMENTO”. Queremos selecionar apenas os nomes dos gerentes que tenham a letra “A” em qualquer posição; para isso utilizaremos a seguinte consulta: SELECT * FROM DEPARTAMENTO WHERE GERENTE LIKE ‘%a%’ O resultado será: Tabela 17. “DEPARTAMENTO” Exemplo quatro de LIKE na tabela “DEPARTAMENTO”. Queremos selecionar apenas os nomes dos departamentos que não tenham a letra “o” em qualquer posição; para isso, utilizaremos a seguinte consulta: SELECT * FROM DEPARTAMENTO WHERE DEPARTAMENTO NOT LIKE ‘%o%’ Tabela 18.“DEPARTAMENTO” INTEGRAÇÃO COM BANCO DE DADOS 42 IN O IN permite buscar diversos valores na cláusula WHERE. Sua sintaxe é a seguinte: SELECT nome_coluna FROM nome_tabela WHERE nome_coluna IN (valor1, valor2, valor3,...) Exemplo: Tabela 19. “FACULDADE” Queremos selecionar os nomes das faculdades iguais a “UNIABEU” ou “Gama Filho”; para isso, utilizaremos a seguinte consulta: SELECT * FROM FACULDADE WHERE FACULDADE IN (‘UNIABEU’, ‘GamaFilho’) O resultado será: Tabela 20. “FACULDADE” Between O BETWEEN é utilizado para selecionar um intervalo de dois valores. Os valores podem ser do tipo data, número ou texto. Sua sintaxe é a seguinte: INTEGRAÇÃO COM BANCO DE DADOS 43 SELECT nome_coluna FROM nome_tabela WHERE nome_coluna BETWEEN valor1 AND valor2 Exemplo um de BETWEEN: Tabela 21. “VENDEDOR” Queremos selecionar os vendedores que o V_ID esteja entre 2 e 4; para isso utilizaremos a seguinte consulta: SELECT * FROM VENDEDOR WHERE V_ID BETWEEN 2 AND 4 O resultado será: Tabela 22. “VENDEDOR” Exemplo dois de NOT BETWEEN na tabela “VENDEDOR”. Queremos selecionar os vendedores que o V_ID não esteja entre 2 e 4; para isso, utilizaremos a seguinte consulta: SELECT * FROM VENDEDOR WHERE V_ID NOT BETWEEN 2 AND 4 O resultado será: INTEGRAÇÃO COM BANCO DE DADOS 44 Tabela 23. “VENDEDOR” Também é possível selecionar um intervalo entre duas datas. Exemplo três de BETWEEN na tabela “VENDEDOR”. Queremos selecionar os vendedores que nasceram entre os anos de 1980 a 1990; para isso, utilizaremos a seguinte consulta: SELECT * FROM VENDEDOR WHERE NASCIMENTO BETWEEN ‘01/01/1980’ AND ‘31/12/1990’ O resultado será: Tabela 24. “VENDEDOR” JOIN O JOIN é usado em consultas para buscar dados em duas ou mais tabelas, utilizando as colunas com a mesma relação entre elas. Essa relação é feita através de uma coluna na qual os registros são únicos para cada linha, mais conhecida como chave primária. Dentro de um banco de dados, as tabelas podem relacionar entre si usando as chaves primárias, assim evitando a repetição dos dados em todas as tabelas. Abaixo mostraremos duas tabelas em que todos os exemplos dos diferentes tipos de JOIN serão feitos. INTEGRAÇÃO COM BANCO DE DADOS 45 Tabela 25. “CLIENTE” A coluna “C_ID” é a chave primária da tabela “CLIENTE”, com isso não podem existir linhas na “C_ID” com o mesmo número, pois cada número da “C_ID” identifica uma pessoa unicamente, mesmo que o nome seja igual. Tabela 26. “PEDIDO” A coluna “P_ID” é a chave primária da tabela “PEDIDO” e a coluna “C_ID” refere-se aos clientes da tabela “CLIENTE”. O relacionamento entre as tabelas será feito pela coluna “C_ID” existente nas duas tabelas. Conheceremos agora os tipos de JOIN e suas diferenças. JOIN ou INNER JOIN: quando ambas as tabelas tiverem ao menos uma correspondência, os registros serão retornados; LEFT JOIN: todos os registros da tabela à esquerda serão retornados, mesmo que não estejam na tabela à direita; INTEGRAÇÃO COM BANCO DE DADOS 46 RIGHT JOIN: todos os registros da tabela à direita serão retornados, mesmo que não estejam na tabela à esquerda; FULL JOIN: todos os registros da tabela à esquerda e da tabela à direita serão retornados. Sintaxe de JOIN ou INNER JOIN: SELECT nome_coluna (s) FROM nome_tabela1 INNER JOIN nome_tabela2 ON nome_tabela1.nome_coluna = nome_tabela2.nome_coluna Exemplo de JOIN ou INNER JOIN na tabela “CLIENTE e tabela “PEDIDO”. Para listar todos os clientes com algum pedido, utilizaremos a seguinte consulta: SELECT CLIENTE.NOME, CLIENTE.ENDERECO, PEDIDO.NUMERO FROM CLIENTE INNER JOIN Pedido ON CLIENTE.C_ID = PEDIDO.C_ID Para tornar a consulta mais limpa e de fácil compreensão, utilizaremos o alias na mesma consulta sem alterar o resultado: SELECT C.NOME, C.ENDERECO, P.NUMERO FROM CLIENTE C INNER JOIN PEDIDO P OB C.C_ID = P.C_ID O resultado de ambas as consultas será: Tabela 27. INTEGRAÇÃO COM BANCO DE DADOS 47 Sintaxe de LEFT JOIN: SELECT nome_coluna (s) FROM nome_tabela1 LEFT JOIN nome_tabela2 ON nome_tabela1.nome_coluna = nome_tabela2.nome_coluna Exemplo de LEFT JOIN na tabela “CLIENTE” e tabela “PEDIDO”. Para listar todos os clientes e os seus pedidos, se houver, utilizaremos a seguinte consulta: SELECT C.NOME, C.ENDERECO, P.NUMERO FROM CLIENTE C LEFT JOIN PEDIDO P ON C.C_ID = P.C_ID O resultado será: Tabela 28. Sintaxe de RIGHT JOIN: SELECT nome_coluna (s) FROM nome_tabela1 RIGHT JOIN nome_tabela2 ON nome_tabela1.nome_coluna = nome_tabela2.nome_coluna SELECT C.NOME, C.ENDERECO, P.NUMERO FROM CLIENTE C RIGHT JOIN PEDIDO P ON C.C_ID = P.C_ID INTEGRAÇÃO COM BANCO DE DADOS 48 O resultado será: Tabela 29. Sintaxe de FULL JOIN: SELECT nome_coluna (s) FROM nome_tabela1 FULL JOIN nome_tabela2 ON nome_tabela1.nome_coluna = nome_tabela2.nome_coluna Exemplo de FULL JOIN na tabela “CLIENTE” e tabela “PEDIDO”. Para listar todos os clientes e os seus pedidos, e todos os pedidos e os seus clientes, utilizaremos a seguinte consulta: SELECT C.NOME, C.ENDERECO, P.NUMERO FROM CLIENTE C FULL JOIN PEDIDO P ON C.C_ID = P.C_ID O resultado será: Tabela 30. INTEGRAÇÃO COM BANCO DE DADOS 49 Referências Bibliográficas COSTA, Rogério Luís de C. SQL: Guia Prático. Rio de Janeiro: Brasport, 2007. NIELD, Thomas. Introdução à Linguagem SQL: Abordagem prática para iniciantes. São Paulo: Novatec, 2016. XAVIER, Fabrício S. V.; PEREIRA, Leonardo Bruno R. SQL: Dos Conceitos às Consultas Complexas. Rio de Janeiro: Ciência Moderna, 2009.
Compartilhar