Banco de dados_-_volume_4_v10

6,940 views

Published on

2 Comments
7 Likes
Statistics
Notes
No Downloads
Views
Total views
6,940
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
564
Comments
2
Likes
7
Embeds 0
No embeds

No notes for slide

Banco de dados_-_volume_4_v10

  1. 1. UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE) COORDENAÇÃO GERAL DE EDUCAÇÃO A DISTÂNCIA (EAD/UFRPE) Banco de Dados Sandra de Albuquerque Siebra Volume 4 Recife, 2010
  2. 2. Universidade Federal Rural de PernambucoReitor: Prof. Valmar Corrêa de AndradeVice-Reitor: Prof. Reginaldo BarrosPró-Reitor de Administração: Prof. Francisco Fernando Ramos CarvalhoPró-Reitor de Extensão: Prof. Paulo Donizeti SiepierskiPró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José FreirePró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo FerreiraPró-Reitora de Ensino de Graduação: Profª. Maria José de SenaCoordenação Geral de Ensino a Distância: Profª Marizete Silva SantosProdução Gráfica e EditorialCapa e Editoração: Rafael Lira, Italo Amorim e Arlinda TorresRevisão Ortográfica: Elias VieiraIlustrações: Mário FrançaCoordenação de Produção: Marizete Silva Santos
  3. 3. Sumário Apresentação................................................................................................................. 4 Conhecendo o Volume 4 ................................................................................................ 5 Capítulo 10 – Álgebra e Cálculo Relacional ..................................................................... 7 Álgebra Relacional ...........................................................................................................7 Álgebra Relacional: Operadores de Tabelas ..................................................................11 Capítulo 11 – Criando e Mantendo um Banco de Dados ............................................... 26 A SQL .............................................................................................................................26 Capítulo 12 – Consultas em Banco de Dados Relacionais .............................................. 39 Inserindo Dados em Tabelas ..........................................................................................39 Considerações Finais .................................................................................................... 74 Conheça a Autora ........................................................................................................ 76
  4. 4. Apresentação Caro(a) cursista, Seja bem-vindo(a) ao quarto módulo do curso Banco de Dados! Neste quarto módulo, vamos aprender a manipular um SGBD de forma a criar, manter e consultar o bancode dados que você antes aprendeu a modelar. Para fazer isso, estudaremos principalmente a linguagem SQL,presente em todos os banco de dados relacionais e de grande utilidade no acesso a eles. Adicionalmente, estudaremos um pouco de álgebra relacional e cálculo relacional que são formas derepresentar matematicamente as operações que podem ser aplicadas a um Banco de Dados. Bons estudos! Sandra de Albuquerque Siebra Autora4
  5. 5. Banco de DadosConhecendo o Volume 4 Neste quarto volume, você irá encontrar o Módulo 4 da disciplina de Banco deDados. Para facilitar seus estudos, veja a organização deste quarto módulo. Módulo 4 – Criação, Manutenção e Consulta a Banco de Dados Carga horária do Módulo 4: 15 h/aula Objetivo do Módulo 4: » Introduzir os principais conceitos referentes a álgebra relacional e o cáclulo relacional como formas de manipulação e consulta a BD. » Examinar os principais comandos em SQL para criação e manutenção de banco de dados. » Examinar os principais comandos em SQL para consultas simples e aninhadas a banco de dados. Conteúdo Programático do Módulo 4: » Álgebra Relacional. » Cálculo Relacional de Tupla e Cálculo Relacional de Domínio. » SQL – Conceitos básicos, comandos para criação e atualização do banco de dados. » SQL - Consultas básicas e Consultas Aninhadas. 5
  6. 6. Banco de Dados Capítulo 10 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar os seguintes temas: » Álgebra Relacional. » Cálculo Relacional de Tupla. » Cálculo Relacional de Domínio. Metas Após o estudo deste capítulo, esperamos que você: » Compreenda o que é álgebra relacional e cálculo relacional. » Consiga diferenciar o cálculo relacional de tupla e de domínio. » Consiga fazer uso de alguns comandos da álgebra relacional.6
  7. 7. Banco de DadosCapítulo 10 – Álgebra e CálculoRelacional Vamos conversar sobre o assunto? Até aqui, já estudamos como modelar e otimizar nosso modelo para um banco dedados relacional. Um modelo relacional representa o banco de dados como um conjuntode relações. Uma relação pode ser pensada como uma tabela de valores, onde cadalinha na tabela representa uma coleção de valores de dados relacionados. Para acessare manipular esses valores há duas categorias de linguagens que podem ser utilizadas: aslinguagens formais (a álgebra relacional e o cálculo relacional) e as linguagens comerciais,que são baseadas nas linguagens formais (tal como a SQL – Structured Query Language). Aslinguagens formais são justamente as que daremos uma olhada nesse capítulo e uma daslinguagens comerciais mais utilizadas (a SQL) será assunto dos dois capítulos finais dessevolume. Neste capítulo, vamos estudar as linguagens formais para consulta e manipulaçãodos dados em um banco de dados: a álgebra relacional e o cálculo relacional.Álgebra Relacional A Álgebra Relacional é uma linguagem de consulta formal, porém procedimental(procedural), ou seja, o usuário dá as instruções ao sistema para que o mesmo realize umasequência de operações na base de dados para calcular o resultado desejado. Ela consistede um conjunto de operações que têm como entrada uma ou duas relações e produzem,como resultado, uma nova relação. Os operadores da álgebra relacional podem ser divididos em dois grupos: » Operadores de Conjuntos: são operadores típicos definidos pela álgebra para conjunto, tais como união, interseção, diferença e produto cartesiano. As operações com esses operadores se aplicam a duas relações que obedeçam à “compatibilidade de união”, ou seja, ambas as relações devem apresentar atributos que pertençam respectivamente aos mesmos domínios. » Operadores de Tabelas: são operadores definidos especialmente para a manipulação de tuplas, em bases de dados relacionais tais como: Select, Project e Join, entre outras. As operações com esses operadores se aplicam a quaisquer relações. Esses operadores serão detalhados nas seções a seguir. Observação As linguagens disponíveis para acesso a BDs relacionais, inclusive o SQL, não utilizam os mesmos operadores ou nomes definidos pela álgebra relacional. Entretanto todos, ou quase todos, os operadores da álgebra relacional podem ser escritos usando estas linguagens. 7
  8. 8. Banco de Dados Álgebra Relacional: Operadores de Conjuntos São operadores binários e para utilizá-los, é preciso se assegurar de que as duas relações envolvidas nas operações tenham o mesmo tipo de tuplas, ou seja, pertençam ao mesmo domínio. Essa condição é chamada união compatível. Em outras palavras, duas relações R1 (A1, A2,..., An) e R2 (B1, B2, ..., Bn) são união compatível se elas tiverem o mesmo grau n, e dom(Ai) = dom(Bi) para 1 ≤ i ≤ n. Isso significa que as duas relações têm o mesmo número de atributos e que cada par de atributos correspondentes pertence ao mesmo domínio. Pode-se definir as operações de união, interseção, diferença e produto cartesiano sobre duas relações que sejam união compatível R1 e R2. Resumidamente: » União (R1 ∪ R2) - todas as tuplas de R1 e todas as tuplas de R2, sendo que tuplas duplicadas são eliminadas. » Interseção (R1 ∩ R2) - todas as tuplas comuns a R1 e R2. » Diferença (R1 – R2) - todas as tuplas de R1 que não estão em R2. » Produto Cartesiano (R1 x R2) - combinação das tuplas de R1 com as de R2. Vamos detalhar e exemplificar, a seguir, cada uma dessas operações. Mas, antes, algumas observações sobre essas operações: » As operações de união e interseção são operações comutativas. Ou seja: R1 ∪ R2 = R2 ∪ R1 e R1 ∩ R2 = R2 ∩ R1. » Já a operação de diferença não é comutativa: R - S ≠ S - R. » As operações de união e interseção são binárias, mas podem ser aplicadas a qualquer número de relações e ambas são operações associativas. Assim: R ∪ (S ∪ T) = (R ∪ S) ∪ T e R ∩ (S ∩ T) = (R ∩ S) ∩ T. Considere como base para os exemplos das operações as relações Professor e Aluno representadas pelas Tabelas 1 e 2. Tabela 1 - Relação Professor Tabela 2 - Relação Aluno CPF Nome CPF Nome 1001 Ana Maria 1002 João 1002 João 1116 Mércia 1003 Pedro 1900 Ronaldo União: A ∪ B União é a operação entre duas relações “união compatível” (mesmo número de atributos e com domínio compatível) que gera uma relação resultante contendo todas as tuplas (linhas) das duas relações originais, com eliminação das tuplas duplicadas. Ela é denotada pelo símbolo ∪. Por exemplo, a união das relações Professor e Aluno representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 3.8
  9. 9. Banco de Dados Tabela 3 – Relação Resultante de Professor ∪ Aluno CPF Nome 1001 Ana Maria 1002 João 1003 Pedro 1116 Mércia 1900 RonaldoInterseção: A ∩ B Interseção é a operação entre duas relações “união compatível” que gera umarelação resultante contendo todas as tuplas (linhas) presentes em ambas as relaçõesoriginais. Ela é denotada pelo símbolo ∩. Por exemplo, a interseção das relações Professor eAluno representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 4. Tabela 4 - Relação Resultante de Professor ∩ Aluno CPF Nome 1002 JoãoDiferença: A – B Diferença é a operação entre duas relações “união compatível” que gera uma relaçãoresultante contendo todas as linhas que estão na primeira relação, e que não aparecem nasegunda. Ela é denotada pelo símbolo –. Por exemplo, a diferença das relações Professor eAluno representadas pelas Tabelas 1 e 2 (Professor – Aluno) é a relação representada pelaTabela 5, que contém as tuplas das relação Professor que não estão na relação Aluno. Tabela 5 - Relação Resultante de Professor – Aluno CPF Nome 1001 Ana Maria 1003 Pedro Para mostrar que a operação de diferença não é comutativa, vamos agora fazerAluno – Professor, ou seja, as tuplas que estão na relação Aluno, mas que não estão narelação Professor. Veja pela relação resultante representada na Tabela 6 que os resultadosda diferença, mudando a ordem das relações são diferentes. 9
  10. 10. Banco de Dados Tabela 6 - Relação Resultante de Aluno – Professor CPF Nome 1116 Mércia 1900 Ronaldo Produto Cartesiano: A x B O produto cartesiano combina duas relações gerando uma terceira cujas linhas representam todas as possíveis combinações das linhas (tuplas) das relações originais. Um esquema dessa combinação pode ser vista na Figura 1. Figura 1 - Esquema de combinações do Produto Cartesiano O produto cartesiano é uma operação binária e é representado pelo símbolo X. O formato geral da operação é: relação_1 X relação_2 . Vamos dar um exemplo. Qual seria o resultado do produto cartesiano Cidade x Estado (vide Tabelas 7 e 8)? Tabela 7 - Relação Cidade Tabela 8 - Relação Estado Código Nome UF Região 1 Recife PB Nordeste 2 Manaus AM Norte 3 João Pessoa O resultado seria a relação resultante apresentada na Tabela 9. Veja que esta relação resultante apresenta a combinação de todas as tuplas da relação Cidade, com todas as tuplas da relação Estado.10
  11. 11. Banco de Dados Tabela 9 - Relação Resultante Código Nome UF Região 1 Recife PB Nordeste 2 Natal PB Nordeste 3 João Pessoa PB Nordeste 1 Recife AM Norte 2 Natal AM Norte 3 João Pessoa AM Norte Renomear para diferenciar: O Produto Cartesiano entre duas relações R1 e R2 (R1 x R2) apresenta problemas quando: * As relações têm mesmo nome; * Se se quer fazer o produto de uma relação com ela mesma ou * O produto cartesiano está envolvido com a relação resultante de expressões (que vamos ver o que são daqui a pouco). Isso porque um mesmo nome de atributo pode aparecer tanto em R1 quanto em R2. Por isso, é preciso estabelecer um modo de diferenciar esses atributos na relação resultante. Para isso, pode- se anexar ao atributo o nome da relação a qual ele pertença: nome_relacao.nome_atributo. Por exemplo, se fizéssemos o produto cartesiano entre as relações Professor e Aluno (vide Tabelas 1 e 2), como as duas tabelas possuem atributos de mesmo nome, a relação resultante ficaria com as seguintes colunas: (Professor.CPF, Professor.Nome, Aluno.CPF, Aluno.Nome)Álgebra Relacional: Operadores de Tabelas Os operadores de tabela manipulam tuplas em bases de dados relacionais e podemser aplicados a quaisquer relações. A seguir, descreveremos cada uma das operações.Seleção O operador de seleção é usado para selecionar tuplas que satisfaçam umadeterminada condição. Essas tuplas selecionadas geram uma relação resultante. O esquemada relação resultante é o mesmo da relação original. O operador de seleção é representadopela letra grega sigma (δ) e seu formato geral é: δ condição(tabela ou relação). O operadorda seleção é unário, ou seja, seleciona tuplas de somente uma relação. Vamos dar algunsexemplos a partir da relação Cidade (vide Tabela 10). 11
  12. 12. Banco de Dados Tabela 10 - Relação Cidade Código Nome É_capital UF 1 Recife S PE 2 Natal S RN 3 João Pessoa S PB 4 Patos N PB δ UF = ‘PB’(cidade) daria como resultado a relação da Tabela 11, que atenderia a algo como: selecione da relação cidade, as tuplas cuja UF seja igual ao valor ‘PB’. Tabela 11 - Relação Resultante Código Nome É_capital UF 3 João Pessoa S PB 4 Patos N PB Para especificar as condições da seleção podemos utilizar: valores constantes, nome de atributos (colunas), operadores relacionais (=, <, >, <=, >=, ≠) ou operadores lógicos (and, or, not). Por exemplo, δ UF=’PB’ and E_Capital=’N’(CIDADE) daria como resultado a relação da Tabela 12, que atenderia a algo como: selecione da relação cidade, as tuplas cuja UF seja igual ao valor ‘PB’ e o campo E_Capital tenha o valor ‘N’. Tabela 12 - Relação Resultante Código Nome É_capital UF 4 Patos N PB Vamos a outro exemplo, suponha o esquema de relação Empregado (CPF, Nome, DataNasc, Endereço, Sexo, NumDep, Salario). Agora, suponha que desejamos selecionar os empregados que trabalham no departamento 10 e ganham mais de 1500 ou aqueles que trabalham no departamento 3 e ganham mais que 4000. Como ficaria? δ (NumDep = 10 and salario > 1500) or (NumDep=3 and salario > 4000) (Empregado) A operação de seleção é comutativa, ou seja, uma sequência de seleção pode ser aplicada em qualquer ordem: δ <cond1> (δ <cond2> (Relação)) = δ <cond2> (δ <cond1> (Relação)) Sempre é possível combinar uma propagação de operações de seleção dentro de uma única operação de seleção, fazendo uso de uma condição conjuntiva (AND): δ <cond1> (δ <cond2> (Relação)) = δ <cond1> and <cond2> (Relação) δ <cond1> (δ <cond2> ( ... (δ <condN> (Relação)) ...)) = δ <cond1> AND <cond2> AND ... AND <condN> (Relação)12
  13. 13. Banco de DadosProjeção A operação de projeção é unária e opera sobre uma única relação gerando outrarelação resultante que conterá todas as linhas da relação original, mas apenas as colunas(atributos) que se deseja projetar (e que foram especificadas na operação). Ou seja, retornaparte da relação deixando de fora os atributos que não foram solicitados. Na relaçãoresultante as tuplas (linhas) duplicadas são eliminadas. O formato geral da operação deprojeção é: π A1, A2, …, An (Relação) onde A1, A2, ..., An são nomes de atributos da relação.Vamos dar um exemplo. Tomando como base a relação Cidade (vide Tabela 10), vamossupor que queremos selecionar (projetar) apenas os atributos Nome e UF. Daí precisaríamosda seguinte operação: π Nome, UF (Cidade). A relação resultante dessa projeção seria aapresentada na Tabela 13. Observe que a relação resultante tem todas as tuplas da relaçãooriginal, mas só apresenta os atributos especificados na operação de projeção. Além disso,observe que estes atributos aparecem na mesma ordem em que foram especificados. Tabela 13 - Relação Resultante da Projeção Nome UF Recife PE Natal RN João Pessoa PB Patos PB Na verdade, se observarmos bem, o operador de projeção também serve paraselecionar. Porém, enquanto o operador de SELEÇÃO seleciona tuplas de uma relação, ooperador de PROJEÇÃO seleciona colunas de uma Relação. O número de tuplas na relação resultante sempre será igual ou menor que aquantidade de tuplas na relação original. Isto porque tuplas duplicadas são eliminadas. Porexemplo, observe a seguinte operação de projeção π Nome, UF (Cidade) aplicada à relaçãoCidade (vide Tabela 10). Veja que “PB” aparece apenas uma vez na relação resultante (videTabela 14). Mesmo que ela apareça duas vezes na relação original (Tabela 10). Tabela 14 - Relação Resultante da Projeção UF PE RN PB A operação de projeção não é comutativa. Apenas no caso específico de <lista2>conter os mesmos atributos de <lista1> pode-se observar comutatividade. π <lista_atributos1> (π <lista_atributos2> (Relação)) ≠ π <lista_atributos 2> (π<lista_atributos1> (Relação)) 13
  14. 14. Banco de Dados Combinando Operações Em geral, existe a necessidade de se aplicar várias operações da álgebra relacional uma após a outra. Pode-se escrever essas operações em apenas uma única expressão da álgebra relacional, combinando as operações, usando tanto operadores de conjunto, quanto de tabela. Vamos dar alguns exemplos a seguir. » Tomando como base as relações Professor(CPF, Nome) e Aluno (CPF, Nome) - vide Tabelas 1 e 2 – se desejássemos encontrar o nome de todos os professores que também são alunos, poderíamos usar a expressão: Π nome(Professor) ∩ Π nome(Aluno) » A partir da relação Empregado (CPF, Nome, Sexo, Salario, Num_Dep), vide Tabela 15, selecione o nome e o salário de todos os empregados que trabalhem no departamento de número 4. Para isso, poderíamos usar a expressão: Π nome, salario (δ Num_Dep=4(Empregado)) Isso daria origem a tabela 16. Tabela 15 - Relação Empregado CPF Nome Sexo Salario Num_Dep 1234 Ana Gomes F 1500 2 2345 Pedro Nunes M 1000 4 3765 Maria Lima F 2000 2 4987 Igor Matos M 3500 5 9876 Laís Ramos F 3000 4 Tabela 16 - Relação Resultante Nome Salario Pedro Nunes 1000 Laís Ramos 3000 Tabela 17 - Relação Gerente CPF Nome Sexo Salario Num_Dep 5678 João Teixeira M 1800 2 2345 Pedro Nunes M 1000 4 » A partir da relação Empregado (Tabela 15) e da relação Gerente (Tabela 17), encontre o nome de todos os empregados que não são gerentes. Para isso, poderíamos usar a expressão: Π nome (Empregado) - Π nome (Gerente)14
  15. 15. Banco de Dados Outra forma de combinar operações é aplicar uma única operação por vez e criarrelações intermediárias. Neste caso, é preciso dar nomes às relações intermediárias. Porexemplo, vamos tomar o exemplo anteriormente visto de tomar a relação Empregado comobase (Tabela 15) e dela recuperar o nome e o salário de todos os empregados que trabalhamno departamento 4. Já apresentamos como fazer isso com uma única expressão. Agora,alternativamente, seria possível explicitar a sequência de operações, dando um nome paracada relação intermediária: Empregados_Dep4 ← ß δ Num_Dep=4(Empregado) Π nome, salario (Empregados_Dep4)Junção O operador de junção combina as linhas de duas tabelas (relações) segundo uma oumais condições. A condição de junção deve ser baseada em uma ou mais colunas (atributos)de cada uma das tabelas cujos valores compartilhem um domínio comum. As linhas dastabelas serão combinadas sempre que a condição de junção for verdadeira. (geralmentea condição é uma igualdade entre atributos equivalentes). O join é representado pelooperador binário |x| e o formato geral de utilização é: Relação1 |x| <condição de junção>Relação2. Por exemplo, Cidade |x| cidade.UF = Estado.UF Estado. Vai combinar os valoresdas relações Cidade (Tabela 18) e Estado (Tabela 19), de acordo com a igualdade do atributocomum às duas relações: a UF. Dessa forma, seria gerada a relação representada na Tabela20. Veja que a primeira tupla da relação Cidade (vide Tabela 18) não faz parte da relaçãoresultante, por que ela não tem equivalente na relação Estado (já que está sendo feita aigualdade com base no atributo UF). Ou seja, tuplas cujos atributos de junção são nulos nãoaparecem na relação resultante. Tabela 18 - Relação Cidade Código Nome Sexo 1 Recife PE 2 Manaus AM 3 João Pessoa PB Tabela 19 - Relação Estado UF Região PB Nordeste AM Norte Tabela 20 - Relação Resultante Código Nome Cidade.UF Estado.UF Região 2 Manaus AM AM Norte 3 João Pessoa PB PB Nordeste 15
  16. 16. Banco de Dados Quando a condição de uma junção é a igualdade, a junção é chamada de equijoin. O equijoin gera duas colunas idênticas na relação resultante (vide as colunas UF na Tabela 20). Uma Junção Natural é um equijoin onde uma das colunas idênticas é eliminada. Como assim? O operador de junção natural combina as linhas de duas tabelas que tem atributos comuns (mesmo nome), resultando numa tabela que contém apenas as linhas onde todos os atributos comuns apresentam o mesmo valor. Na relação resultante, uma das colunas idênticas é eliminada, evitando a duplicidade. A junção natural equivale a uma seleção precedida de um produto cartesiano. Assim: Cidade |x| cidade.UF = Estado.UF Estado é equivalente a δ cidade.UF = Estado.UF (Cidade x Estado) Se duas relações envolvidas em uma junção natural não têm atributos em comum, então a junção natural produz um resultado igual ao produzido pelo produto cartesiano. » EQUIJOIN: junção onde somente operadores de comparação “=“ são utilizados. Gera colunas idênticas. » JUNÇÃO NATURAL: requer que os dois atributos de junção tenha o mesmo nome em ambas as relações. Nesse tipo de join outras condições podem ser utilizadas além da igualdade. A relação resultante não gera nenhuma duplicidade. Cálculo Relacional O Cálculo Relacional (CR) é uma linguagem de consulta formal. Utilizando-se de uma expressão declarativa pode-se especificar uma consulta. Uma expressão de cálculo permite a descrição da consulta desejada sem especificar os procedimentos para obtenção dessas informações, ou seja, é não-procedural. Contudo, tal consulta deve ser capaz de descrever formalmente a informação desejada, com exatidão. No Cálculo Relacional existem variáveis, constantes, operadores lógicos, de comparação e quantificadores. As expressões de Cálculo são chamadas de fórmulas. Uma tupla de respostas é essencialmente uma atribuição de constantes às variáveis que levam a fórmula a um estado verdadeiro. Existem dois tipos de cálculo relacional: Cálculo Relacional de Tuplas (CRT) e Cálculo Relacional de Domínio (CRD), ambos subconjuntos simples de lógica de primeira ordem. No CRT, as variáveis são definidas sobre (isto é, associam) tuplas. Já em CRD, variáveis são definidas sobre o domínio dos elementos (ou seja, sobre os valores dos campos). Como o cálculo relacional é pouco utilizado, vamos apenas apresentar algumas definições e exemplos, a título informativo, de cada um dos tipos de cálculo. Adicionalmente, é importante saber que todas as expressões de consulta descritas no Cálculo Relacional possuem equivalentes em Álgebra Relacional, que é mais utilizada e possui mais ferramentas para dar suporte a construção de suas expressões. Cálculo Relacional de Tupla O Cálculo Relacional de Tupla (CRT) é baseado na especificação de um número de variáveis de tuplas. Cada variável de tupla pode assumir como seu valor qualquer tupla da relação especificada. Uma consulta em CRT é especificada da seguinte forma: {variável tupla | predicado} ou { t | P(t) } que significa o conjunto de todas as tuplas16
  17. 17. Banco de Dadost, tal que o predicado P seja verdadeiro para t. E temos que t é uma variável de tuplas. P éuma expressão condicional e t.A ou t[A] denota o valor do atributo A da tupla t. O resultadode tal consulta é o conjunto de todas as variáveis tuplas para as quais o predicado é indicadocomo verdadeiro. Uma expressão genérica do cálculo relacional de tuplas tem a forma: {t1.A1, t2.A2, ..., tn.An | predicado(t1, t2, ..., tn, tn+1, tn+2, ..., tn+m)} Onde: t1, t2, ..., tn, tn+1, tn+2, ..., tn+m são variáveis de tuplas, cada Ai é umatributo da relação na qual ti se encontra e o predicado é uma fórmula do cálculo relacionalde tuplas. Uma fórmula é definida, de forma recursiva, por uma ou mais fórmulas atômicas.Essas fórmulas podem ser conectadas por operadores lógicos (AND, OR ou NOT), comosegue: » Se F1 e F2 são fórmulas atômicas, então (F1 AND F2), (F1 OR F2), NOT (F1) e NOT (F2) também o são, tendo seus valores verdade derivados a partir de F1 e F2. Relembrando... (F1 AND F2) será TRUE apenas se ambos, F1 e F2, forem TRUE; (F1 OR F2) será TRUE quando uma das duas fórmulas F1 e F2, for TRUE; NOT(F1) será TRUE quando F1 for FALSE; NOT(F2) será TRUE quando F2 for FALSE. » Se F1 é uma fórmula atômica, então (Ǝ t)(F1) também o é, e seu valor verdade apenas será TRUE se a fórmula F for avaliada como verdadeira para pelo menos uma tupla atribuída para ocorrências livres de t (que é uma variável de tupla) em F. » Se F1 é uma fórmula atômica, então (∀ t)(F1) também o é, e seu valor verdade apenas será TRUE se a fórmula F for avaliada como verdadeira para todas as tuplas atribuídas para ocorrências livres de t em F. Adicionalmente, temos: » Uma fórmula atômica ti.A op tj.B, onde op é um dos operadores de comparação no conjunto {=, >, <, ≠, >=, <=}, ti e tj são variáveis de tuplas, A é um atributo da relação na qual ti se encontra, B é um atributo da relação na qual tj se encontra. » Uma fórmula atômica ti.A op c ou c op tj.B, onde op é um dos operadores de comparação no conjunto {=, >, <, ≠, >=, <=}, ti e tj são variáveis de tuplas, A é um atributo da relação na qual ti se encontra, B é um atributo da relação na qual tj se encontra e c é um valor constante. Nos dois casos acima, se as variáveis de tupla forem designadas de forma queos valores dos atributos especificados satisfaçam o predicado, a fórmula assumirá valorverdade TRUE. Cada uma das fórmulas atômicas anteriormente especificadas tem seu valorverdade avaliado como TRUE ou FALSE para uma combinação específica de tuplas. 17
  18. 18. Banco de Dados Todas as variáveis tuplas abordadas são consideradas variáveis livres (elas aparecem em uma expressão de cálculo relacional à esquerda da barra |), uma vez que estas não aparecem quantificadas. Porém, quando quantificadores (universal (∀) ou existencial (Ǝ)) aparecem nas fórmulas, as variáveis que os sucedem são denominadas variáveis limite. Tabela 21 - Relação Empregado CPF Nome Sexo Salario Cod_Depto 1234 Ana Gomes F 1500 2 2345 Pedro Nunes M 1000 4 3765 Maria Lima F 2000 2 4987 Igor Matos M 3500 5 9876 Laís Ramos F 3000 4 Tabela 22 - Relação Departamento Cod Descricao 2 Vendas 4 Suporte 5 Gerência Vamos dar alguns exemplos para ilustrar. Tomando como base a relação Empregado (vide Tabela 21) e a relação Departamento (vide Tabela 22), suponha as seguintes consultas e como elas ficariam representadas em cálculo relacional de tupla. » Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t | EMPREGADO(t) AND t.SALARIO > 3000 }. Analisando a expressão podemos lê-la da seguinte forma: considere uma tupla t, ela deve ser uma tupla da relação empregado, cujo atributo salário dessa tupla deve ser maior que 3000. EMPREGADO(t) é o mesmo que dizer que t ∈ EMPREGADO. A consulta acima resulta em uma relação que contém todas as tuplas t da relação EMPREGADO que satisfazem a condição (no caso, salário > 3000). No CRT especificamos primeiro os atributos desejados. Se for usado apenas o t, sem especificação de atributos, todos os atributos da tupla são recuperados. Logo, na consulta acima, seriam recuperados os atributos CPF, Nome, Sexo, Salario e Cod_Depto (vide Tabela 21). Agora, suponha que gostaríamos de recuperar apenas os atributos CPF e Nome das tuplas que atendessem a condição. Como faríamos? { t.CPF, t.Nome | EMPREGADO(t) AND t.SALARIO > 3000 }. Observe que os atributos desejados são especificados do lado esquerdo da barra (|). » Vamos a outro exemplo. Obtenha o nome e o salário dos empregados que trabalham para o departamento de Suporte. {t.NOME, t.SALARIO | EMPREGADO(t) AND (Ǝ d) (DEPARTAMENTO (d) AND18
  19. 19. Banco de Dados d.DESCRICAO = ‘Suporte’ AND d.COD = t.COD_DEPTO)} Analisando a expressão podemos lê-la da seguinte forma: obtenha o nome e o salário de todas as tuplas da relação empregado e exista um departamento d, cuja descrição seja ‘Suporte’ e o código desse departamento de nome ‘Suporte’ seja igual ao código do departamento da tupla sendo avaliada na relação Empregado. Vamos exemplificar agora o quanto o CRT pode ser representado facilmente poruma expressão da álgebra relacional, levando em conta a relação Empregado (Tabela 21). » Recupere o CPF e o nome de todos os empregados. Em CRT: { t.CPF, t.Nome | EMPREGADO(t) } Em Álgebra Relacional: π CPF, Nome (Empregado) » Recupere todos os empregados do sexo masculino Em CRT: { t | EMPREGADO(t) AND t.SEXO = ‘M’ } Em Álgebra Relacional: δ Sexo = ‘M’ (Empregado)Cálculo Relacional de Domínio (CRD) Trata-se de uma segunda forma de cálculo relacional, equivalente ao CRT. Essaforma usa variáveis de domínio que tomam valores do domínio de um atributo, em vez devalores da tupla inteira. Uma expressão neste cálculo tem a forma: { <x1, x2, ... , xn > | Predicado (x1, x2, ..., xn) } onde x1, x2, ..., xn representam variáveis de domínio e Predicado representa umafórmula composta de átomos, como no cálculo relacional de tupla. A diferença básica entre CRT e CRD é que neste último as variáveis estendem-sesobre valores únicos de domínios de atributos. Para formar uma relação de grau n paraum resultado de consulta, faz-se necessário criar n variáveis de domínio, uma para cadaatributo. Como em CRT, as fórmulas são avaliadas em valores verdade para um conjuntoespecífico de valores. A seguir, para fins de comparação e para ilustrar o CRD, seguem em CRD os mesmosexemplos de consultas já escritos em CRT. Tabela 23 - Relação Empregado a b c d e CPF Nome Sexo Salario Cod_Depto 1234 Ana Gomes F 1500 2 2345 Pedro Nunes M 1000 4 3765 Maria Lima F 2000 2 4987 Igor Matos M 3500 5 9876 Laís Ramos F 3000 4 19
  20. 20. Banco de Dados Tabela 24 - Relação Departamento m n Cod Descricao 2 Vendas 4 Suporte 5 Gerência Tomando como base as tabelas 23 e 24 que representam, respectivamente, as relações Empregado e Departamento (note que cada coluna dessas relações recebeu uma letra para referenciar o domíno do atributo representado por cada coluna), podemos Comentário realizar as seguintes consultas: » Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t |1 Observe que as letras EMPREGADO(t) AND t.SALARIO > 3000 }.à esquerda da barra(|) representam o { abcde1 | (Ǝ d2) EMPREGADO(abcde) AND d > 3000 }domíno dos atributosdesejados (vide » Se na consulta anterior quiséssemos recuperar apenas o CPF e o nome dosTabela 23), como empregados, teríamos:conseqüência, elesreferenciam as colunas { ab | (Ǝ d) EMPREGADO(abcde) AND d > 3000 }desejadas. » Obtenha o nome e o salário dos empregados que trabalham para o departamento de Suporte. Comentário { bd | (Ǝ e) (Ǝ m)(Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = ‘Suporte’ AND m = e) }2 Somente énecessário quantificaras variáveis que Considerações Finaisparticipam de umacondição. A álgebra relacional é uma forma de cálculo sobre conjuntos ou relações. UmaOu seja, só usamos o aplicação prática da álgebra relacional é na execução de consultas a bancos de dadosoperador existencial Ǝna variável de domínio relacionais. A álgebra relacional recebia pouca atenção até a publicação do modelod, porque apenas essa relacional de dados de E.F Codd, em 1970. Codd propôs tal álgebra como uma base paravariável é usada na linguagens de consulta em banco de dados. As operações da álgebra relacional podem sercondição expressa no resumidas de forma ilustrada na Figura 2.predicado (d > 3000) 20
  21. 21. Banco de Dados Figura 2 - Resumo das Operações da Álgebra Relacional O Cálculo Relacional é uma linguagem formal, não-procedural, para consulta arelações. A álgebra relacional tem poder de expressão essencialmente equivalente ao docálculo relacional, esse resultado é conhecido como teorema de Codd. Em geral, a álgebrarelacional é bem mais utilizada do que o cálculo relacional. Conheça Mais Para obter mais informações sobre o assunto estudado nesse capítulo você podeconsultar qualquer um dos livros listados a seguir. Todos eles possuem capítulos dedicados aÁlgebra Relacional e o Cálculo Relacional (de Tupla e de Domínio): KORTH, Henry F; SILBERSCHATZ, Abraham; SUDARSHAN, S. Sistema de banco de dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006. ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São Paulo: Pearson Education do Brasil, 2005. DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus, 2000. ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004. 21
  22. 22. Banco de Dados Você Sabia? O Cálculo relacional dependendo do autor pode ter sua notação ligeiramente modificada. A notação que fizemos uso nesse capítulo é a notação de Navathe (ELMASRI e NAVATHE, 2005). Porém, existe também a notação de Korth (KORTH, SILBERSCHATZ e SUDARSHAN, 2006). Para ilustrar as diferenças, vamos repetir a mesma consulta anteriormente realizada: » Obtenha o nome e o salário dos empregados que trabalham para o departamento de Suporte. Na notação de Navathe, que já utilizamos, ficaria: {bd | (Ǝ e) (Ǝ m) (Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = ‘Suporte’ AND m = e)} Já na notação de Korth, a mesma sentença ficaria da seguinte forma: {<b, d> | <b, d> � empregado ∧ departamento(mn) ∧ n = “Suporte” ∧ m = e)} Veja que o formato geral da expressão muda um pouco, mas o que muda mesmo é a simbologia dos operadores lógicos: AND (∧), OR (∨), NOT (¬), a forma de expressar as variáveis de tupla (observe o começo das duas expressões e veja a diferença) e ao invés de aspas simples em constantes, usa-se aspas duplas. Aprenda Praticando Como a álgebra relacional é mais utilizada, vamos avaliar alguns exercícios resolvidos para que, logo depois, você possa resolver os seus exercícios sozinho. 1) Tome como base os esquemas das tabelas 25 e 26 e mostre como ficariam as consultas, a seguir, em álgebra relacional. Tabela 25 - Relação Devedor Nome Num_Emprestimo Sexo Ana Gomes 01 F Pedro Nunes 03 M Maria Lima 05 F Tabela 26 - Relação Empréstimo Agencia Num_Emprestimo Valor 3456 01 1500 2123 03 5000 2123 05 2500 Em geral, na realização de consultas as operações mais utilizadas são a projeção (representada pelo símbolo π) que seleciona quais colunas (atributos) se deseja na relação resultante e a seleção (representada pelo símbolo δ) que seleciona quais tuplas da relação atendem a uma determinada condição. Se a projeção não for utilizada, todos os atributos da relação original farão parte da relação resultante. Quando necessitamos de dados que estão22
  23. 23. Banco de Dadosem duas relações diferentes, devemos utilizar a operação de junção |x|. » Apresentar os dados de todos os devedores do sexo feminino. Cada vez que desejamos selecionar tuplas da relação de acordo com uma determinada condição, usamos a seleção. δ sexo = ‘F’ (devedor) » Apresentar o nome e o número do emprestimo de todos os devedores do sexo masculino. Como é especificado o que deve ser mostrado – nome e número empréstimo – é necessário usar a projeção antes da seleção) π nome,num_emprestimo (δ sexo = ‘M’ (devedor)) » Mostrar o nome das pessoas que possuem empréstimo acima de três mil reais na agência 2123. Como o nome da pessoa está na relação devedor e o valor do empréstimo na relação empréstimo, é necessário fazer a junção dessas duas relações, para ser possível selecionar o que foi pedido. A junção é feita equiparando os atributos que as relações têm em comum. π nome (δ valor > 3000 and agencia = 2123 (Devedor |x| devedor.num_emprestimo = empréstimo.num_emprestimo Emprestimo)) » Apresentar as pessoas cujo número do empréstimo é igual a 5 e o número da agência é igual a 2123 ou que o número do empréstimo seja igual a 3 e o valor do empréstimo maior do que 1000 reais. É um caso de seleção onde é necessário usar operadores lógicos para montar as condições. δ (num_emprestimo = 5 and agencia = 2123) or (num_emprestimo = 3 and valor > 1000) (Emprestimo)) Atividades e Orientações de Estudo Agora vamos exercitar o que foi estudado neste capítulo. Assim sendo, faça asatividades sugeridas a seguir. Lembre que exercitar vai lhe ajudar a fixar melhor o conteúdoestudado. Mãos à obra! Atividades Práticas Dica 3 No Word, a simbologia usada na Responda as questões a seguir em um documento de texto (doc)3 e poste as álgebra relacionalrespostas no ambiente virtual, no local indicado. Esse trabalho deve ser feito em DUPLA. pode ser inserida no documento através Especifique usando a álgebra relacional as consultas a seguir, tomando como base do seguinte caminho:as relações cujos esquemas estão representados a seguir. Inserir -> Símbolo, fazendo uso da fonte Symbol (daí você EMPREGADO escolhe na tabela que é apresentada o CPF (PK) Nome DtNasc Endereco Sexo Salario Cod_Dep (FK) símbolo apropriado) 23
  24. 24. Banco de Dados DEPARTAMENTO Cod_Dep (PK) Descricao CPF_Gerente (FK) Dt_Inicio_Gerencia PROJETO Cod_Proj (PK) Nome_Proj Cod_Dep (FK) ALOCACAO CPF (PK) Cod_Proj (PK) Horas DEPENDENTE CPF (PK) Nome_Depen Sexo Parentesco a) Recuperar os nomes de empregados do departamento 6 que trabalham mais que 20 horas no projeto chamado ‘Star Project’. b) Listar os nomes dos empregados que tenham um dependente com o mesmo nome deles. c) Recuperar os códigos e os nomes dos projetos do departamento de nome “Pesquisa”. d) Listar o nome do projeto, do departamento ao qual ele pertence e o nome dos empregados deles. e) Recuperar os nomes dos empregados que trabalham em todos os projetos. f) Recuperar os nomes dos empregados que não trabalham em quaisquer projetos. h) Recuperar o nome e o sexo de todos os dependentes do empregado de CPF de número 12345. i) Recuperar o nome e a quantidade de horas trabalhadas por cada empregado em cada projeto do qual faz parte. Vamos Revisar? Você estudou, neste capítulo, formas de acessar e manipular os dados armazenados em um banco de dados, fazendo uso de linguagens formais tais como a álgebra relacional e o cálculo relacional (tanto de tupla, quanto de domíno). A maneira de raciocionar fazendo uso dessas linguagens irá facilitar a compreensão do uso da linguagem comercial a ser estudada nos capítulos seguintes: a SQL. Até lá!24
  25. 25. Banco de Dados Capítulo 11 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar os seguintes temas:» A Linguagem SQL.» Subdivisões da SQL.» Como criar um Banco de Dados usando SQL. Metas Após o estudo deste capítulo, esperamos que você:» Conheça a linguagem SQL.» Conheça as subdivisões da linguagem.» Consiga criar e manter a estrutura de um banco de dados usando SQL.» Consiga criar índices para um banco de dados. 25
  26. 26. Banco de Dados Capítulo 11 – Criando e Mantendo um Banco de Dados Vamos conversar sobre o assunto? “No capítulo anterior vimos linguagens formais para consulta a banco de dados relacionais. Porém, na área comercial, essas linguagens não são muito utilizadas, ao invés delas, são usadas linguagens comerciais para criação, manutenção e consulta a banco de dados. Entre essas linguagens, a SQL (Structured Query Language) é a mais utilizada. Por isso mesmo, a interface SQL é implementada em todos os sistemas de bancos de dados relacionais existentes. É justamente sobre a SQL que estudaremos nesse capítulo e no capítulo seguinte.” Neste capítulo, começaremos estudando a linguagem comercial SQL, com o objetivo de ter um conhecimento geral sobre a linguagem e criar e manter esquemas de bancos de dados relacionais. Adicionalmente, também apresentaremos como criar índices para esses esquemas. Vamos lá? A SQL SQL ou Structured Query Language (Linguagem de Consulta Estruturada) é uma linguagem de consulta declarativa, não-procedural, fundamentada na álgebra e no cálculo relacional de tupla. Apesar de ser chamada linguagem de consulta (Query), ela não é apenas de consulta, ela inclui comandos para definição, manutenção e consulta em bancos de dados relacionais. Além disso, ela define mecanismos para criação de visões, especificações de segurança, autorizações, definições de restrições e controle de transações. Adicionalmente, ela possui regras para embutir os comandos SQL em linguagens de programação genéricas como Java, PHP, C# ou C/C++. A SQL foi desenvolvida pelo laboratório da IBM, nos anos 70, como parte do sistema System R (o primeiro SGBD relacional). Ela foi, inicialmente, chamada de SEQUEL (Structured English Query Language), mas teve seu nome alterado para SQL por razões Jurídicas. Em 1986, em um esforço conjunto da ANSI (American Nacional Standars Institute) e da ISO (International Standards Organization) criou-se a primeira versão padrão da SQL, a SQL-86 (SQL1), substituída posteriormente pela SQL-92 (SQL2) e depois pela SQL-99 (SQL3). O atual projeto da SQL é o padrão 200n. A SQL padrão é suportada por todos os SGBDs relacionais comerciais. Porém, mesmo padronizada, existem variações, ou seja, cada fornecedor pode incluir comandos próprios na SQL utilizada pelo seu SGBD. Em outras palavras, cada implementação do SQL de cada fornecedor possui os comandos do SQL padrão (também chamado SQL ANSI) e, também, algumas adaptações para resolver certas particularidades. Para conhecer o conjunto completo de comandos SQL de um determinado fornecedor (ex: Oracle), recomendamos a leitura do manual do fabricante. A vantagem de fazer uso apenas do SQL padrão é não ter problemas com migração de SGBD para SGBD. Por exemplo, se você fazia uso de SQL Server e, depois, migrou para o uso do Oracle, se fez uso apenas do SQL padrão,26
  27. 27. Banco de Dadosnão haverá problemas ou necessidade de adaptações. O SQL usado nesta disciplina será o baseado no Padrão ANSI e nenhumacaracterística específica de SGBD será abordada. Dessa forma, para praticar os comandos deSQL aqui ensinados, você poderá fazer uso de qualquer SGBD comercial.Subdivisão da SQL A SQL é composta por grupos de instruções que são utilizadas no processo deadministração e controle de bancos de dados. Esses grupos serão descritos a seguir (videFigura 3). » DDL (Data Definition Language - Linguagem de Definição de Dados) - as instruções do tipo DDL permitem efetuar a criação das estruturas (esquemas) de tabelas (relações) onde os dados serão armazenados, índices e os bancos de dados como um todo. Permitem também efetuar alterações nas estruturas criadas, bem como remover estruturas existentes. Neste grupo estão as instruções: CREATE TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX e DROP INDEX. O resultado da compilação dos parâmetros/comandos DDL geram os dicionários de dados (arquivo de metadados). Adicionalmente, a DDL inclui comandos para definição de visões e para especificação de direitos de acesso às relações/visões. Figura 3 - Subdivisões da SQL » DML (Data Manipulation Language - Linguagem de Manipulação de Dados) - as instruções do tipo DML permitem efetuar a manipulação dos dados que estejam armazenados nas tabelas de um determinado banco de dados. Desta forma é possível cadastrar, alterar e excluir registros (tuplas) existentes. Neste grupo encontram-se as instruções: INSERT, SELECT, UPDATE e DELETE. De todos os comandos existentes, o comando SELECT é o mais importante e utilizado, pois é com ele que se obtém a extração de informações a partir do banco de dados. » DCL (Data Control Language - Linguagem de Controle de Dados) – as instruções do tipo DCL permitem controlar o acesso e os privilégios dos usuários às relações e visões, protegendo os dados de manipulações não autorizadas; » TML (Transactions Manipulation Language - Linguagem de Manipulação de Transações) – as intruções do tipo TML especificam as transações através de comandos de iniciação e finalização das mesmas, garantindo o compartilhamento e a integridade dos dados. 27
  28. 28. Banco de Dados Nesta disciplina apenas abordaremos a DDL e a DML. Tipos de Dados Antes de entrar nos comandos propiamente ditos da SQL, vale a pena comentar sobre tipos de dados. Para definir os atributos das tabelas, precisamos definir os domínios de cada um deles. Isso é feito através da especificação do tipo do dado. Nesse ponto é importante ressaltar que cada SGBD tem um conjunto próprio de tipos de dados. Mas, podemos dizer que, genericamente, vamos encontrar na maioria dos SGBDs tipos como: » Char(X): Para dados caracteres, onde X é o tamanho máximo permitido de caracteres e esse tamanho é fixo. Ou seja, se for especificado, por exemplo, um tamanho de 50 caracteres, sempre será ocupado na memória 50 posições, independente da palavra sendo armazenada. » Varchar(X): Idem o anterior, mas o tamanho armazenado é variável. Se ocupará memória apenas para o que for digitado, tendo o X apenas como referência para tamanho máximo. » Integer : Para dados numéricos inteiros positivos ou negativos » Decimal(X,Y): Pada dados numéricos decimais, onde X é o tamanho máximo permitido da parte inteira e Y é o tamanho máximo da parte fracionária » Date: Para datas. Seu formato depende do SGBD relacional. E cada SGBD pode ter um tipo diferenciado para armazenamento de datas. » Logical: Para os valores lógicos TRUE ou FALSE. Comandos SQL para Definição de Dados (DDL) A DDL serve para expressar a especificação do esquema do BD. O resultado da compilação dos parâmetros DDLs é um conjunto de tabelas que são armazenadas em um arquivo especial chamado dicionário de dados4. Comentário Os comandos SQL para definição de dados são: CREATE, DROP e ALTER. Vamos dar uma olhada em cada um desses comandos, a seguir e, para exemplificar o uso deles,4 Relembrando: o vamos tomar a modelagem da Figura 4 como base. Nela temos especificado o MER paraDicionário de Dados uma Editora.é um arquivo demetadados (dados arespeito de dados)no SGBD. Ou seja, elecontém a semânticados dados do BD (oque eles significam). Figura 4 - Modelo base para exemplos O MR para este diagrama é o seguinte (baseado nas regras de conversão do MER para o MR, anteriormente vistas): 28
  29. 29. Banco de Dados AUTOR (CodAutor (PK), Nome, Nascimento) LIVRO (TitLivro (PK), CodAutor (FK), CodEditora (FK), Valor,Publicacao, Volume, Idioma) EDITORA (CodEditora (PK), Razao, Endereco, Cidade)DDL - Criando Tabelas O comando CREATE TABLE especifica uma nova tabela (relação), dando o seu nomee especificando as colunas (atributos), cada uma com seu nome, tipo e restrições iniciais. A forma geral do comando é: create table nome_tabela. Por exemplo: create tableEmpregado. Porém, a sintaxe completa do comando é bem mais detalhada: CREATE TABLE Nome_Tabela ( Nome_Atributo1 Tipo [(Tamanho)] [NOT NULL] [DEFAULT valor] [...], [,Nome_Atributo2 Tipo [(Tamanho)] [NOT NULL] [DEFAULT valor] [...], [PRIMARY KEY (Primária1[, Primária2 [, ...]])] [UNIQUE (Candidata1[, Candidata2[, ...]])] [FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES TabelaExterna [(AtributoExterno1 [, AtributoExterno2 [, ...]])] [CHECK (condição)] ) Onde : ( ) Indica parte da sintaxe do comando e [ ] Indica opcionalidade do comando.Vamos explicar agora cada parte do comando completo. Nome_Atributo - nome do atributo que está sendo definido Tipo: domínio do atributo ou seja o tipo do dado do atributo. Tamanho : alguns tipos de dados necessitam de especificação do tamanho do dado.Por exemplo, o tipo CHAR NOT NULL: expressa que o atributo não pode receber valores nulos DEFAULT valor: indica um valor a ser atribuído ao atributo caso não sejadeterminado um valor durante a inserção PRIMARY KEY (Primária1, Primária2, ...) – serve para especificar a(s) chave(s)primária(s) da tabela. UNIQUE: indica que o atributo tem valor único na tabela. Qualquer tentativa de seintroduzir uma linha na tabela contendo um valor igual ao do atributo será rejeitada. Servepara indicar chaves secundárias (chaves candidatas). Em Candidata1, Candidata2 devem serespecificados os atributos que terão esse valor único na tabela. FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES TabelaExterna[(AtributoExterno1 [, AtributoExterno2 [, ...]]) – serve para especificar os atributos quesão chaves estrangeiras na relação, já relacionando-os às tabelas onde eles são chaveprimária (Integridade Referencial). Em Estrangeira1, Estrangeira2, ... especificam-se osatributos que são chave estrangeira. Em TabelaExterna se especifica o nome da tabela ondeo atributo é chave primária e, por fim, o nome desse atributo nessa TabelaExterna (porqueos atributos na relação e na tabela externa original podem ter nomes diferentes). Se osatributos da relação e da tabela externa tiverem o mesmo nome, esses AtributoExterno1, 29
  30. 30. Banco de Dados AtributoExterno2, ... não precisam ser especificados. CHECK (condição) – aqui são especificadas condições que devem ser checadas na inserção de dados na tabela (validações). Vamos agora dar exemplos de uso dessa sintaxe tomando o nosso modelo base Comentário (Figura 4). Primeiro, vamos criar as tabelas Autor e Editora que são tabelas simples (sem chaves estrangeiras ou checagens a serem feitas):5 Como tipo dedados estamos CREATE TABLE AUTOR(deduzindo os tipospossíveis baseados na CodAutor INTEGER NOT NULL,explicação da seçãoanterior sobre tipos de Nome CHAR(50)5 NOT NULL,dados. Nascimento DATE NOT NULL, PRIMARY KEY (CodAutor), Comentário UNIQUE (Nome) );6 Valor será do tipo CREATE TABLE EDITORA(DECIMAL, ou seja, CodEditora INTEGER NOT NULL,um valor de pontoflutuante, tendo 3 Razao CHAR(50),casas na parte inteira eduas casas decimais. Endereco CHAR(50), Cidade CHAR(30) Comentário PRIMARY KEY(CodEditora )); Agora, podemos partir para a definição da tabela Livro que faz uso das duas tabelas7 Aqui está sendoespecificado o valor anteriormente definidas:default para o atributo CREATE TABLE LIVRO(idioma. Se esse camponão for informado, o Titulo CHAR(50) NOT NULL,valor “Português” seráassumido. CodAutor INTEGER NOT NULL, CodEditora INTEGER NOT NULL, Comentário Valor DECIMAL(3.2)6, Publicacao DATE,8 Veja que estásendo especificada Volume INTEGER,uma chave primáriacomposta, uma vez Idioma CHAR (15) DEFAULT = ‘Português’ 7,que dois atributosfazem parte da PRIMARY KEY (Titulo, CodAutor8),especificação. FOREIGN KEY (CodAutor) REFERENCES AUTOR9, FOREIGN KEY (CodEditora) REFERENCES EDITORA, Comentário CHECK Valor > 10.010);9 Veja que estamos Só pra ilustrar melhor o uso da cláusula CHECK vamos dar outro exemplo de criaçãoespeficifando que de tabela, fora do exemplo do modelo base (Figura 4). Suponha que desejamos criar a tabelaCodEditora é chave estudante que contenha os atributos matricula, nome e nível.estrangeira na tabelasendo definida e é um CREATE TABLE estudante (atributo pertencentea tabela Autor (sendo matricula char(10) NOT NULL,chave primária nessaoutra tabela – tabela nome char(15) NOT NULL,externa) nivel char(15) NOT NULL, 30
  31. 31. Banco de Dados PRIMARY KEY (matricula), CHECK (nivel IN (“Bacharelado”, ”Mestrado”, ”Doutorado”)))11 O SQL-89 obrigava os atributos da chave primária a serem declarados como NOT NULL e UNIQUE. Comentário SQL-92 e posteriores já assumem essas condições, assim, sua declaração é redundante. 10 Aqui é especificado Uma cláusula FOREIGN KEY pode incluir regras de remoção / atualização: que os livros que forem criados devem FOREIGN KEY (coluna) REFERENCES tabela ter seu valor maior que 10. Essa é uma [ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}] validação que será feita a cada inserção / [ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}] alteração de dados na Suponha que T2 tem uma chave estrangeira para T1, ou seja, tem um atributo que tabela.é chave primária em T1. Vejamos as cláusulas ON DELETE e ON UPDATE ON DELETE Comentário RESTRICT: (default) significa que uma tentativa de se remover uma linha de T1 11 Veja que aqui falhará se alguma linha em T2 combinar com a chave da tupla de T1 que está sendo estamos especificando deletada. os valores possíveis para o atributo nível. CASCADE: a remoção de uma linha de T1 implica em remoção de todas as linhas de T2 que combinam com a chave da tupla de T1 sendo deletada. Comentário SET NULL: remoção de T1 implica em colocar NULL em todos os atributos de T2 que sejam chave estrangeira e estejam relacionados com a tupla sendo deletada em T1. 12 O valor default para SET DEFAULT: remoção de linha em T1 implica em colocar valores DEFAULT nos o departamento é 1. atributos da chave estrangeira de cada linha de T2 que combina ON UPDATE Comentário RESTRICT: (default) a atualização de um atributo de T1 falha se existem linhas em T2 combinando com a tupla sendo modificada. A chave primária é a 13 matrícula. CASCADE: a atualização de atributo em T1 implica que linhas que combinam em T2 também serão atualizadas Comentário SET NULL: a atualização de T1 implica que valores da chave estrangeira em T2, nas linhas que combinam com a tupla de T1 sendo atualizada, são postos para NULL. 14 Veja que aqui o atributo da tabela SET DEFAULT: a atualização de T1 implica que valores da chave estrangeira de T2 sendo definida tem nas linhas que combinam terão valores default aplicados. nome diferente do atributo na sua tabela Vamos dar um exemplo de uso dessas cláusulas: externa de origem. Por isso, o nome do CREATE TABLE empregado ( atributo na tabela matricula char(10) NOT NULL, externa precisa ser especificado. nome char(15) NOT NULL, cod_depto INT NOT NULL DEFAULT 112, Comentário PRIMARY KEY(matricula) , 13 15 Aqui é especificado FOREIGN KEY(supervisor) REFERENCES Empregado(matricula)14 que, se a tupla que ON DELETE SET NULL15 contém a matrícula sendo utilizada nesta ON UPDATE CASCADE16, tabela for deletada, o atributo SUPERVISOR FOREIGN KEY (cod_depto) REFERENCES Departamento(codigo) deverá receber o valor NULL. ON DELETE SET DEFAULT17 31
  32. 32. Banco de Dados ON UPDATE CASCADE); DDL - Alterando Tabelas O comando ALTER TABLE permite inserir/eliminar/modificar colunas nas tabelas já existentes, modificando a estrutura das mesmas. A sintaxe básica desse comando é: ALTER TABLE Tabela { ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) | Comentário DROP (Nome_Atributo [, ...] ) |16 Aqui é especifricado MODIFY ( Nome_Atributo NovoTipo [ NOT NULL ] [DEFAULT, ... ] )que, se a matrícula foratualizada na tabela }de origem, todas as Onde: | Indica escolha de várias opções e { } Indica obrigatoriedade de escolha detuplas da tabela ondeo atributo é chave uma opção entre as várias. Agora, vamos explicar cada parte do comando.estrangeira devem seratualizadas também. Adicionando um novo atributo (nova coluna) na Tabela ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) | Usando o ADD é possível adicionar um novo atributo na Tabela. Dessa forma, o novo Comentário atributo deve ser especificado (nome e tipo). É possível ainda dizer antes de qual atributo se deseja que esse novo atributo seja inserido (BEFORE nome_atributo). Por exemplo, se17 Aqui é especificado desejássemos adicionar o campo E-MAIL na tabela Autor, do nosso exemplo base (Figura 4),que, se a tupla que usaríamos:contém o código dodepartamento sendo ALTER TABLE AUTOR ADD EMAIL CHAR(40);utilizado nesta tabelafor deletada, o atributocod_depto deveráreceber o valor defaultespecificado para este Observaçãoatributo. No caso, onúmero 1. Os novos atributos terão valores nulos em todas as linhas. Por isso, não se pode usar NOT NULL juntamente com ADD (na definição do novo atributo), quando a tabela já contiver registros (lembre, com o uso de ADD a nova coluna é carregada com NULL’s). Deletando um atributo (uma coluna) da Tabela DROP (Nome_Atributo [, ...] ) | Para usar a cláusula DROP é necessário apenas especificar o nome do atributo que se deseja remover da tabela. Porém, atenção, a cláusula DROP não remove atributos da chave primária. Por exemplo, se desejássemos eliminar o campo E-MAIL (anteriormente adicionado) da tabela Autor, usaríamos: ALTER TABLE AUTOR DROP EMAIL; A cláusula DROP pode ser usada com algumas configurações adicionais: DROP Nome_Atributo [CASCADE | RESTRICT] onde: CASCADE: removeria o atributo de todos os lugares onde ele estivesse sendo usado (outras tabelas como chave estrangeira e em visões). RESTRICT: não permitiria a remoção do atributo se este estivesse sendo usado em uma visão ou como chave estrangeira em outra tabela. 32
  33. 33. Banco de Dados Ex: ALTER TABLE AUTOR DROP EMAIL RESTRICT; Modificando um atributo (uma coluna) da Tabela Comentário MODIFY18 ( Nome_Atributo NovoTipo [ NOT NULL ] [, ... ] ) Esta cláusula serve para modificar as informações de um atributo como, por 18 Em alguns SGBDs ao invés de MODIFYexemplo, seu tamanho, sua nulidade, etc. Quando se altera o tipo de dados de uma coluna, é usada a cláusulaos dados são convertidos para o novo tipo. Por exemplo, se desejássemos modificar o ALTER.campo E-MAIL na tabela Autor, diminuindo seu tamanho de 40 para 30, usaríamos: ALTER TABLE AUTOR MODIFY EMAIL CHAR(25); O detalhe é que, se se diminuir o tamanho de um atributo do tipo CHAR, os dadosexistentes serão truncados, havendo assim, perda de informação.DDL – Criando e Removendo Índices Índices são estruturas que permitem agilizar a busca e ordenação de dados emtabelas. Para criar um índice em uma tabela existente usamos o comando CREATE INDEX. Asintaxe completa desse comando é: CREATE [UNIQUE] INDEX Nome_Indice ON Nome_Tabela (Nome_Atributo1 [, Nome_Atributo2…]) Neste comando devemos especificar se o índice deve ser único (UNIQUE), ou seja,não deve permitir repetições (restrição de chaves) ou se será apenas um índice usado paraacelerar a busca entre as tuplas da tabela. Depois, devemos especificar o nome do índice(Nome_Indice), a qual tabela ele vai pertencer (Nome_Tabela) e qual(ais) atributo(s) fará Comentário(ão) parte do índice. Por exemplo, se desejássemos criar um índice para o campo código doautor da tabela Autor, usaríamos: 19 Foi usado o sufixo IDX para indicar que CREATE UNIQUE INDEX CodigoIDX ON Autor (CodAutor); 19 é um índice para o Agora, se desejássemos criar um índice para pesquisar pelo código do autor e pelo código do autor.código da editora ao mesmo tempo, usaríamos: CREATE INDEX AutorEditoraIDX ON Livro (CodAutor,CodEditora); O default é indexar em ordem ascendente, se quisermos uma ordem descendente Comentáriodevemos adicionar palavra DESC depois do nome do atributo (no final do comando). Porexemplo, suponha que se deseja pesquisar os autores pelo seu nascimento. Mas das datas 20 Foi usado o sufixomaiores (mais rescentes) para as menores (mais antigas). Assim, ficaríamos com: IDX para indicar que é um índice para o nome CREATE INDEX NascIDX20 ON Autor (Nascimento) DESC; do autor. Observação Uma consulta que envolva atributos indexados é realizada com um tempo de execução melhor do que com atributos não-indexados. Agora, cuidado, você também não pode indexar TODOS os atributos de uma tabela. Você deverá usar o bom-senso para escolher quais aqueles que serão indexados de acordo com o problema sendo modelado e a freqüência de uso do atributo em consultas. Alguns SGBDs (por exemplo, o Oracle) criam, automaticamente, índices para aschaves primárias das tabelas, fazendo uso da cláusula UNIQUE. 33
  34. 34. Banco de Dados Para eliminarmos um índice usamos o comando DROP INDEX, cuja sintaxe é: Comentário DROP INDEX Nome-Índice21 Por exemplo, suponha que sejamos deletar o índice criado para a data de21 Deve ser usado o nascimento do autor, ficaríamos com:nome que foi dado aoíndice na criação do DROP INDEX NascIDXmesmo. DDL - Excluindo Tabelas Comentário Para excluir uma tabela existente do SGBD é utilizado o comando DROP. Agora,22 Para criar tabelas é necessário muito cuidado com este comando, pois ao deletar a tabela (esquema daé usado o comando mesma), automaticamente, TODOS os dados da tabela também serão excluídos. A sintaxeCREATE TABLE. desse comando é: DROP TABLE Nome_Tabela Exemplo: Comentário /* Excluir a tabela livro */23 Integer indica um DROP TABLE LIVRO;valor numérico inteiroe como o código é achave, ele deve serNOT NULL. Conheça Mais Em geral, os livros de banco de dados trazem um ou mais capítulo sobre SQL. Entre esses livros temos: Comentário SILBERSCHATZ, Abraham; KORTH, Henry F; SUDARSHAN, S. Sistema de banco de dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006.24 A descrição deve serum atributo do tipo ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. Sãocaractere. Usando o Paulo: Pearson Education do Brasil, 2005.bom-senso você defineo tamanho do campo. DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus,Optei pela descriçãoser também not null. 2000. ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004. Além destes, há livros específicos sobre SQL, independente de SGBD, tais como: Comentário BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 200825 O preço é um valor KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referênciadecimal . Optei por ele Profissional. Alta Books, 2010.poder assumir o valorNULL (suponha que no SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciênciamomento do cadastro Moderna, 3ª Edição, 2009você ainda não saibapor quanrto vai vender DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007.o produto. 34
  35. 35. Banco de Dados Você Sabia?Além da SQL outra linguage comercial para manipulação de SGBDs é a QBE (Query-by-Example).A versão experimental da linguagem foi descrita formalmente (publicada) por Moshe Zloofem 1977. A versão comercial foi descrita em 1978 pela IBM e usada mais tarde na QueryManagement Facility (QMF). A QBE tem por base o cálculo relacional de domínio e possui sintaxebidimensional: as consultas parecem tabelas. Nesta linguagem as consultas são expressas “porexemplo”. Em vez de determinar um procedimento para obtenção da resposta desejada, ousuário dá um exemplo do que é desejado. A partir daí, o sistema generaliza o exemplo para o Comentárioprocessamento da resposta da consulta. 26 Você não pode deixar para especificar a quantidade de itens Aprenda Praticando depois. Por isso, NOT NULL. Utilize SQL para fazer o que se pede, a partir do modelo relacional a seguir. » Produto (cod_prod (PK), descricao, preco) Comentário » Item_Venda (cod_venda (PK), cod_prod(PK), qntde) 27 Veja que está » Venda (cod_venda (PK), nome_cliente) sendo especificada uma chave primária 1) Crie as tabelas acima usando o comando, sabendo que os códigos devem ser composta, uma vez valores núméricos, preco deve ser um valor de ponto flutuante e qntde (quantidade que dois atributos fazem parte da comprada do produto) deve ser um valor inteiro, obrigatoriamente, maior que zero especificação. (afinal, ninguém compra zero produto!). Devemos começar a criação pelas tabelas mais simples (sem chave estrangeira). Dessa forma, vamos criar primeiro a tabela PRODUTO e, depois, a tabela VENDA. Comentário CREATE TABLE22 PRODUTO( 28 Veja que estamos cod_prod integer23 NOT NULL, espeficifando que cod_prod é chave descricao CHAR(45) NOT NULL24, estrangeira na tabela e é um atributo preco DECIMAL25(5,2), pertencente a tabela PRIMARY KEY (cod_prod) ) Produto. Seguindo o mesmo raciocínio da tabela anterior, criaremos, agora, a tabela VENDA. CREATE TABLE VENDA( cod_venda integer NOT NULL, nome_cliente CHAR(40) NOT NULL, PRIMARY KEY (cod_venda) ) CREATE TABLE ITEM_VENDA( cod_prod INTEGER NOT NULL, cod_venda INTEGER NOT NULL, qntde INTEGER NOT NULL26, PRIMARY KEY (cod_prod, cod_venda)27, FOREIGN KEY (cod_prod) REFERENCES Produto28, FOREIGN KEY (cod_venda) REFERENCES Venda, 35

×