apresenta¸c˜ao - fernando lobo
TRANSCRIPT
Apresentacao
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 19
Professores da disciplina
Fernando Lobo (T e P)
Alvaro Barradas (P)
2 / 19
Livro recomendado
A First Course in Database Systems,Je↵rey Ullman & Jennifer Widom,Prentice Hall, 3rd edition, 2007.
3 / 19
Avaliacao
Trabalho pratico (30%), exame (70%)
Necessitam nota nao inferior a 7.0 valores no trabalho pratico paraserem admitidos a exame.
Trabalho pratico pode ser feito individualmente ou em grupo de 2alunos.
Discussao dos trabalhos na ultima semana de aulas.
4 / 19
Objectivos Gerais
Dominar tecnicas de analise e modelacao de dados.
Conhecer o modelo relacional.
Saber definir o esquema de uma base de dados relacional.
Saber inserir, modificar, e extrair informacao de uma BD usando SQL.
Saber especificar restricoes, vistas, ındices, e elementos activos.
Compreender o mecanismo de transaccoes.
5 / 19
Programa resumido
Conceitos introdutorios
Modelacao conceptualI UML
Modelo relacionalI Normalizacao
ProgramacaoI Algebra relacionalI SQLI SQL + programacao convencional
6 / 19
Trabalho pratico
Consiste em 4 partes:
1 Escolher tema, fazer modelo conceptual.
2 Converter modelo conceptual no modelo relacional, definir esquemaem SQL.
3 Elaborar queries em SQL.
4 Juntar linguagem de programacao convencional com SQL.
7 / 19
Exemplos de temas escolhidos pelos alunos no passado
Receitas de culinaria
Campeonatos de surf
Vinhos
Borga Gest: Saıdas a noite
...
8 / 19
O que e um Sistema de Gestao de Base de Dados?
E um sistema que:
1 armazena e manipula grandes volumes de informacao.
2 suporta acesso simultaneo por varios utilizadores.
3 permite acesso eficiente aos dados.
9 / 19
Exemplo: bancos
Informacao: contas, clientes, saldos, movimentos, etc.
Grandes volumes: gigabytes.
Multi-utilizador: varias pessoas/programas acedem a BD emsimultaneo.
I requer cuidados especiais.
10 / 19
Varias facetas no estudo de base de dados
1 Analise/Modelacao
2 ProgramacaoI SQL + linguagem de programacao
3 Implementacao de SGBDs
Nesta disciplina apenas estudamos os itens (1) e (2)
11 / 19
Um SGBD e um tipo de software
Compra-se (pode ser gratuito), instala-se, configura-se.
Disponıvel para todo o tipo de computadores.
12 / 19
Principais SGBDs
Oracle
DB2 (IBM)
SQL-Server (Microsoft)
PostgreSQL (open source)
MySQL (open source)
SQL Lite (open source)
13 / 19
Modelo conceptual
produz
0..*
0..*
0..*
0..1
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
Estudio
PK nome
morada
participa
14 / 19
Conversao para o modelo relacional
Filmes( nome, ano, duracao, aCores, estudio )
Actores( nome, morada, sexo, dataNascimento )
Participa( actor, nomeFilme, anoFilme )
Estudios( nome, morada )
15 / 19
Normalizacao
Eliminar redundancia nas relacoes de modo a que nao haja anomaliasquando se modifica a BD.
Exemplo concreto: se a BD estiver mal concebida, podemos ter deespecificar a mesma informacao varias vezes e isso podera dar origema inconsistencia nos dados.
16 / 19
Algebra relacional e SQL
Algebra relacional permite manipular relacoes (tabelas).
Os operandos sao relacoes e os resultados sao relacoes.
SQL e uma implementacao desta algebra.
17 / 19
Exemplo: Natural Join (./)Filmes:
nome ano estudio
Star Wars 1977 FoxPocahontas 1995 DisneyKing Kong 1933 MGMLion King 1994 Disney
Estudios:
estudio morada
Fox Elm St.Disney Pine St.MGM Oak Dr.
Filmes ./ Estudios
nome ano estudio morada
Star Wars 1977 Fox Elm St.Pocahontas 1995 Disney Pine St.King Kong 1933 MGM Oak Dr.Lion King 1994 Disney Pine St.
18 / 19
Manipulacao de dados com SQL
Qual o nome e ano dos filmes produzidos pelo estudio Disney entre1992 e 1996?
Codigo SQL:
SELECT nome, ano
FROM Filmes
WHERE estudio = ’Disney’
AND ano >= 1992 AND ano <= 1996;
Resultado:nome ano
Pocahontas 1995Lion King 1994
19 / 19
Modelacao Conceptual de Base de Dados
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 56
Passos para criar uma base de dados
1 Compreender o problema no mundo real.
2 Especifica-lo usando um modelo conceptual.
3 Traduzir o modelo para um SGBD.
4 Criar esquema da BD usando uma “Data Definition Language” (DDL)
5 Carregar os dados
6 Desenvolver aplicacoes
2 / 56
Passos para criar uma base de dados (cont.)
Para o passo 2 pode usar-se o modelo Entidade-Associacao, UML, ououtro modelo conceptual.
Por vezes o passo 2 e omitido (mas nao e boa pratica) e passa-sedirectamente para o modelo de dados do SGBD.
A passagem de 2 para 3 pode ser automatizada.
3 / 56
Modelos conceptuais
Modelos conceptuais mais usuais para BD:
I Modelo Entidade-Associacao (E/A)
I UML
Iremos aprender apenas modelacao com UML
4 / 56
Unified Modeling Language (UML)
UML e usado essencialmente para modelacao de software com umaabordagem orientada a objectos.
Um subconjunto do UML pode ser usado para modelacao conceptualde base de dados.
Tem uma notacao grafica.
5 / 56
Diagrama de classe
Notacao para descrever atributos (propriedades) e comportamentos(metodos) de objectos de uma classe.
<metodos>
<nome da classe>
<atributos>
6 / 56
Diagrama de classe
Vamos ignorar os metodos nesta disciplina.
<nome da classe>
<atributos>
7 / 56
Exemplo
Imaginem que tem de fazer uma BD para os Servicos Academicos.
Vamos ter de guardar informacao sobre os alunos.
Para cada aluno podemos querer guardar o seu numero de aluno,nome, telefone, morada, etc.
Tudo isso sao atributos/propriedades de um aluno.
8 / 56
Exemplo
Faz sentido termos uma classe de alunos.
Pensem numa classe como sendo um tipo de dados (uma estruturaem C)
morada: string
nome: string
telefone: string
numero: int
Aluno
9 / 56
Exemplo
Numa fase inicial, podemos omitir o tipo de dados dos atributos.
nome
numero
telefone
morada
Aluno
10 / 56
Chave primaria
Conjunto de atributos que determina de forma unica um objecto deuma classe.
Especifica-se usando PK junto do(s) atributo(s).
nome
Aluno
PK numero
telefone
morada
11 / 56
Conjunto de objectos de uma classe
A futura BD tera um conjunto de objectos da classe Aluno.
Esse conjunto pode ser visualizado na forma de uma tabela.
Cada linha da tabela e um objecto da classe Aluno.
numero nome morada telefone
34567 Jose Almeida Rua da Prata, 27, Faro 96-333459845301 Maria Tavares Av. da Liberdade, 13, Faro 91-983778838750 Paula Soares Av. de Paris, 14, Olhao 91-4201314. . . . . . . . . . . .
12 / 56
Associacoes
Podemos ter associacoes entre objectos de classes diferentes.
A associacao e representada por uma linha com um nome.
Exemplo: Podemos querer saber quais as disciplinas que cada alunoja fez.
I Criamos uma classe Disciplina com atributos sigla e nome.
I Unimos Aluno e Disciplina com uma linha e damos um nome quereflecte o tipo de ligacao que existe.
13 / 56
Exemplo
morada
Disciplina
realiza
0..* 0..*
Aluno
PK numero
telefone
PK sigla
nomenome
A seta facilita a leitura em portugues corrente.
Um aluno realiza varias (0 ou mais) disciplinas.
Uma disciplina e realizada por varios (0 ou mais) alunos.
14 / 56
Associacoes podem ser vistas em forma de tabela
Alunosnumero nome morada telefone
34567 Jose Almeida Rua da Prata, 27, Faro 96-333459845301 Maria Tavares Av. da Liberdade, 13, Faro 91-983778838750 Paula Soares Av. de Paris, 14, Olhao 91-4201314. . . . . . . . . . . .
Disciplinas
sigla nome
BD Bases de DadosPOO Programacao Orientada a Objectos. . . . . .
Realizaaluno disciplina
34567 BD34567 POO38750 POO. . . . . . 15 / 56
Multiplicidade de associacoes
Multiplicidade e especificada nas extremidades da linha.
I m..n significa que 1 objecto do outro extremo esta associado com ummınimo de m e um maximo de n objectos deste extremo.
I * ! “infinito” (ex: 1..* significa “pelo menos um”)
16 / 56
Exemplo
morada
Disciplina
realiza
Aluno
PK numero PK sigla
nome0..105..30telefone
nome
Um aluno realiza um mınimo de 0 e um maximo de 10 disciplinas.
Uma disciplina e realizada por um mınimo de 5 e um maximo de 30alunos.
17 / 56
Multiplicidade de associacoes
Dadas duas classes, C1 e C2,
um-um: cada objecto de C1 esta associado no maximo a um objectode C2 e vice-versa.
muitos-um: cada objecto de C1 esta associado no maximo a um objectode C2. Mas um objecto de C2 pode estar associado a variosobjectos de C1.
muitos-muitos: cada objecto de C1 pode estar associado a varios objectosde C2 e vice-versa.
18 / 56
Multiplicidade um-um
C2C1
Cada objecto de C1 esta associado no maximo a um objecto de C2 evice-versa.
19 / 56
Multiplicidade muitos-um
C2C1
Cada objecto de C1 esta associado no maximo a um objecto de C2.
20 / 56
Multiplicidade muitos-muitos
C2C1
Cada objecto de C1 pode estar associado a varios objectos de C2 evice-versa. Mas um objecto de C2 pode estar associado a variosobjectos de C1.
21 / 56
Classes associativas
E permitido atributos em associacoes.
Associacao passa a ser uma “Classe Associativa”.
22 / 56
Exemplo
Um aluno realiza uma disciplina e obtem uma nota.
A nota e uma propriedade da associacao aluno–disciplina.
a62222
Aluno Disciplina
BD
POO
nota=15
nota=15
nota=12
nota=13
a61234
a61111
23 / 56
Classe associativa em UML
morada
Disciplina
0..* 0..*
Realiza
nota
Aluno
PK sigla
nome
PK numero
nome
telefone
24 / 56
E necessario tomar decisoes na modelacao
E se quisermos saber o ano em que o aluno realizou a disciplina?
Onde colocar o atributo ano?
Devemos considerar BD 2017 = BD 2018 ?
25 / 56
Se BD 2017 = BD 2018 entao o ano pode ficar atributo de realiza.
ano
Disciplina
0..* 0..*
Realiza
Aluno
PK sigla
nome
PK numero
nome
telefone
morada
nota
26 / 56
nota=15 , ano=2017
Aluno Disciplina
27 / 56
Se BD 2017 6= BD 2018, sigla nao pode ser chave de Disciplina.
Necessitarıamos de ter uma chave composta, ex: {sigla,ano}. Ouentao um codigo de disciplina.
Realiza
Disciplina
0..* 0..*
Aluno
PK siglaPK numero
nome
telefone
morada
nome
nota
PK ano
28 / 56
Mais decisoes...
Estamos a assumir que “Realiza” significa “ter aprovacao adisciplina”.
E razoavel assumir que tal so acontece uma vez.
E se quisermos modelar “inscricao a disciplina”?
E perfeitamente razoavel um aluno inscrever-se a mesma disciplinavarias vezes.
29 / 56
Conceptualmente . . .
nota=8 , ano=2016
Aluno Disciplina
nota=15 , ano=2017
nota=6 , ano=2015
30 / 56
Erro comum em UML
Inscreve−se
Disciplina
0..* 0..*
Aluno
PK sigla
nome
PK numero
nome
telefone
morada
nota
ano
0..*
31 / 56
Mas nao se pode modelar assim
Nao e permitido ter mais do que uma associacao com o mesmo nomeentre dois objectos.
i.e., nao podemos ter varias associacoes de “inscricao”entre umdeterminado aluno e uma determinada disciplina.
nota=8 , ano=2016
Aluno Disciplina
nota=15 , ano=2017
nota=6 , ano=2015
32 / 56
Mais adiante vermos como modelar este problema correctamente.
Nao esquecam este exemplo. E um erro frequente. . .
33 / 56
Exemplo do vosso livro: filmes
Um filme tem: nome, ano, duracao, colorido ou preto/branco.
Um actor/actriz tem: nome, morada, data de nascimento.
Um estudio tem: nome, morada.
Um filme tem varios actores e um actor pode participar em variosfilmes.
Um filme pode ser produzido por um estudio, um estudio podeproduzir varios filmes.
34 / 56
Conhecimento do mundo real
Usa-se conhecimento do mundo real para modelar o problema.
Nao ha uma unica solucao correcta, pode haver varias abordagens.
Devemos assumir pressupostos razoaveis.
35 / 56
Pressupostos para a BD de filmes
Nao ha dois actores com o mesmo nome.
Nao ha dois estudios com o mesmo nome.
Nao ha dois filmes com o mesmo nome produzidos no mesmo ano(mas pode haver em anos distintos: Ex: Ha o King Kong de 1933,mas tambem ha o King Kong de 1976, e ate ha o King Kong de2005).
NOTA: na pratica o melhor seria colocar um atributo artificial — umcodigo — para identificar univocamente cada filme, mas para javamos ignorar isso.
36 / 56
Modelo UML
produz
0..*
0..*
0..*
0..1
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
Estudio
PK nome
morada
participa
37 / 56
Sobre a chave primaria composta
No diagrama da classe Filme, colocamos PK em nome e PK em ano.
Trata-se de uma chave composta. A chave primaria e {nome,ano}.
Nada impede que haja filmes com o mesmo nome.
Nada impede que haja filmes produzidos no mesmo ano.
O que estamos a proibir e que haja dois filmes com o mesmo nomeproduzidos no mesmo ano.
38 / 56
Varias alternativas para chave primaria
Pode have varias alternativas para chaves primarias. Nesse casoescolhemos uma delas como chave primaria.
Exemplo:
I no caso da BD dos SA poderemos querer guardar o numero do cartaode cidadao do(a) aluno(a).
I temos duas opcoes para chave primaria: numero-de-aluno ounumero-de-CC.
39 / 56
Um erro comum
morada
Aluno
nome
PK numero
PK numCC
telefone
40 / 56
Estudio tem um presidente
Um estudio tem um e um so presidente.
Vamos assumir que um presidente so pode ser presidente de umestudio.
PresidenteEstudio
PK nome
morada
preside 1..1
morada
PK nome
data_nascimento
1..1
41 / 56
Vencimento dos actores
Um actor recebe consoante o filme em que participa.
Solucao: Classe associativa.
salario
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
0..*0..*
Participa
42 / 56
Associacoes com a propria classe
Pode haver associacoes entre objectos da mesma classe.
Cada objecto representa um papel diferente na associacao.
Ex: um filme pode ser sequencia de um outro filme.
0..*
PK nomePK ano duracao aCores
Filme
sequencia
original0..1
43 / 56
Visualizando em forma de tabela
sequencia original
The Empire Strikes Back Star WarsThe Return of the Jedi The Empire Strikes BackRocky II Rocky IRocky III Rocky II. . . . . .
44 / 56
Subclasses
Uma classe pode ter subclasses.
Ex: Um Cartoon e um tipo de filme, Crime-Misterio tambem e umtipo de filme.
Cartoons e uma subclasse de Filmes, Crime-Misterio e outrasub-classe de Filmes.
Subclasse aponta para a superclasse com uma linha com um triangulona extremidade.
As subclasses podem ter atributos.I ex: arma do crime para os filmes de Crime-Misterio.
45 / 56
Subclasses
PK nome
PK ano
duracao
aCores
Filmes
CartoonsCrime−Misterio
arma
46 / 56
Subclasses
As subclasses de uma classe podem ser:
I completas ou parciais
F completa se cada objecto da superclasse esta numa das subclasses,parcial caso contrario.
I disjuntas ou sobrepostas
F disjunta se um objecto nao pode estar em mais do que uma subclasse,sobreposta caso contrario.
I E costume anotar a classificacao no diagrama de forma textual
47 / 56
Subclasses de Filmes (parciais e sobrepostas)
parcial, sobreposta
PK nomePK ano duracao aCores
Filmes
CartoonsCrime−Misterio
arma
Porque sobrepostas? Porque um filme pode ser simultaneamente umcartoon e um filme de crime-misterio (ex: Who Framed Roger Rabbit?
48 / 56
Agregacao
Associacao com o significado que objectos de um dos lados podem“ser possuıdos” ou “fazer parte de” objectos do outro lado.
Ex: um filme pode ser produzido por um estudio.I (o estudio e “dono do”filme)
representa−se por no lado da classe que e’ "dona de"
significa 0..1
PK nomePK ano duracao aCores
Filmes Estudios
1..* PK nome morada
49 / 56
Composicao
Semelhante a agregacao mas a posse e obrigatoria.
Ex: um filme tem de ser forcosamente produzido por um estudio.
significa 1..1
representa−se por no lado da classe que e’ "dona de"
PK nomePK ano duracao aCores
Filmes Estudios
1..* PK nome morada
50 / 56
Agregacao e Composicao
Nao e necessario dar um nome a associacao.
O nome esta implıcito pela “posse”dos objectos.
51 / 56
Classe de suporte
Por vezes podemos ter uma classe que serve de suporte a outra classe.
Objectos desta classe so fazem sentido no contexto de outra classe.
Ex: Um estudio pode ter varias equipas de filmagem: equipa 1, 2, 3,. . .
A equipa de filmagem e uma classe de suporte (ou classe fraca) a umestudio.
Modelamos este tipo de associacao com composicao e colocamosuma caixinha assinalada com PK no diagrama de classe de suporte.
Uma equipa de filmagem so pode ser identificada se for “buscar”achave do estudio respectivo.
52 / 56
Classe de suporte
moradaPK nome
Estudio
PK numero
Eq. Filmagem
PK0..*
53 / 56
Voltando ao problema das inscricoes de alunos
nota=8 , ano=2016
Aluno Disciplina
nota=15 , ano=2017
nota=6 , ano=2015
54 / 56
Assim NAO
Inscreve−se
Disciplina
0..* 0..*
Aluno
PK sigla
nome
PK numero
nome
telefone
morada
nota
ano
0..*
55 / 56
Assim SIM
notaPKPK
DisciplinaAluno
PK sigla
nome
PK numero
nome
telefone
morada
Inscriçao
PK ano
56 / 56
Modelo relacional
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 17
Modelo relacional
Modelo simples e intuitivo baseado no conceito matematico derelacao.
Inventado em 1970 por Edgar Codd.
Utilizado pela maioria dos SGBDs.
SQL e baseado no modelo relacional.
2 / 17
Modelo relacional
Uma relacao e como se fosse uma tabela com linhas e colunas.
A diferenca e que:
I uma relacao nao pode ter linhas repetidas.
Muitas vezes irei usar o termo tabela para me referir a uma relacao(mas devem estar conscientes de que tabela e relacao sao coisasdistintas).
BD = conjunto de relacoes/tabelas.
3 / 17
Definicao formal de relacao
Dados n conjuntos C1,C2, . . . ,Cn (nao necessariamente distintos), Re uma relacao sobre estes n conjuntos, se for um conjunto de tuplosda forma (v1, v2, . . . , vn) em que:
I v1 2 C1
I v2 2 C2
I . . .
I vn 2 Cn
Por outras palavras, R e subconjunto do Produto Cartesiano C1 x C2
x . . . x Cn.
4 / 17
Produto Cartesiano. Exemplo:
Porto
Benfica
Sporting
Milan
Barcelona
Chelsea
(Porto, Barcelona)
(Porto, Chelsea)
(Benfica, Milan)
(Benfica, Barcelona)
(Benfica, Chelsea)
(Sporting, Chelsea)
(Sporting, Barcelona)
(Sporting, Milan)
(Porto, Milan)
A x BA
B
5 / 17
Outro exemplo
C nomesC anos C aCoresC duracao
1901
1900
1902
1903
2
5
3
4
1
6
sim
nao
Star Wars
King Kong
A Maria da UAlg
... ......
NOTA: Conjuntos podem ser infinitos.
6 / 17
Outro exemplo (cont.)
(Star Wars, 1900, 1, sim)
(Star Wars, 1900, 2, nao)
(Star Wars, 1900, 3, sim)
(Star Wars, 1900, 1, nao)
(Star Wars, 1900, 2, sim)
...
C nomes C anos C duracao C aCoresx x x
Produto cartesiano da o conjunto de todos os possıveis tuplos (v1, v2,v3, v4), em que v1 2 Cnomes , v2 2 Canos , v3 2 Cduracao , v4 2 CaCores .
7 / 17
Uma possıvel relacao sobre Cnomes , Canos , Cduracao, CaCores
(Moulin Rouge, 2001, 124, sim)
(Star Wars, 1977, 124, sim)
(King Kong, 1930, 120, nao)
8 / 17
Da jeito visualizar a relacao como uma tabela
nome ano duracao aCores
Star Wars 1977 124 simKing Kong 1930 120 naoMoulin Rouge 2001 124 sim
Nome das colunas sao atributos.
tuplo = linha.
9 / 17
Estas 2 tabelas representam a mesma relacao. Porque?
nome ano duracao aCores
Lion King 1997 108 simStar Wars 1977 124 simKing Kong 1930 120 naoLion King 1997 108 simLion King 1997 108 sim
ano nome aCores duracao
1930 King Kong nao 1201977 Star Wars sim 1241997 Lion King sim 108
10 / 17
Esquema da BD = descricao completa da estrutura da BD
Nome das relacoes/tabelas
Nome dos atributos
Domınio dos atributos (integer, string, . . .)
Chaves
. . .
11 / 17
Instancia da BD
O conteudo (os tuplos) de todas as relacoes de uma BD constituiuma instancia da BD.
A instancia da BD muda com frequencia.
O esquema da BD e feito uma vez (por pessoas como voces) e naocostuma mudar.
12 / 17
Definicao de tabelas em SQL
CREATE TABLE <nome> (
<lista de elementos>
);
cada elemento consiste num atributo e no respectivo tipo de dados.
os tipos mais comuns sao:
I INT ou INTEGERI REAL ou FLOATI CHAR(n), VARCHAR(n)I BOOLEANI DATEI TIME
13 / 17
Exemplo: Tabela de actores
CREATE TABLE Actores(
nome VARCHAR(50),
morada VARCHAR(70),
sexo CHAR,
dataNascimento DATE
);
14 / 17
DATE e TIME
o formato de DATE e ’yyyy-mm-dd’.
o formato de TIME e ’hh:mm:ss’.I podera ter ainda fraccoes de segundo.
Exemplos:
I DATE ’2008-01-05’(5 de Janeiro de 2008)
I TIME ’15:32:04.5’(4 segundos e meio depois das 3:32 da tarde)
15 / 17
Declaracao da chave
um atributo ou lista de atributos pode ser declarado como chave emSQL utilizando PRIMARY KEY.
Exemplo:
CREATE TABLE Actores(
nome VARCHAR(50) PRIMARY KEY,
morada VARCHAR(70),
sexo CHAR,
dataNascimento DATE
);
16 / 17
Declaracao da chave (cont.)
No caso da chave ser composta, temos de especificar um elemento aparte.
Exemplo:
CREATE TABLE Filmes(
nome VARCHAR(50),
ano INTEGER,
duracao INTEGER,
aCores BOOLEAN,
PRIMARY KEY (nome,ano)
);
17 / 17
Conversao de modelo UML para o modelo relacional
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 19
Conversao do modelo UML para o modelo relacional
Diagrama de classe ! RelacaoI atributos da classe ! atributos da relacao.I chave da classe ! chave da relacao.I Exemplo:
PK nome: stringPK ano: int duracao: int aCores: boolean
Filmes
Filmes( nome, ano, duracao, aCores )
2 / 19
Conversao do modelo UML para o modelo relacional
Associacao entre classes ! RelacaoI os atributos sao a uniao das chaves das classes envolvidas.I Nota: deve-se renomear o nome dos atributos para nao haver conflito
de nomes.
Exemplo:
participa
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
0..*0..*
Participa( nomeFilme, anoFilme, nomeActor )
3 / 19
Associacao entre classes ! relacao. Qual a chave?
3 casos:
I muitos-muitos: a chave e a uniao das chaves dos conjuntos entidadeenvolvidos.
I muitos-um: a chave e a chave correspondente ao muitos.
I um-um: escolhe-se uma das duas.
4 / 19
Exemplo: Participa (muitos-muitos)
participa
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
0..*0..*
Uniao da chave de Actores (nomeActor) com a chave de Filmes(nomeFilme,anoFilme).
Participa( nomeFilme, anoFilme, nomeActor )
5 / 19
Outro exemplo: Produz (muitos-um)
0..1
Estudio
PK nome
morada
produz0..*
Filme
PK nome
PK ano
duracao
aCores
Escolhe-se apenas a chave de Filmes (nomeFilme,anoFilme).
Produz( nomeEstudio, nomeFilme, anoFilme )
6 / 19
Simplificacao
Relacoes oriundas de associacoes muitos-um podem ser eliminadas.
Mas temos que colocar a chave da classe do lado “um” como atributoda relacao do lado “muitos”.
No exemplo anterior, a relacao Produz pode ser eliminada secolocarmos a chave de Estudios (nomeEstudio) como atributo darelacao Filmes.
Filmes( nome, ano, duracao, aCores, nomeEstudio )
Porque?
7 / 19
Exemplo completo
produz
0..*
0..*
0..*
0..1
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
Estudio
PK nome
morada
participa
8 / 19
Vai dar origem a 4 relacoes
Filmes( nome, ano, duracao, aCores, nomeEstudio )
Actores( nome, morada, sexo, dataNascimento )
Estudios( nome, morada )
Participa( nomeActor, nomeFilme, anoFilme )
9 / 19
Uma possıvel instancia da BD
Filmes:
nome ano duracao aCores nomeEstudio
Star Wars 1977 124 true FoxIndiana Jones 1983 130 true Universal
Actores:
nome morada sexo dataNascimento
Harrison Ford 789 Palm Dr, Hollywood m 1942-07-13Carrie Fisher 123 Maple St, Hollywood f 1956-10-21Emilio Estevez 32 Elm St, Beverly Hills m 1962-05-12
10 / 19
Uma possıvel instancia da BD (cont.)
Estudios:
nome morada
Fox 127 Springfield Av, HollywoodDisney 14 Lincoln St, Los AngelesUniversal 23 Universal Studies Dr., Los Angeles
Participa:
nomeActor nomeFilme anoFilme
Carrie Fisher Star Wars 1977Harrison Ford Star Wars 1997Harrison Ford Indiana Jones 1983
11 / 19
Classe associativa
Classe associativa ! RelacaoI os atributos sao a uniao das chaves das classes envolvidas na associacaoI mais os atributos da classe associativa
Exemplo:
salario
Filme
PK nome
PK ano
duracao
aCores
Actor
morada
PK nome
sexo
data_nascimento
0..*0..*
Participa
Participa( nomeFilme, anoFilme, nomeActor, salario )
12 / 19
Associacao de uma classe com ela propria
Quando temos uma associacao envolvendo objectos da mesma classecom temos de colocar a chave 2 vezes, uma para cada papel.
Exemplo:
0..*
PK nomePK ano duracao aCores
Filme
sequencia
original0..1
13 / 19
Associacao de uma classe com ela propria
SequenciaDe( seqNome, seqAno, origNome, origAno )
SequenciaDe:
seqNome seqAno origNome origAno
Rocky II 1982 Rocky I 1980Rocky III 1985 Rocky II 1982... ... ... ...
14 / 19
Classes de suporte
moradaPK nome
Estudio
PK numero
Eq. Filmagem
PK0..*
Estudios( nome, morada )
EquipasFilmagem( numero, nomeEstudio )
A associacao entre a classe de suporte e a classe “dona”pode sereliminada (porque e muitos-um).
I e nao e necessario acrescentar nada a EquipasFilmagem. Porque?
15 / 19
Sub-classes
Existem 2 alternativas:
1 Criar uma relacao para cada sub-classe.
2 Combinar toda a hierarquia numa unica classe e usar valores NULLsempre que um atributo nao se aplica.
16 / 19
Exemplo:
PK nome
PK ano
duracao
aCores
Filmes
CartoonsCrime−Misterio
arma
17 / 19
Alternativa 1
Filmes( nome, ano, duracao, aCores )
CrimeMisterio( nome, ano, arma )
Cartoons( nome, ano )
Um filme que nao seja Cartoon nem de Crime-Misterio, apareceapenas na relacao Filmes.
Um filme que seja apenas um Cartoon (ex: “Lion King”) ira aparecernas relacoes Filmes e Cartoons.
Um filme que seja simultaneamente um Cartoon e um CrimeMisterio(ex: “Who Framed Roger Rabbit”) ira aparecer em 3 relacoes:Filmes, Cartoons e CrimeMisterio.
18 / 19
Alternativa 2
Filmes( nome, ano, duracao, aCores, arma )
“Gone with the wind” tem um NULL para o atributo arma.
“Lion King” tem um NULL para arma.
“Murder on the orient express” nao tem NULLs.
NOTA:
Perdemos informacao. Nao sabemos se um determinado filme e umcartoon (ou crime-misterio, ou ambos).
Solucao possıvel: colocar mais um atributo, ex: genero.
19 / 19
Dependencias Funcionais
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 26
Motivacao: Normalizacao
Por vezes o esquema relacional tem falhas.
Geralmente sao derivadas de falhas no modelo conceptual.
Vamos aprender a teoria de “Normalizacao” de relacoes, a qual
permite eliminar certo tipo de falhas.
2 / 26
Exemplo
Filmes1( nome, ano, duracao, nomeEstudio, moradaEstudio )
nome ano duracao nomeEstudio moradaEstudio
Star Wars 1977 124 Fox 10 Elm St., Los Angeles
Empire Strikes Back 1980 143 Fox 10 Elm St., Los Angeles
Gone With the Wind 1939 181 Paramount 44 Pine St., Los Angeles
Lion King 1994 124 Disney 56 Oak St., Los Angeles
Return of the Jedi 1983 165 Fox 10 Elm St., Los Angeles
Pocahontas 1995 115 Disney 56 Oak St., Los Angeles
Qual o problema desta relacao?
3 / 26
Problemas
1 Redundacia
I a morada de um estudio aparece repetida varias vezes.
2 Pode dar origem a anomalias em “updates”.
I ex: actualizar a morada no 1otuplo e nao o fazer no 2
oe 5
otuplo.
3 Pode dar origem a anomalias em “deletes”.
I ex: se apagarmos o filme “Gone With the Wind”, o estudio
“Paramount” desaparece da BD!
4 / 26
Normalizacao
Estudo de Normalizacao de relacoes permite-nos decompor uma
relacao em varias relacoes de modo a que nao haja este tipo de
anomalias.
Antes de aprender a faze-lo, precisamos de aprender o conceito de
Dependencia Funcional.
5 / 26
Dependencias Funcionais
Generalizacao do conceito de chave.
Notacao: X ! Y
Significado: se fixarmos valores para os atributos X , os valores dos
atributos Y sao unicos (i.e., nao ha repetidos).
I Nota: X e Y sao conjuntos de atributos.
I Usaremos . . ., X , Y , Z para representar conjuntos de atributos; A, B ,C , . . . para atributos individuais.
I Por vezes vamos omitir o uso de chavetas para representar conjuntos,
i.e. usaremos ABC em vez de {A,B ,C}.
6 / 26
No nosso exemplo . . .
Filmes1( nome, ano, duracao, nomeEstudio, moradaEstudio )
nome ano duracao nomeEstudio moradaEstudio
Star Wars 1977 124 Fox 10 Elm St., Los Angeles
Empire Strikes Back 1980 143 Fox 10 Elm St., Los Angeles
Gone With the Wind 1939 181 Paramount 44 Pine St., Los Angeles
Lion King 1994 124 Disney 56 Oak St., Los Angeles
Return of the Jedi 1983 165 Fox 10 Elm St., Los Angeles
Pocahontas 1995 115 Disney 56 Oak St., Los Angeles
nome ano ! duracao nomeEstudio moradaEstudio
nomeEstudio ! moradaEstudio
7 / 26
Definicao e independente da instancia
A definicao de DF e independente da instancia da relacao.
Uma DF e uma assercao que e obedecida por todas as possıveis
instancias de uma relacao.
O mesmo acontece com o conceito de chave.
8 / 26
Chaves e Superchaves
X e uma superchave da relacao R se:
I X ! todos os atributos de R .
X e uma chave da relacao R , se nenhum subconjunto proprio de Xfor superchave de R (i.e., X e uma “superchave mınima”).
I NOTA: Y e subconjunto proprio de X , se Y ✓ X ^ Y 6= X
X e chave de R ) X e superchave de R .
9 / 26
Exemplo
Filmes1( nome, ano, duracao, nomeEstudio, moradaEstudio )
Com DF’s:
nome ano ! duracao nomeEstudio moradaEstudio
nomeEstudio ! moradaEstudio
{nome,ano} e chave de Filmes1. Porque?
Quantas superchaves ha na relacao Filmes1?
10 / 26
DF’s triviais
X ! Y e trivial se Y ✓ X
Exemplos
I nome ano ! nome
I nome ! nome
11 / 26
Regras sobre DF’s
X ! A1A2 . . .An
E equivalente a:
I X ! A1
I X ! A2
I . . .
I X ! An
Em ingles, “Splitting Rule”.
12 / 26
Nao se pode fazer o mesmo do lado esquerdo
Exemplo:
nome ano ! duracao
nao e equivalente a:
I nome ! duracao
I ano ! duracao
Porque?
13 / 26
Regras sobre DF’s (cont.)
Transitividade: Se X ! Y e Y ! Z , entao X ! Z .
“Augmentation”: Se X ! Y , entao XZ ! Y .
14 / 26
De onde vem as DF’s
1 Chaves obtidas no modelo conceptual.
2 Relacoes muitos-um.
3 Conhecimento do problema.
15 / 26
Exemplo: casos 1 e 2
0..1
Estudio
PK nome
morada
produz0..*
Filme
PK nome
PK ano
duracao
aCores
Filmes( nome, ano, duracao, aCores, nomeEstudio )
nome ano ! duracao aCores
nome ano ! nomeEstudio
16 / 26
Exemplo: conhecimento sobre o problema (caso 3)
Nao pode haver 2 disciplinas que funcionam no mesmo dia da
semana, a mesma hora, e na mesma sala.
I sala dia hora ! disciplina
17 / 26
Fecho de um conjunto de atributos
Notacao: o fecho de X designa-se por X+.
Significado: X+e o conjunto de todos os atributos que sao
funcionalmente determinados por X .
Algoritmo para calcular X+:
1 X+= X
2 Se A1,A2, . . . ,Am ! B , e todos os A0s estao contidos em X+,
adicionar B a X+.
3 Termina quando nao conseguirmos adicionar mais nada a X+.
18 / 26
Exemplo
Dada a relacao R(ABCDEF ) com as seguintes DF’s:
I AB ! C
I BC ! A
I BC ! D
I D ! E
I CF ! B
(AB)+ = ?
= AB= ABC // porque AB ! C= ABCD // porque BC ! D= ABCDE // porque D ! E
19 / 26
Projeccao de DF’s
Nota: Projeccao = eliminar algumas colunas.
Motivacao: Normalizacao, o processo de decompor uma relacao em 2
ou mais relacoes.
Exemplo:
I R(ABCD) com DF’s: AB ! C , C ! D, e D ! A.
I Decompor em R1(ABC ) e R2(AD).
I Quais as DF’s em R1?
I AB ! C , mas tambem C ! A.
20 / 26
Projeccao de DF’s (cont.)
Dada uma relacao R com um conjunto de DF’s, projectar R em R1. Quais
as DF’s de R1?
1 Comecar com as DF’s de R e encontrar todas as DF’s nao triviais que
se podem deduzir a partir delas.
2 Ficar apenas com as DF’s cujos atributos facam parte do esquema de
R1.
21 / 26
Algoritmo para projectar as DF’s de uma relacao R numarelacao R1
1 Seja T o eventual output. Inicialmente, T = ;.
2 Para cada subconjunto X de atributos de R1, calcular X+(usando as
DF’s de R).
3 Inserir X ! A em T , para todo o A 2 (X+ � X ), desde que A seja
atributo de R1.
22 / 26
Simplificacao
Calcular o fecho de todos os subconjuntos de atributos e trabalhoso.
Simplificacao no1:
I Nao e necessario calcular o fecho do conjunto vazio, nem do conjunto
de todos os atributos.
Simplificacao no2:
I Se X+= todos os atributos, nao e necessario calcular o fecho de
subconjuntos que contenham X .
23 / 26
Exemplo
Seja R(ABCD) com DF’s A ! B , B ! C , C ! D.
Projectar R em R1(ACD) (i.e., eliminar o atributo B).
Fechos T
A+= ABCD A ! C , A ! D
C+= CD C ! D
D+= D
(CD)+= CD
T e o conjunto de DF’s de R1. Mas podemos eliminar A ! D porque
pode ser deduzida a partir das outras duas.
DF’s de R1: A ! C , C ! D.
24 / 26
Equivalencia de conjuntos de DF’s
Dois conjuntos de DF’s S e T sao equivalentes, se o conjunto de
instancias que satisfaz S for o mesmo que o conjunto de instancias
que satisfaz T .
No exemplo que vimos ha pouco:
I {A ! C , A ! D, C ! D} e equivalente a {A ! C , C ! D}
25 / 26
Base mınima de DF’s
Seja S um conjunto de DF’s para uma relacao R .
Qualquer conjunto de DF’s equivalente a S e uma base para S .
Uma base mınima para uma relacao R , e uma base B que satisfaca:
1 Todas as DF’s em B , tem no lado direito um so atributo.
2 Se removermos uma das DF’s de B , deixa-se de ter uma base.
3 Se removermos um atributo do lado esquerdo de uma das DF’s de B ,deixa-se de ter uma base.
26 / 26
Normalizacao:
Forma Normal de Boyce Codd
3a
Forma Normal
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 38
Normalizacao
O objectivo e obter esquemas relacionais sem redundancia e sem
anomalias.
Exemplo:
I Filmes1( nome ano duracao nomeEstudio moradaEstudio )
com DF’s:
nome ano ! duracao
nome ano ! nomeEstudio
nome ano ! moradaEstudio
nomeEstudio ! moradaEstudio
2 / 38
Possıvel instancia de Filmes1
nome ano duracao nomeEstudio moradaEstudio
Star Wars 1977 124 Fox 10 Elm St., Los Angeles
Empire Strikes Back 1980 143 Fox 10 Elm St., Los Angeles
Gone With the Wind 1939 181 Paramount 44 Pine St., Los Angeles
Lion King 1994 124 Disney 56 Oak St., Los Angeles
Return of the Jedi 1983 165 Fox 10 Elm St., Los Angeles
Pocahontas 1995 115 Disney 56 Oak St., Los Angeles
3 / 38
Problemas
1 Redundacia
I a morada de um estudio aparece repetida varias vezes.
2 Pode dar origem a anomalias em “updates”.
I ex: actualizar a morada no 1o
tuplo e nao o fazer no 2o
e 5o
tuplo.
3 Pode dar origem a anomalias em “deletes”.
I ex: se apagarmos o filme “Gone With the Wind”, o estudio
“Paramount” desaparece da BD!
4 / 38
Decomposicao de relacoes
Podemos decompor o esquema de uma relacao em dois esquemas
mais pequenos.
Dado R(A1A2 . . . An), podemos decompor R em 2 relacoes:
S(B1B2 . . . Bm) e T (C1C2 . . . Ck) de tal forma que:
1 {A1,A2, . . . ,An} = {B1,B2, . . . ,Bm}S
{C1,C2, . . . ,Ck}
2 S = projeccao de R em {B1,B2, . . . ,Bm}
3 T = projeccao de R em {C1,C2, . . . ,Ck}
A ideia e que possamos reconstituir a relacao original juntando as
relacoes decompostas.
I A juncao e feita igualando os atributos com o mesmo nome.
5 / 38
Exemplo
Filmes1( nome ano duracao nomeEstudio moradaEstudio )
nome ano duracao nomeEstudio moradaEstudio
Star Wars 1977 124 Fox 10 Elm St., Los Angeles
Empire Strikes Back 1980 143 Fox 10 Elm St., Los Angeles
Gone With the Wind 1939 181 Paramount 44 Pine St., Los Angeles
Lion King 1994 124 Disney 56 Oak St., Los Angeles
Return of the Jedi 1983 165 Fox 10 Elm St., Los Angeles
Pocahontas 1995 115 Disney 56 Oak St., Los Angeles
Pode ser decomposto em:
I Filmes2( nome ano duracao nomeEstudio )
I Filmes3( nomeEstudio moradaEstudio )
6 / 38
Exemplo (cont.)
Filmes2:
nome ano duracao nomeEstudio
Star Wars 1977 124 Fox
Empire Strikes Back 1980 143 Fox
Gone With the Wind 1939 181 Paramount
Lion King 1994 124 Disney
Return of the Jedi 1983 165 Fox
Pocahontas 1995 115 Disney
Filmes3:
nomeEstudio moradaEstudio
Fox 10 Elm St., Los Angeles
Paramount 44 Pine St., Los Angeles
Disney 56 Oak St., Los Angeles
7 / 38
Forma normal de Boyce-Codd (BCNF)
Uma relacao R esta em BCNF sse:
para todas as DF’s de R nao triviais X ! Y ,
X for superchave de R.
Basta existir uma DF em que X nao seja superchave, para R nao estar em
BCNF. Se isso acontecer, diz-se que essa DF viola a condicao de BCNF.
8 / 38
Exemplo: Filmes1
Filmes1( nome ano duracao nomeEstudio moradaEstudio )
com DF’s:
nome ano ! duracao
nome ano ! nomeEstudio
nome ano ! moradaEstudio
nomeEstudio ! moradaEstudio
A chave e {nome,ano} porque:
I nome ano ! duracao nomeEstudio moradaEstudio
Filmes1 nao esta em BCNF porque:
I {nomeEstudio} nao e superchave de Filmes1.
nomeEstudio ! moradaEstudio, viola a condicao BCNF.
9 / 38
Outro exemplo: Filmes2
Filmes2( nome ano duracao nomeEstudio )
com DF’s:
nome ano ! duracao
nome ano ! nomeEstudio
A chave e {nome,ano} porque:
I nome ano ! duracao nomeEstudio
Filmes2 esta em BCNF porque em todas as DF’s, o lado esquerdo
contem a chave.
I {nome,ano} e superchave de Filmes2.
10 / 38
Outro exemplo: Filmes3
Filmes3( nomeEstudio moradaEstudio )
com DF’s:
nomeEstudio ! moradaEstudio
A chave e {nomeEstudio} porque:
I nomeEstudio ! moradaEstudio
Filmes3 esta em BCNF porque {nomeEstudio} e superchave de
Filmes3.
11 / 38
Possıveis instancias de Filmes2 e Filmes3
Filmes2:
nome ano duracao nomeEstudio
Star Wars 1977 124 Fox
Empire Strikes Back 1980 143 Fox
Gone With the Wind 1939 181 Paramount
Lion King 1994 124 Disney
Return of the Jedi 1983 165 Fox
Pocahontas 1995 115 Disney
Filmes3:
nomeEstudio moradaEstudio
Fox 10 Elm St., Los Angeles
Paramount 44 Pine St., Los Angeles
Disney 56 Oak St., Los Angeles
12 / 38
Decomposicao de relacoes para BCNF
Nao e qualquer decomposicao que resolve o problema.
Exemplo: Decompor Filmes1 em:
I Filmes4( nome ano duracao )
I Filmes5( duracao nomeEstudio moradaEstudio )
13 / 38
Resultado
Filmes4:
nome ano duracao
Star Wars 1977 124
Empire Strikes Back 1980 143
Gone With the Wind 1939 181
Lion King 1994 124
Return of the Jedi 1983 165
Pocahontas 1995 115
Filmes5:
duracao nomeEstudio moradaEstudio
124 Fox 10 Elm St., Los Angeles
143 Fox 10 Elm St., Los Angeles
181 Paramount 44 Pine St., Los Angeles
124 Disney 56 Oak St., Los Angeles
165 Fox 10 Elm St., Los Angeles
115 Disney 56 Oak St., Los Angeles
14 / 38
Qual o problema?
1 Filmes5 continua sem estar em BCNF.
2 Mais grave: se juntarmos Filmes4 com Filmes5, vamos obter tuplos
que nao pertenciam a relacao original!
nome ano duracao nomeEstudio moradaEstudio
Star Wars 1977 124 Fox 10 Elm St., Los Angeles
Star Wars 1977 124 Disney 56 Oak St., Los Angeles
Empire Strikes Back 1980 143 Fox 10 Elm St., Los Angeles
Gone With the Wind 1939 181 Paramount 44 Pine St., Los Angeles
Lion King 1994 124 Disney 56 Oak St., Los Angeles
Lion King 1994 124 Fox 10 Elm St., Los Angeles
Return of the Jedi 1983 165 Fox 10 Elm St., Los Angeles
Pocahontas 1995 115 Disney 56 Oak St., Los Angeles
15 / 38
Decomposicao “Lossless join”
Uma decomposicao de R em R1 e R2 diz-se “Lossless join” se ao
juntarmos os tuplos de R1 com os tuplos de R2 (igualando os atributos
com o mesmo nome), obtivermos exactamente os tuplos de R.
Ex: A decomposicao de Filmes1 em Filmes2 e Filmes3
e “Lossless join”.
Ex: A decomposicao de Filmes1 em Filmes4 e Filmes5
nao e “Lossless join”.
16 / 38
Decomposicao para BCNF
A ideia e usar uma DF X ! Y que viole a condicao de BCNF.
Calcula-se X+.
I Nao da todos os atributos, caso contrario X seria superchave.
Decompoe-se R em duas relacoes, R1 e R2, com os seguintes
esquemas:
1 R1 X+
2 R2 XS
(atrib(R)� (X+))
17 / 38
Graficamente
X+
− X
R1
R2
X+
atrib(R) − X
R
18 / 38
Exemplo
Filmes1( nome ano duracao nomeEstudio moradaEstudio )
com DF’s:
nome ano ! duracao
nome ano ! nomeEstudio
nomeEstudio ! moradaEstudio
Escolhe-se uma DF que viole BCNF:
I nomeEstudio ! moradaEstudio
Calcula-se:
I nomeEstudio+
= nomeEstudio moradaEstudio
Decompoe-se Filmes1 em:
I Filmes2( nomeEstudio moradaEstudio )
I Filmes3( nome ano duracao nomeEstudio )
19 / 38
Exemplo (cont.)
Necessitamos de verificar se Filmes2 e Filmes3 estao ambas em
BCNF.
Projecta-se as DF’s de Filmes1 em Filmes2 e Filmes3.
Para Filmes2 temos:
I nome ano ! duracao
I nome ano ! nomeEstudio
{nome,ano} e chave de Filmes2 ) Filmes2 esta em BCNF.
Para Filmes3 temos:
I nomeEstudio ! moradaEstudio
{nomeEstudio} e chave de Filmes3 ) Filmes3 esta em BCNF.
20 / 38
Outro exemplo
F1( nome ano nomeEstudio nomePresidente moradaPresidente )
com DF’s:
nome ano ! nomeEstudio // DF 1nomeEstudio ! nomePresidente // DF 2nomePresidente ! moradaPresidente // DF 3
Chave e {nome,ano}. Porque?
DF’s 2 e 3 violam BCNF. Vamos decompor usando DF 2.
I nomeEstudio+
= {nomeEstudio,nomePresidente,moradaPresidente}
Decompomos F1 em F2 e F3:
I F2( nomeEstudio nomePresidente moradaPresidente )
I F3( nome ano nomeEstudio )
21 / 38
Outro exemplo (cont.)
Agora e necessario ver se F2 e F3 estao em BCNF.
Projecta-se as DF’s de F1 em F2 e F3.
Para F2:
nomeEstudio ! nomePresidente
nomePresidente ! moradaPresidente
I chave e {nomeEstudio}.I nomePresidente ! moradaPresidente, viola BCNF.
I e necessario decompor F2 em F4 e F5.
Para F3:
nome ano ! nomeEstudio
I chave e {nome,ano}.I F3 esta em BCNF.
22 / 38
Outro exemplo (cont.)
Decomposicao de F2 em F4 e F5.
F2( nomeEstudio nomePresidente moradaPresidente )
DF’s:
nomeEstudio ! nomePresidente
nomePresidente ! moradaPresidente
nomePresidente+
= {nomePresidente,moradaPresidente}
F4( nomePresidente moradaPresidente )
I DF’s: nomePresidente ! moradaPresidente.
I {nomePresidente} e chave. F4 esta em BCNF.
F5( nomeEstudio nomePresidente )
I DF’s: nomeEstudio ! nomePresidente.
I {nomeEstudio} e chave. F5 esta em BCNF.
23 / 38
Em resumo
F1( nome ano nomeEstudio nomePresidente moradaPresidente )
com DF’s:
nome ano ! nomeEstudio
nomeEstudio ! nomePresidente
nomePresidente ! moradaPresidente
Foi decomposto em F3, F4, F5:
F3( nome ano nomeEstudio )
F4( nomePresidente moradaPresidente )
F5( nomeEstudio nomePresidente )
24 / 38
Decomposicao para BCNF
A decomposicao baseada na utilizacao de uma DF que viole a
condicao de BCNF, e sempre “lossless join”.
Qualquer relacao com apenas 2 atributos esta sempre em BCNF.
Tentem prova-lo.
25 / 38
3a
Forma Normal: Motivacao
Por vezes a decomposicao para BCNF nao preserva as DF’s da
relacao original.
Nesses casos, nao devemos decompor para BCNF.
A situacao ocorre tipicamente quando temos DF’s com a seguinte
estrutura:
XY ! Z
Z ! Y
26 / 38
Exemplo
CartazFilmes( filme, cinema, cidade )
cinema cinema onde o filme passa (ex: Forum Algarve).
cidade cidade onde se encontra o cinema.
Vamos supor que na mesma cidade nao pode passar o mesmo filme
em cinemas diferentes.
Vamos tambem supor que um cinema pode ter varias salas.
DF’s:
cinema ! cidade
filme cidade ! cinema
27 / 38
Exemplo (cont.)
CartazFilmes tem 2 chaves
I {filme,cidade}I {cinema,filme}
cinema ! cidade, viola BCNF.
Somos tentados a decompor CartazFilmes. Obterıamos:
I Cartaz1(cinema,cidade), com DF’s: cinema ! cidade
I Cartaz2(filme,cinema), com DF’s: {}
Mas nao conseguimos satisfazer a DF filme cidade ! cinema em
nenhuma das relacoes resultantes da decomposicao!
28 / 38
Exemplo (cont.)
E possıvel haver instancias de Cartaz1 e Cartaz2 que satisfacam as
respectivas DF’s (i.e., cinema ! cidade)
Mas que a juncao viole a DF original: filme cidade ! cinema.
29 / 38
Exemplo (cont.)
Cartaz1:
cinema cidade
Forum Algarve Faro
Santo Antonio Faro
Cartaz2:
filme cinema
Jesse James Forum Algarve
Jesse James Santo Antonio
Cartaz1 ./ Cartaz2:
cinema cidade filme
Forum Algarve Faro Jesse James
Santo Antonio Faro Jesse James
30 / 38
3a
Forma Normal
A 3a
Forma Normal (3FN) relaxa a condicao de BCNF.
Uma relacao R esta na 3FN se para todas as DF’s nao triviais
X ! Y , se verificar que:
I X e superchave de R, ou
I Y e membro de uma chave de R
Se R esta em BCNF ) R esta em 3FN
31 / 38
Exemplo
CartazFilmes( filme, cinema, cidade )
com DF’s:
cinema ! cidade
filme cidade ! cinema
esta na 3FN porque cidade faz parte de uma chave.
recordem-se que havia 2 chaves:
{filme,cidade} e {cinema,filme}.
32 / 38
Propriedades importantes de uma decomposicao
Duas propriedades que uma decomposicao deve obedecer:
1 Lossless join: ser possıvel reconstituir a relacao original a partir das
relacoes decompostas.
2 Preservacao de dependencias: ser possıvel verificar as DF’s originais
nas relacoes decompostas.
BCNF garante (1).
3FN garante (1) e (2).
33 / 38
Decomposicao para a 3FN
Objectivo: Decompor uma relacao R num conjunto de relacoes que
estejam todas na 3FN.
A decomposicao tera a propriedade “Lossless join”
e tambem ira preservar as dependencias funcionais.
34 / 38
Algoritmo de decomposicao para a 3FN
Input: uma relacao R com um conjunto de DF’s F .
Output: uma decomposicao de R num conjunto de relacoes, todas elas na
3FN.
Metodo:
1 G = base mınima para F .
2 Para cada DF X ! A em G , usar XA como esquema de uma das
relacoes decompostas.
3 Se nenhum dos esquemas resultantes do passo (2) for uma superchave
de R, acrescentar uma relacao cujo esquema seja uma chave de R.
35 / 38
Exemplo
R(ABCDE ) com DF’s AB ! C , C ! B, e A! D.
1 As DF’s dadas sao uma base mınima (ver justificacao nos proximos
slides).
2 Obtemos as relacoes R1(ABC ), R2(BC ), R3(AD).
(R2 pode ser eliminada porque o seu esquema esta contido no
esquema de R1).
3 R tem duas chaves: ABE e ACE . Temos de acrescentar uma delas,
por exemplo R4(ABE ).
36 / 38
Exemplo (cont.)
Justificacao para {AB ! C , C ! B, A! D} ser uma base mınima.
1 O lado direito de todas as DFs so tem 1 atributo.
2 Nao conseguimos inferir nenhuma das DF’s a partir das outras duas.
Verificacao:
I sera que AB ! C pode ser inferido de {C ! B, A! D} ?
calcular (AB)+
usando {C ! B, A! D}.(AB)
+= ABD.
) AB ! C nao pode ser inferido de {C ! B, A! D}.
I fazer verificacao analoga para provar que:
F C ! B nao pode ser inferido de {AB ! C , A! D}.F A! D nao pode ser inferido de {AB ! C , C ! B}.
37 / 38
Exemplo (cont.)
Justificacao para {AB ! C , C ! B, A! D} ser uma base mınima.
3. nao conseguimos eliminar atributos do lado esquerdo de nenhuma DF
e continuar a ter uma base.
I a unica hipotese seria eliminar A ou B em AB ! C .
I se eliminarmos A, temos de demonstrar que B ! C nao pode ser
inferido a partir de {AB ! C , C ! B, A! D}.B+
= B.
I fazer verificacao analoga para o caso de eliminarmos B.
38 / 38
Algebra Relacional
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 50
Algebra relacional
Conjunto de operadores que permitem manipular relacoes:
1 operacoes sobre conjuntos: [, \, �
2 remover linhas (seleccao), remover colunas (projeccao).
3 operacoes que combinam informacao contida em varias relacoes:produtos cartesianos e joins.
4 mudar o nome a relacoes e atributos.
As expressoes em algebra relacional sao uma especie de programa.
2 / 50
Operacoes sobre conjuntos: Uniao ([)
Filmes1
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
Filmes2
nome ano estudioIndiana Jones 1981 UniversalKing Kong 1933 MGMPocahontas 1998 Disney
Filmes1 [ Filmes2
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 DisneyIndiana Jones 1981 Universal
3 / 50
Operacoes sobre conjuntos: Interseccao (\)
Filmes1
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
Filmes2
nome ano estudioIndiana Jones 1981 UniversalKing Kong 1933 MGMPocahontas 1998 Disney
Filmes1 \ Filmes2
nome ano estudioPocahontas 1998 DisneyKing Kong 1933 MGM
4 / 50
Operacoes sobre conjuntos: Diferenca (�)
Filmes1:
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
Filmes2:
nome ano estudioIndiana Jones 1981 UniversalKing Kong 1933 MGMPocahontas 1998 Disney
Filmes1 � Filmes2
nome ano estudioStar Wars 1977 FoxLion King 1997 Disney
5 / 50
Operacoes sobre conjuntos
NOTA: Quando se aplica operadores sobre conjuntos, as relacoestem de ter esquemas relacionais identicos.
. . . e a lista de atributos de cada relacao tem de aparecer pelamesma ordem.
caso contrario estes operadores nao fazem sentido.
6 / 50
Remover linhas: Seleccao (�)
Notacao: �c(R), onde c e uma condicao.
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
� estudio = ’Disney’ (Filmes)
nome ano estudioPocahontas 1998 DisneyLion King 1997 Disney
7 / 50
Remover colunas: Projeccao (⇡)
Notacao: ⇡` (R), onde ` e uma lista de atributos de R.
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
⇡ nome, estudio (Filmes)
nome estudioStar Wars FoxPocahontas DisneyKing Kong MGMLion King Disney
8 / 50
Outro exemplo
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing King 1933 MGMLion King 1997 Disney
⇡ estudio (Filmes)
estudioFoxDisneyMGM
9 / 50
Seleccao e projeccao juntos
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing King 1933 MGMLion King 1997 Disney
⇡ nome, ano
✓� ano < 1990 (Filmes)
◆
nome anoStar Wars 1977King Kong 1933
10 / 50
Combinar relacoes
Produto Cartesiano: R = R1 ⇥ R2
faz a concatenacao de cada tuplo t1 de R1 com cada tuplo t2 de R2 ecoloca o tuplo t1t2 em R.
Theta Join: R = R1 Zc R2
e equivalente a: R = �c(R1 ⇥ R2)
Natural Join: R = R1 Z R2
e equivalente a um theta join em que a condicao c diz que osatributos com o mesmo nome sao igualados. Depois, uma dascolunas e projectada.
11 / 50
Produto Cartesiano (⇥)
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
Estudios
nome moradaFox Elm St.Disney Pine St.MGM Oak Dr.
12 / 50
Produto Cartesiano
Filmes ⇥ Estudios
Filmes.nome ano estudio Estudios.nome moradaStar Wars 1977 Fox Fox Elm St.Star Wars 1977 Fox Disney Pine St.Star Wars 1977 Fox MGM Oak Dr.Pocahontas 1998 Disney Fox Elm St.Pocahontas 1998 Disney Disney Pine St.Pocahontas 1998 Disney MGM Oak Dr.King Kong 1933 MGM Fox Elm St.King Kong 1933 MGM Disney Pine St.King Kong 1933 MGM MGM Oak Dr.Lion King 1997 Disney Fox Elm St.Lion King 1997 Disney Disney Pine St.Lion King 1997 Disney MGM Oak Dr.
13 / 50
Theta Join (ZC)
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
Estudios
nome moradaFox Elm St.Disney Pine St.MGM Oak Dr.
Filmes Z Filmes.estudio=Estudios.nome Estudios
Filmes.nome ano estudio Estudios.nome moradaStar Wars 1977 Fox Fox Elm St.Pocahontas 1998 Disney Disney Pine St.King Kong 1933 MGM MGM Oak Dr.Lion King 1997 Disney Disney Pine St.
14 / 50
Natural Join (Z)
Filmes
nome ano estudioStar Wars 1977 FoxPocahontas 1998 DisneyKing Kong 1933 MGMLion King 1997 Disney
Estudios
estudio moradaFox Elm St.Disney Pine St.MGM Oak Dr.
Filmes Z Estudios
nome ano estudio moradaStar Wars 1977 Fox Elm St.Pocahontas 1998 Disney Pine St.King Kong 1933 MGM Oak Dr.Lion King 1997 Disney Pine St.
15 / 50
Mudar o nome a relacoes e atributos (⇢)
Notacao: ⇢ S(A1,A2,...,An) (R)
produz uma relacao de nome S identica a R e com os atributoschamados A1,A2, . . . ,An
Estudios
estudio moradaFox Elm St.Disney Pine St.MGM Oak Dr.
⇢ S(nome,rua) (Estudios)
nome ruaFox Elm St.Disney Pine St.MGM Oak Dr.
16 / 50
Notacao linear para expressoes
A ideia e atribuir nomes para relacoes intermedias.
Exemplo: Dado o esquema relacional,
Filmes( nome, ano, duracao, aCores, estudio )Participa( nomeFilme, anoFilme, nomeActor )
Qual o nome e ano dos filmes a cores em que participou ’JackNicholson’?
R1 B ⇡ nome,ano⇣�aCores = TRUE (Filmes)
⌘
R2 B ⇡ nomeFilme,anoFilme⇣�nomeActor = ’Jack Nicholson’ (Participa)
⌘
R3 B R1 \ R2
17 / 50
Expressoes em forma de arvore
aCores = TRUEσnomeActor = ’Jack Nicholson’σ
πnome,ano nomeFilme,anoFilmeπ
U
Filmes Participa
18 / 50
Restricoes em relacoes
R nao tem tuplos.R = ;
Todo o tuplo de R tambem e tuplo de S.R ✓ S
R ✓ S ⌘ R � S = ;
Pergunta: Qual o significado de,⇡ estudio(Filmes) ✓ ⇡ nome(Estudios)
19 / 50
Exercıcio
Actores( nome, morada )
nome moradaNicole Kidman 26 Palm Dr., HollywoodBrad Pitt 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly HillsAngelina Jolie 12 Oak St., Hollywood. . . . . .
Quais os actores que partilham a mesma morada? Isto e, pretende-seobter uma relacao com dois atributos, nome1 e nome2, em que cada tuplorepresenta um par de actores com a mesma morada.
nome1 nome2Angelina Jolie Brad Pitt. . . . . .
20 / 50
Exercıcio (cont.)
So com projeccoes e seleccoes nao vamos la . . .
Necessitamos de comparar as moradas de actores diferentes everificar se sao iguais.
Alguma ideia?
21 / 50
Exercıcio (cont.)
A solucao reside em combinar a relacao Actores com ela propria.I obtemos uma copia da relacao Actores atraves do operador ⇢.
I fazemos um join de Actores com a copia obtida, colocando comocondicao que os actores tenham a mesma morada (mas que se tratemde actores diferentes).
I e depois projectamos os atributos nome1 e nome2
⇢ Actores2( nome2, morada2 ) (Actores)
� morada=morada2 ^ nome,nome2 (Actores ⇥ Actores2)
⇡ nome,nome2 (. . .)
22 / 50
“Debugging” passo a passo
Actores( nome, morada )
nome moradaNicole Kidman 26 Palm Dr., HollywoodBrad Pitt 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly HillsAngelina Jolie 12 Oak St., Hollywood
⇢ Actores2( nome2, morada2 ) (Actores)
nome2 morada2Nicole Kidman 26 Palm Dr., HollywoodBrad Pitt 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly HillsAngelina Jolie 12 Oak St., Hollywood
23 / 50
“Debugging” passo a passo (cont.)
Actores ⇥ Actores2nome morada nome2 morada 2Nicole Kidman 26 Palm Dr., Hollywood Nicole Kidman 26 Palm Dr., HollywoodNicole Kidman 26 Palm Dr., Hollywood Brad Pitt 12 Oak St., HollywoodNicole Kidman 26 Palm Dr., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsNicole Kidman 26 Palm Dr., Hollywood Angelina Jolie 12 Oak St., HollywoodBrad Pitt 12 Oak St., Hollywood Nicole Kidman 26 Palm Dr., HollywoodBrad Pitt 12 Oak St., Hollywood Brad Pitt 12 Oak St., HollywoodBrad Pitt 12 Oak St., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsBrad Pitt 12 Oak St., Hollywood Angelina Jolie 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Nicole Kidman 26 Palm Dr., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Brad Pitt 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Harrison Ford 789 Palm Dr., Beverly HillsHarrison Ford 789 Palm Dr., Beverly Hills Angelina Jolie 12 Oak St., HollywoodAngelina Jolie 12 Oak St., Hollywood Nicole Kidman 26 Palm Dr., HollywoodAngelina Jolie 12 Oak St., Hollywood Brad Pitt 12 Oak St., HollywoodAngelina Jolie 12 Oak St., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsAngelina Jolie 12 Oak St., Hollywood Angelina Jolie 12 Oak St., Hollywood
24 / 50
“Debugging” passo a passo (cont.)
� morada=morada2 (Actores ⇥ Actores2)
nome morada nome2 morada 2Nicole Kidman 26 Palm Dr., Hollywood Nicole Kidman 26 Palm Dr., HollywoodNicole Kidman 26 Palm Dr., Hollywood Brad Pitt 12 Oak St., HollywoodNicole Kidman 26 Palm Dr., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsNicole Kidman 26 Palm Dr., Hollywood Angelina Jolie 12 Oak St., HollywoodBrad Pitt 12 Oak St., Hollywood Nicole Kidman 26 Palm Dr., HollywoodBrad Pitt 12 Oak St., Hollywood Brad Pitt 12 Oak St., HollywoodBrad Pitt 12 Oak St., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsBrad Pitt 12 Oak St., Hollywood Angelina Jolie 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Nicole Kidman 26 Palm Dr., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Brad Pitt 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Harrison Ford 789 Palm Dr., Beverly HillsHarrison Ford 789 Palm Dr., Beverly Hills Angelina Jolie 12 Oak St., HollywoodAngelina Jolie 12 Oak St., Hollywood Nicole Kidman 26 Palm Dr., HollywoodAngelina Jolie 12 Oak St., Hollywood Brad Pitt 12 Oak St., HollywoodAngelina Jolie 12 Oak St., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsAngelina Jolie 12 Oak St., Hollywood Angelina Jolie 12 Oak St., Hollywood
25 / 50
“Debugging” passo a passo (cont.)
� morada=morada2 ^ nome,nome2 (Actores ⇥ Actores2)
nome morada nome2 morada 2Nicole Kidman 26 Palm Dr., Hollywood Nicole Kidman 26 Palm Dr., HollywoodNicole Kidman 26 Palm Dr., Hollywood Brad Pitt 12 Oak St., HollywoodNicole Kidman 26 Palm Dr., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsNicole Kidman 26 Palm Dr., Hollywood Angelina Jolie 12 Oak St., HollywoodBrad Pitt 12 Oak St., Hollywood Nicole Kidman 26 Palm Dr., HollywoodBrad Pitt 12 Oak St., Hollywood Brad Pitt 12 Oak St., HollywoodBrad Pitt 12 Oak St., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsBrad Pitt 12 Oak St., Hollywood Angelina Jolie 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Nicole Kidman 26 Palm Dr., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Brad Pitt 12 Oak St., HollywoodHarrison Ford 789 Palm Dr., Beverly Hills Harrison Ford 789 Palm Dr., Beverly HillsHarrison Ford 789 Palm Dr., Beverly Hills Angelina Jolie 12 Oak St., HollywoodAngelina Jolie 12 Oak St., Hollywood Nicole Kidman 26 Palm Dr., HollywoodAngelina Jolie 12 Oak St., Hollywood Brad Pitt 12 Oak St., HollywoodAngelina Jolie 12 Oak St., Hollywood Harrison Ford 789 Palm Dr., Beverly HillsAngelina Jolie 12 Oak St., Hollywood Angelina Jolie 12 Oak St., Hollywood
26 / 50
“Debugging” passo a passo (cont.)
⇡ nome1, nome2⇣� morada=morada2 ^ nome,nome2 (Actores ⇥ Actores2)
⌘
nome nome2Brad Pitt Angelina JolieAngelina Jolie Brad Pitt
Podemos fazer com que o mesmo par so apareca uma vez, colocandonome1 < nome2 (ou nome1 > nome2) em vez de nome1 , nome2.
27 / 50
“Debugging” passo a passo (cont.)
Para nao termos expressoes muito compridas, e util utilizarmos anotacao linear com relacoes intermedias.
Actores2( nome2, morada 2) B Actores
Temp B � morada=morada2 ^ nome<nome2 (Actores ⇥ Actores2)
Resultado B ⇡ nome, nome2 (Temp)
28 / 50
Operacoes sobre sacos (bags)
Um conjunto nao tem elementos repetidos.
Um saco pode ter.
Em ambos os casos a ordem dos elementos nao interessa.I {1,2,3} = {3,1,2}.I {1,1,2,3,1,3} = {3,2,1,1,3,1}.
29 / 50
Uniao, interseccao, e diferenca de sacos
Se R e S sao sacos, e um tuplo t ocorre n vezes em R e m vezes em S,entao:
t ocorre n + m vezes em R [ S.
t ocorre min(n,m) vezes em R \ S.
t ocorre max(0, n �m) vezes em R � S.
30 / 50
Exemplos
R
A B1 23 41 21 2
S
A B1 23 43 45 6
R [ S
A B1 23 41 21 21 23 43 45 6
R \ S
A B1 23 4
R � S
A B1 21 2
31 / 50
Projeccao de sacos
R
A B C1 2 53 4 61 2 71 2 8
⇡ A ,B (R)
A B1 23 41 21 2
32 / 50
Porque sacos em vez de conjuntos?
Operadores podem ser implementados de forma mais eficiente.
Exemplo: Projeccao. (SGBD nao necessita de verificar a existenciade tuplos repetidos).
Podemos querer calcular medias ou somas (ou outro tipo deestatıstica) aos componentes de um atributo.
33 / 50
Seleccao, produto cartesiano, joins
Identico ao caso de conjuntos.
R
A B1 21 2
S
B C2 34 54 5
R ⇥ S
A R .B S.B C1 2 2 31 2 4 51 2 4 51 2 2 31 2 4 51 2 4 5
R Z R .B < S.B (S)
A R .B S.B C1 2 4 51 2 4 51 2 4 51 2 4 5
34 / 50
Operadores extendidos de algebra relacional
1 Eliminacao de tuplos repetidos.
2 Operadores de agregacao (utilizados juntamente com o operador deagrupamento).
3 Agrupamento de tuplos.
4 Projeccao extendida.
5 Ordenacao.
6 Outerjoin.
35 / 50
Eliminacao de repetidos (�)
Converte um saco de tuplos num conjunto de tuplos.
R
A B1 23 41 21 2
�(R)
A B1 23 4
36 / 50
Operadores de agregacao
1 SUM
2 AVG
3 MIN e MAXI pode ser aplicado a valores numericos ou a strings de caracteres
(MIN=1o, MAX=ultimo, na ordem lexicografica)
4 COUNTI numero de valores de uma coluna (incluindo repetidos).
37 / 50
Exemplos
R
A B1 23 41 21 2
SUM(B) = 2+4+2+2 = 10
AVG(A) = (1+3+1+1)/4 = 1.5
MIN(A) = 1
MAX(A) = 3
COUNT(A) = 4
38 / 50
Agrupamento de tuplos (�)
Cria grupos de acordo com o valor de um ou mais atributos.
Pode-se aplicar agregacoes (SUM, AVG, MAX, . . .) a cada grupo.
Forma geral: �L(R).
L e uma lista de elementos, em que cada qual pode ser:I um atributo de R (sobre o qual R sera agrupado).
I uma agregacao aplicada a um atributo de R.
39 / 50
Como funciona?
A relacao obtida �L(R) e obtida por:1 separando os tuplos de R em grupos (um grupo para todos os tuplos
que tenham os mesmos valores nos atributos agrupados).
2 para cada grupo, produzir um tuplo que consiste em:I os valores dos atributos agrupados para esse grupo, e
I as agregacoes, relativas a cada grupo, para cada operador deagregacao que conste em L .
40 / 50
ExemploFilmes
nome ano duracao aCores estudioLion King 1994 122 true DisneyTotal Recall 1990 110 true FoxPocahontas 1995 115 true DisneyReturn of the Jedi 1983 165 true FoxGone With the Wind 1939 181 false ParamountDances with Wolves 1990 132 true Fox
Numero de filmes feito por estudio.� estudio, COUNT(nome) ! ’num. filmes’ (Filmes)
estudio num. filmesDisney 2Fox 3Paramount 1
41 / 50
Como funciona?
nome ano duracao aCores estudioLion King 1994 122 true DisneyPocahontas 1995 115 true DisneyTotal Recall 1990 110 true FoxReturn of the Jedi 1983 165 true FoxDances with Wolves 1990 132 true FoxGone With the Wind 1939 181 false Paramount
COUNT(nome) e aplicado a cada grupo.
42 / 50
Outro exemploFilmes
nome ano duracao aCores estudioLion King 1994 122 true DisneyTotal Recall 1990 110 true FoxPocahontas 1995 115 true DisneyReturn of the Jedi 1983 165 true FoxGone With the Wind 1939 181 false ParamountDances with Wolves 1990 132 true Fox
Duracao mınima e maxima dos filmes feitos por cada estudio numdeterminado ano.� estudio, ano, MIN(duracao) ! ’dur. mınima’, MAX(duracao) ! ’dur. maxima’ (Filmes)
estudio ano dur. mınima dur. maximaDisney 1994 122 122Disney 1995 115 115Fox 1983 165 165Fox 1990 110 132Paramount 1939 181 181
43 / 50
Como funciona?
nome ano duracao aCores estudioLion King 1994 122 true DisneyPocahontas 1995 115 true DisneyReturn of the Jedi 1983 165 true FoxTotal Recall 1990 110 true FoxDances with Wolves 1990 132 true FoxGone With the Wind 1939 181 false Paramount
grupos sao feitos para cada par de valores distintos em (estudio,ano).
para cada grupo, calcula-se MIN(duracao) e MAX(duracao).
44 / 50
Projeccao extendida, ⇡L(R)
Cada elemento de L pode ser:1 Um atributo de R.
2 Uma expressao x ! y(em que x e y sao nomes de atributos, equivalente a um “rename” dex para y).
3 Uma expressao E ! z(em que E pode envolver atributos de R, constantes, e operadoresaritmeticos e de strings).
45 / 50
Exemplo
R
A B C0 1 20 1 23 4 5
⇡A , B+C ! X (R)
A X0 30 33 9
46 / 50
Ordenacao, ⌧L(R)
Converte R para uma lista ordenada segundo os atributosespecificados na lista L .
Exemplo: ⌧B ,C(R) ordena os tuplos de R por B, e em caso deempate por C.
R
A B C5 3 58 1 73 4 58 1 03 4 32 1 0
⌧B ,C(R)
A B C8 1 02 1 08 1 75 3 53 4 33 4 5
47 / 50
Outerjoin (�Z)
Adiciona ao output tuplos que falham a condicao de join.
Esses tuplos ficam com o sımbolo null (?) nos atributos que naopossuem.
Existem variantes: Outer Join, Left Outer Join, Right Outer Join.
48 / 50
Exemplo
U
A B C1 2 34 5 67 8 9
V
B C D2 3 102 3 116 7 12
U�Z V
A B C D1 2 3 101 2 3 114 5 6 ?7 8 9 ?? 6 7 12
49 / 50
Left e Right Outerjoin (�ZL e
�ZR)
U
A B C1 2 34 5 67 8 9
V
B C D2 3 102 3 116 7 12
U�ZL V
A B C D1 2 3 101 2 3 114 5 6 ?7 8 9 ?
U�ZR V
A B C D1 2 3 101 2 3 11? 6 7 12
50 / 50
SQL: Interrogacoes simples
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 20
Structured Query Language (SQL)
E uma implementacao da algebra relacional incluindo os operadoresextendidos.
Contem um ou outro aspecto que nao existe em algebra relacional.
Para alem de operadores de interrogacao, contem comandos deinsercao, actualizacao e remocao de tuplos.
Contem tambem comandos de definicao de relacoes/tabelas.
E uma linguagem usada em praticamente todos os SGBDs.
2 / 20
Porque SQL?
E uma linguagem de muito alto nıvel.
Bem mais adequada para manipular relacoes do que linguagenscomo o C ou Java.
O programador apenas se tem de preocupar com o conceito derelacao/tabela.
Nao necessita de saber detalhes fısicos sobre,
1 o modo como as tabelas sao implementadas, e
2 o modo como as interrogacoes sao executadas.
As interrogacoes em SQL sao optimizadas pelo SGBD.
3 / 20
SQL tambem tem limitacoes
Nao e uma linguagem completa.
Nao se consegue calcular o factorial de um numero em SQL.
Mas consegue-se fazer programas de 5 linhas que necessitariam decentenas de linhas de codigo em C.
4 / 20
Vamos usar este esquema para a BD de filmes
Estudios(nome, morada)
Realizadores(nome, categoria)
Filmes(nome, ano, duracao, aCores, nomeEstudio, nomeRealizador)
Actores(nome, morada, sexo, dataNascimento)
Participa(nomeFilme, anoFilme, nomeActor)
5 / 20
Interrogacoes simples: SELECT-FROM-WHERE
SELECT atributosFROM uma ou mais relacoesWHERE condicao
SELECT nome
FROM Filmes
WHERE ano=1977;
6 / 20
SELECT-FROM-WHERE
Nao confundir SELECT com o operador de seleccao da algebrarelacional.
SELECT e equivalente a projeccao (⇡).
WHERE e equivalente a seleccao (�).
7 / 20
Operacao em termos de algebra relacional
SELECT nome
FROM Filmes
WHERE ano=1977;
1 Comecar com a relacao que aparece a seguir a FROM.
2 Aplicar o operador � usando a condicao do WHERE.
3 Aplicar o operador ⇡ usando os atributos de SELECT.
8 / 20
SQL versus Algebra Relacional
Quais os filmes feitos em 1977?
SQL
SELECT nome
FROM Filmes
WHERE ano=1977;
Algebra Relacional
⇡ nome
✓� ano = 1977 (Filmes)
◆
9 / 20
Outra maneira de pensar
SELECT nome
FROM Filmes
WHERE ano=1977;
Imaginem uma variavel que percorre todos os tuplos da relacao.
Verifica se satisfaz a condicao WHERE.
Se sim, envia os atributos especificados em SELECT para o output.
10 / 20
Asterisco da todos os atributos
SELECT *
FROM Participa
WHERE nomeFilme=’Moulin Rouge’;
nomeFilme anoFime nomeActorMoulin Rouge 2001 Nicole KidmanMoulin Rouge 2001 Ewan McGregorMoulin Rouge 2001 Jim Broadbent
11 / 20
Mudar o nome a colunas
utilizar AS ’<novo nome>’
SELECT nome AS ’nome do filme’
FROM Filmes
WHERE ano=1977;
nome do filmeStar WarsSaturday Night Fever...
12 / 20
Operadores logicos
a clausula WHERE pode ter operadores logicos (AND, OR, NOT)
pode-se usar os operadores relacionais habituais( = , <> , < , > , <= , >= )
SELECT nome, duracao
FROM Filmes
WHERE estudio=’Disney’ AND ano=1977;
13 / 20
Expressoes em SELECTs
pode-se usar expressoes como elementos da clausula SELECT.
SELECT nome, ano,
duracao/60 AS ’duracao em horas’
FROM Filmes;
nome ano duracao em horasStar Wars 1977 2.07Empire Strikes Back 1980 2.38Return of the Jedi 1983 2.75Moulin Rouge 2001 2.07
14 / 20
Padroes (pattern matching em strings)
a condicao WHERE pode especificar uma comparacao entre umastring e um padrao.
<atributo> LIKE <padrao><atributo> NOT LIKE <padrao>
um padrao e uma string em que % significa “0 ou mais caracteres” esignifica “apenas 1 caracter”.
15 / 20
Exemplo
Quais sao os filmes cujo nome contem a palavra King?
SELECT nome, ano
FROM Filmes
WHERE nome LIKE ’%King%’;
nome anoKing Kong 1933King Kong 1976Lion King 1994
16 / 20
SQL trabalha com sacos
SELECT nomeEstudio
FROM Filmes;
nomeEstudioFoxFoxFoxDisneyParamountDisney...
17 / 20
Usar DISTINCT para eliminar repetidos
SELECT DISTINCT(nomeEstudio)
FROM Filmes;
nomeEstudioFoxDisneyParamountUniversalWarner Brothers
18 / 20
Ordenacao de tuplos
ORDER BY <lista de atributos>
ordem crescente por defeito(colocar DESC para ordem decrescente)
ordem lexicografica para strings.
19 / 20
Exemplos
Filmes da Disney ordenados por ano, e dentro de cada ano, ordenadospor nome.
SELECT *
FROM Filmes
WHERE nomeEstudio=’Disney’
ORDER BY ano, nome;
Filmes da Disney ordenados por ordem decrescente de duracao, e emcaso de empate, ordenados por ordem crescente de nome.
SELECT *
FROM Filmes
WHERE nomeEstudio=’Disney’
ORDER BY duracao DESC, nome;
20 / 20
SQL: Definicao de tabelas, Modificacoes a Base deDados
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 24
Definicao do esquema da base de dados
O esquema da BD e composto pelas definicoes de todas as tabelasda BD.
Existem outros elementos (views, ındices, triggers) que tambemfazem parte do esquema e que veremos mais tarde.
2 / 24
Definicao de tabelasCREATE TABLE <nome> (
<lista de elementos>
);
Cada elemento consiste num atributo e no respectivo tipo de dados.
Os tipos mais comuns sao: INTEGER, FLOAT, BOOLEAN, CHAR(n),VARCHAR(n), DATE, TIME.
Exemplo:
CREATE TABLE Actores(
nome VARCHAR(50),
morada VARCHAR(70),
sexo CHAR,
dataNascimento DATE
);3 / 24
DATE e TIME
O formato de DATE e ’yyyy-mm-dd’
O formato de TIME e ’hh:mm:ss’. Podera ter ainda fraccoes desegundo.
Exemplos:
I DATE ’2003-04-25’(25 de Abril de 2003)
I TIME ’15:32:04.5’(4 segundos e meio depois das 3:32 da tarde)
4 / 24
Declaracao de chaves
Um atributo ou lista de atributos pode ser declarado como chave emSQL utilizando PRIMARY KEY ou UNIQUE.
Exemplo:
CREATE TABLE Actores(
nome VARCHAR(50) PRIMARY KEY,
morada VARCHAR(70),
sexo CHAR,
dataNascimento DATE
);
5 / 24
Declaracao de chaves (cont.)
No caso da chave ser composta, temos de especificar um elemento aparte.
Exemplo:
CREATE TABLE Filmes(
nome VARCHAR(50),
ano INTEGER,
duracao INTEGER,
aCores BOOLEAN,
nomeEstudio VARCHAR(30),
nomeRealizador VARCHAR(50),
PRIMARY KEY (nome,ano)
);
6 / 24
PRIMARY KEY versus UNIQUE
tambem se pode usar UNIQUE para especificar uma chave.
cada tabela so pode ter uma PRIMARY KEY, mas pode ter variosUNIQUEs.
os atributos declarados como PRIMARY KEY nao podem ser NULL,mas os declarados como UNIQUE podem (e ate podem ter variosNULLs).
7 / 24
Restricao NOT NULLPodemos forcar um atributo a nao poder ser NULL. Exemplo:
CREATE TABLE Alunos(
nome VARCHAR(50) NOT NULL,
numero CHAR(6) PRIMARY KEY,
bi CHAR(10) UNIQUE,
numContrib CHAR(10) UNIQUE,
morada VARCHAR(100)
);
-- ’bi’, ’numContrib’ e ’morada’ ficam com NULL
INSERT INTO Alunos(nome,numero)
VALUES (’To Tabelas’,’23384’);
-- SGBD rejeita porque ’nome’ nao pode ser NULL
INSERT INTO Alunos(numero,bi)
VALUES (’23384’,’7986866’);8 / 24
Chaves estrangeiras (integridade referencial)
Uma chave estrangeira e um conjunto de atributos que faz referenciaa um conjunto de atributos de uma outra tabela (eventualmente atepoderia ser a propria tabela).
Os atributos referenciados tem de ser uma chave da outra tabela(declarados como PRIMARY KEY ou UNIQUE), daı o nome chaveestrangeira.
Em SQL:
FOREIGN KEY( <lista de atributos> )
REFERENCES <tabela> ( <lista de atributos> )
9 / 24
ExemploParticipa(nomeFilme, anoFilme, nomeActor)
O valor do atributo nomeActor tem de existir na tabela de Actores.
A mesma coisa para o par {nomeFilme,anoFilme} relativamente atabela de Filmes.
CREATE TABLE Participa(
nomeFilme VARCHAR(50),
anoFilme INTEGER,
nomeActor VARCHAR(50),
PRIMARY KEY (nomeFilme,anoFilme,nomeActor),
FOREIGN KEY (nomeActor)
REFERENCES Actores(nome),
FOREIGN KEY (nomeFilme,anoFilme)
REFERENCES Filmes(nome,ano)
);
10 / 24
Forcar a integridade referencialParticipa:
nomeFilme anoFilme nomeActorThe Fugitive 1993 Harrison FordMoulin Rouge 2001 Nicole KidmanIndiana Jones 1981 Harrison Ford... ... ...
Actores:nome morada ...Nicole Kidman 26 Palm Dr., Hollywood ...Harrison Ford 789 Palm Dr., Beverly Hills ...Kevin Costner 88 Palm Dr., Hollywood ...... ... ...
Vamos substituir Harrison Ford por Fernando Lobo no filme “TheFugitive”. O que e que vai acontecer?
E se apagarmos a Nicole Kidman da tabela de Actores?11 / 24
Forcar a integridade referencial (cont.)
Um INSERT ou UPDATE na tabela Participa e rejeitado caso o actornao exista.
I O SGBD rejeita a substituicao de Harrison Ford por Fernando Lobo.
Um DELETE ou UPDATE a tabela de Actores pode fazer com quedetermindos valores na tabela Participa deixem de fazer sentido.
I Ex: Apagar a Nicole Kidman da tabela de Actores.
I Existem 3 alternativas possiveis de resolver o problema em SQL.
12 / 24
Forcar a integridade referencial (cont.)
As 3 alternativas sao:
1 rejeitar modificacoes (opcao por defeito em SQL).
2 SET NULL: nomeActor em Participa fica com NULL.
3 CASCADE: propagar as alteracoes.
I apagar actor da tabela de Actores=) SGBD apaga todos os tuplos de Participa que tenham esse
actor.
I actualizar actor na tabela de Actores=) SGBD actualiza todos os tuplos de Participa que tenham esse
actor.
13 / 24
Forcar a integridade referencial (cont.)
Quando declaramos uma chave estrangeira, podemos especificarSET NULL ou CASCADE, quer para “DELETEs” quer para“UPDATEs”.
Se nao o fizermos, o SGBD rejeita as modificacoes.
Sintaxe:
FOREIGN KEY( <lista de atributos> )
REFERENCES <tabela> ( <lista de atributos> )
ON UPDATE [SET NULL | CASCADE]
ON DELETE [SET NULL | CASCADE]
14 / 24
ExemploCREATE TABLE Participa(
nomeFilme VARCHAR(50),anoFilme INTEGER,nomeActor VARCHAR(50),PRIMARY KEY (nomeFilme,anoFilme,nomeActor),FOREIGN KEY (nomeActor)REFERENCES Actores(nome)ON UPDATE CASCADEON DELETE SET NULL,
FOREIGN KEY (nomeFilme,anoFilme)REFERENCES Filmes(nome,ano)
);
Se actualizarmos o nome de um actor na tabela de Actores, essamodificacao e propagada para todos os tuplos da tabela Participaque fazem referencia a esse actor.E se apagarmos um actor na tabela de Actores?SET NULL so faz sentido se a chave for declarada como UNIQUE.
15 / 24
Modificacoes a BD
Existem comandos para alterar o estado da BD.
Ao contrario dos SELECTs, os comandos de modificacao naoretornam uma tabela.
Existem 3 tipos de modificacoes:
1 INSERTinsere um ou mais tuplos.
2 DELETEapaga um ou mais tuplos.
3 UPDATEactualiza os valores de um ou mais tuplos.
16 / 24
INSERT
Para inserir um tuplo:
INSERT INTO <tabela> VALUES( <lista de valores> );
Exemplo:
INSERT INTO Actores VALUES (
’Nicole Kidman’,
’26 Palm Dr., Hollywood’,
’f’,
’1969-11-14’
);
17 / 24
INSERT (cont.)
Pode-se especificar uma lista de atributos.
Dois motivos para o fazer:
1 quando nao nos lembramos da ordem pela qual os atributos foramdefinidos na criacao da tabela.
2 quando nao temos todos os valores e queremos que o SGBDpreencha os atributos em falta com NULL (ou com um valor pordefeito).
Para especificar um valor por defeito faz-se:
<atributo> <tipo> DEFAULT <valor>
18 / 24
ExemploSe a tabela de filmes for definida assim:
CREATE TABLE Filmes(
nome VARCHAR(50),
ano INTEGER,
duracao INTEGER,
aCores BOOLEAN DEFAULT true,
nomeEstudio VARCHAR(30),
PRIMARY KEY (nome,ano)
);
e se fizermos,
INSERT INTO Filmes(nome,ano,nomeEstudio)
VALUES(’Lion King’,1994,’Disney’);
duracao fica com NULL, aCores fica com True.19 / 24
Inserir varios tuplos de uma vez so
Podemos inserir o resultado de uma query numa tabela.
INSERT INTO <tabela> ( <subquery> );
Exemplo: Inserir na tabela de actores todos os actores que tenhamparticipado nalgum filme.
INSERT INTO Actores(nome) (
SELECT DISTINCT nomeActor
FROM Participa
);
I morada dos actores fica com NULL.
20 / 24
DELETEPara apagar tuplos que satisfacam uma determinada condicao devefazer-se:
DELETE FROM <tabela> WHERE <condicao>;
Exemplo 1: Apagar todos os filmes cuja duracao seja inferior a 120minutos.
DELETE FROM Filmes WHERE duracao < 120;
Exemplo 2: Apagar todos os filmes.
DELETE FROM Filmes;
21 / 24
UPDATEPara actualizar tuplos de uma tabela deve fazer-se:
UPDATE <tabela>
SET <lista de atribuicoes>
WHERE <condicao>;
Exemplo 1: Actualizar a duracao do filme King Kong realizado em1976 para 127 minutos.
UPDATE Filmes
SET duracao = 127
WHERE nome = ’King Kong’ AND ano = 1976;
Exemplo 2: Passar todos os filmes anteriores a 1970 para preto ebranco.
UPDATE Filmes SET aCores = false WHERE ano < 1970;
22 / 24
Modificar a definicao de uma tabela
Retirar a coluna aCores da tabela de Filmes.
ALTER TABLE Filmes DROP aCores;
Voltar a colocar a coluna aCores.
ALTER TABLE Filmes ADD aCores BOOLEAN;
-- aCores fica com NULL
23 / 24
Eliminar tabelas
Utilizar DROP TABLE.
-- apaga a tabela de filmes
DROP TABLE Filmes;
Qual a diferenca entre estas duas instrucoes?
DROP TABLE Filmes;
DELETE FROM Filmes;
24 / 24
SQL: Joins e operacoes sobre conjuntos
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 11
Interrogacoes que envolvem mais do que uma tabela(produto cartesiano e Joins)
Pode-se combinar informacao de varias relacoes.
Coloca-se o nome das relacoes a seguir a FROM.
Atributos com o mesmo nome distinguem-se por<Nome da Relacao>.<Atributo>
2 / 11
Operacao em termos de algebra relacional
E semelhante as interrogacoes feitas a uma so relacao:
1 Comeca com o produto cartesiano das relacoes que aparecem aseguir a FROM.
2 Aplica o operador � usando a condicao do WHERE.
3 Aplica o operador ⇡ usando os atributos de SELECT.
3 / 11
Outra maneira de pensar
Imaginem ’n’ variaveis, uma para cada relacao. Cada variavel percorre ostuplos de uma relacao (em todas as combinacoes possıveis como sefossem loops encadeados).
Verifica se satisfaz a condicao WHERE.
Se sim, envia os atributos especificados em SELECT para o output.
4 / 11
Interpretacao em termos de loops encadeados
SELECT A1,A2,...,Ak
FROM R1,R2,...,Rn
WHERE C;
for each t1 in R1 do
for each t2 in R2 do
...
for each tn in Rn do
if( condicao C e verdadeira quando substituimos
t1,t2,...,tn pelos tuplos respectivos )
then
envia os valores das colunas
A1,A2,...Ak para o output.
5 / 11
Exemplo
Qual o nome, ano, e duracao de todos os filmes do Harrison Ford?
SELECT nome, ano, duracao
FROM Filmes, Participa
WHERE nome = nomeFilme
AND ano = anoFilme
AND nomeActor = ’Harrison Ford’;
nome ano duracaoThe Fugitive 1993 120Indiana Jones 1981 130
6 / 11
Exemplo (cont.)
==
nome ano duracao ... nomeFilme anoFilme nomeActor
I. Jones 1981 ...
Fugitive 1993 120
...
...
M.Rouge 2001 124
130
M.Rouge
M.Rouge
Fugitive
I. Jones 1981
2001
2001
1993
N. Kidman
H. Ford
E. McGregor
H. Ford
f
p
’H. Ford’
7 / 11
Self Joins
Por vezes e necessario usar mais do que uma copia da mesmatabela.
Distingue-se cada copia por um sinonimo.
Exemplo: Quais os actores que tem a mesma morada?
SELECT A1.nome, A2.nome
FROM Actores AS A1, Actores AS A2
WHERE A1.morada = A2.morada
AND A1.nome < A2.nome;
A1.nome A2.nomeAlec Baldwin Kim BasingerAngelina Jolie Brad Pitt
8 / 11
Interpretacao em termos de loops encadeados
FOR EACH A1 in Actores DO
FOR EACH A2 in Actores DO
IF A1.morada = A2.morada AND
A1.nome < A2.nome
THEN
output (A1.nome, A2.nome)
9 / 11
Operacoes sobre conjuntos(uniao, interseccao, diferenca)
(subquery) UNION (subquery)
(subquery) INTERSECT (subquery)
(subquery) EXCEPT (subquery)
10 / 11
ExemploQuais os filmes a preto e branco em que participou o Jack Nicholson?
Solucao possıvel:
1 Encontrar todos os filmes a preto e branco.
2 Encontrar todos os filmes do Jack Nicholson.
3 Fazer a intereseccao dos resultados.
(SELECT nome, anoFROM FilmesWHERE aCores = FALSE
)INTERSECT(SELECT nomeFilme, anoFilmeFROM ParticipaWHERE nomeActor = ’Jack Nicholson’
);11 / 11
SQL: Logica a 3 valores, joins explıcitos
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 16
Valores NULL
Valor desconhecido ou inaplicavel.
I Ex 1: Nao se conhece a duracao de um filme.
I Ex 2: Valor do atributo mulher/marido de uma pessoa solteira.
Da origem a um comportamento estranho em SQL.
Logica a 3 valores: True, False, Unknown.
2 / 16
Operacoes envolvendo valores NULL
Se x tiver o valor NULL, entao:
1 x + qqcoisa = NULL(a mesma coisa para �, ⇤, /).
2 Quando comparamos x com outro valor, o resultado e Unknown.
3 / 16
Logica com 3 valores
Como e que funcionam os operadores logicos AND, OR, e NOT,numa logica com 3 valores?
True=1, False=0, Unknown= 12
a AND b = min(a, b)a OR b = max(a, b)NOT a = 1�a
4 / 16
Logica com 3 valores (cont.)
Exemplo:
True AND (False OR NOT(Unknown))= min(1, max(0, (1 - 1
2 )))= min(1, max(0, 1
2 )= min(1, 1
2 )= 1
2= Unknown
5 / 16
Logica com 3 valores (cont.)
nome ano duracaoStar Wars 1977 124King Kong 1933 NULLReturn of the Jedi 1983 165
SELECT * FROM Filmes
WHERE duracao<100 OR duracao>=100;
“King Kong” nao aparece no output.
NULL<100 = Unknown.NULL>=100 = Unknown.Unknown OR Unknown = Unknown.
Para o output so vao os tuplos para os quais a clausula WHERE temo valor True.
6 / 16
Logica com 3 valores (cont.)
Para verificar se um atributo x tem ou nao o valor NULL, deveutilizar-se: x IS NULL (ou x IS NOT NULL).
-- Errado
SELECT *
FROM Filmes
WHERE duracao=NULL;
-- Correcto
SELECT *
FROM Filmes
WHERE duracao IS NULL;
7 / 16
Joins explıcitos
podemos fazer joins usando a formaSELECT-FROM-WHERE.
mas tambem podemos utilizar expressoes de JOIN explıcitas.
essas expressoes aparecem na clausula FROM.
8 / 16
Produto cartesiano (CROSS JOIN)
SELECT *
FROM Filmes, Estudios;
e equivalente a:
SELECT *
FROM Filmes CROSS JOIN Estudios;
9 / 16
Theta Join (JOIN . . . ON)
SELECT *
FROM Filmes, Participa
WHERE nome = nomeFilme
AND ano = anoFilme;
e equivalente a:
SELECT *
FROM Filmes JOIN Participa ON
nome = nomeFilme AND ano = anoFilme;
10 / 16
Natural Join
SELECT Actores.*, categoria
FROM Actores, Realizadores
WHERE Actores.nome = Realizadores.nome
e equivalente a:
SELECT *
FROM Actores NATURAL JOIN Realizadores;
O que significa esta interrogacao em Portugues corrente?
11 / 16
Outerjoins
adiciona ao output os tuplos que nao conseguem fazer “join”.
esses tuplos ficam com NULL nos restantes atributos.
em SQL: OUTER JOIN.
existem variantes do OUTER JOIN:
I LEFT: os tuplos da 1a tabela vao para o output.
I RIGHT: os tuplos da 2a tabela vao para o output.
I FULL: os tuplos de ambas as tabelas vao para o output.
12 / 16
Exemplos
--
-- actores que nao sao realizadores aparecem
-- com categoria NULL. Realizadores que nao
-- sao actores aparecem com morada, sexo, e
-- data de nascimento a NULL.
--
SELECT *
FROM Actores NATURAL FULL OUTER JOIN Realizadores;
13 / 16
Exemplos (cont.)
--
-- filmes sem actores aparecem no output
-- actores sem filmes tambem.
--
SELECT *
FROM Filmes FULL OUTER JOIN Participa ON
nome = nomeFilme AND ano = anoFilme;
14 / 16
Exemplos (cont.)
--
-- Filmes sem actores aparecem no output,
-- mas actores que nao tenham participado
-- em filmes nao aparecem.
--
SELECT *
FROM Filmes LEFT OUTER JOIN Participa ON
nome = nomeFilme AND ano = anoFilme;
15 / 16
Exemplos (cont.)
--
-- Actores que nunca participaram em nenhum
-- filme aparecem no output, mas os filmes
-- sem actores nao aparecem.
--
SELECT *
FROM Filmes RIGHT OUTER JOIN Participa ON
nome = nomeFilme AND ano = anoFilme;
16 / 16
SQL: Subqueries
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 15
Subqueries
podemos ter uma query dentro de outra query.
uma expressao do tipo SELECT-FROM-WHERE entre parentesis euma subquery.
o resultado de uma subquery e uma tabela.
pode ser usada em varios locais, incluindo as clausulas FROM eWHERE.
2 / 15
Subqueries que retornam um tuplo
Se a subquery retorna apenas um tuplo, entao podemos usa-la como sefosse um valor.
um tuplo unico e geralmente garantido atraves do conceito de chave.
obtem-se um erro de execucao se nao existir nenhum tuplo, ou seexistir mais do que um tuplo.
caso mais habitual: tuplo com um so atributo.
3 / 15
Exemplo
Qual a morada do estudio que fez o Star Wars de 1977?
abordagem 1: fazer um join de estudios com filmes.
abordagem 2: decompor o problema em dois. Primeiro, encontrar onome do estudio que fez o Star Wars de 1977. Depois encontrar amorada desse estudio.
4 / 15
Abordagem 1
Qual a morada do estudio que fez o Star Wars de 1977?
SELECT morada
FROM Estudios, Filmes
WHERE Estudios.nome = Filmes.nomeEstudio
AND Filmes.nome = ’Star Wars’
AND Filmes.ano = 1977;
5 / 15
Abordagem 2Qual a morada do estudio que fez o Star Wars de 1977?
SELECT morada
FROM Estudios
WHERE nome = (
SELECT nomeEstudio
FROM Filmes
WHERE nome = ’Star Wars’
AND ano = 1977
);
reparem na “scoping rule” de nome.
o primeiro nome e o nome do estudio, o segundo nome e o nome dofilme.
subquerie (SELECT nomeEstudio ...) produz um so tuplo. Porque?6 / 15
Subqueries que retornam mais do que um tuplo
E se o resultado da subquery tiver mais do que 1 tuplo?
. . . tambem se pode usar subqueries recorrendo a um destes 4operadores:
1 IN
2 EXISTS
3 ALL
4 ANY
7 / 15
Operador IN
IN e equivalente a 2
tuplo IN tabela e verdadeiro se e so se o tuplo pertencer a tabela.
I tuplo NOT IN tabela significa o oposto.
IN pode aparecer na clausula WHERE.
a tabela e normalmente uma subquery.
8 / 15
Exemplo
Qual a morada dos estudios que ja produziram filmes a preto ebranco?
SELECT morada
FROM Estudios
WHERE nome IN (
SELECT nomeEstudio
FROM Filmes
WHERE aCores=FALSE
);
9 / 15
Outro exemplo
O operador IN tambem pode ser aplicado a tuplos.
I Quais sao os estudios que ja produziram filmes do Harrison Ford?
I Primeiro encontramos os filmes do Harrison Ford. Depois temos deencontrar os estudios que produziram esses filmes.
SELECT nomeEstudio
FROM Filmes
WHERE (nome,ano) IN
(
SELECT nomeFilme, anoFilme
FROM Participa
WHERE nomeActor = ’Harrison Ford’
);
10 / 15
Operador EXISTS
EXISTS(tabela) e verdadeiro se e so se a tabela nao e vazia.
I NOT EXISTS(tabela) significa o oposto.
EXISTS pode aparecer na clausula WHERE.
11 / 15
ExemploQuais os estudios que produziram mais do que 1 filme?
SELECT DISTINCT nomeEstudio
FROM Filmes AS f
WHERE EXISTS
(
SELECT *
FROM Filmes
WHERE nomeEstudio = f.nomeEstudio
AND NOT (ano = f.ano AND nome = f.nome)
);
a query acima e uma “correlated subquery”.
subquery da o conjunto de filmes que tem o mesmo estudio que f,mas excluindo o proprio f.
reparem novamente na “scoping rule” dos atributos.12 / 15
Operador IN
ALL e ANY sao usados juntamente com os operadores relacionais =,>, >=, . . .
x > ALL( tabela ) e verdadeiro se e so se x for maior do que todos ostuplos da tabela.
x < ANY( tabela ) e verdadeiro se e so se x for menor do quepelo menos um tuplo da tabela.
I em vez de ’>’ e ’<’ podemos utilizar qualquer operador relacional.
I os tuplos da tabela tem de ter apenas um atributo.
13 / 15
Exemplo
Qual o filme com a maior duracao?
SELECT nome, ano
FROM Filmes
WHERE duracao >= ALL (
SELECT duracao
FROM Filmes
WHERE duracao IS NOT NULL
);
Ha que ter cuidado com os NULLs. Porque?
14 / 15
Outro exemploQuais os filmes que nao tem a maior duracao?
SELECT nome, anoFROM FilmesWHERE NOT duracao >= ALL (
SELECT duracaoFROM FilmesWHERE duracao IS NOT NULL
);
Ou entao:
SELECT nome, anoFROM FilmesWHERE duracao < ANY (
SELECT duracaoFROM FilmesWHERE duracao IS NOT NULL
);
15 / 15
SQL: Agregacoes
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 15
Agregacoes
os operadores SUM, MIN, MAX, AVG, e COUNT, podem seraplicados a um atributo de uma tabela.
os operadores aparecem na clausula SELECT. O resultado e umvalor agregado para o respectivo atributo.
COUNT(*) conta o numero de tuplos.
2 / 15
ExemplosQual a duracao media dos filmes da Disney?
SELECT AVG(duracao)
FROM Filmes
WHERE nomeEstudio = ’Disney’;
avg113.667
Quantos actores existem na tabela de Actores?
SELECT COUNT(*) FROM Actores;
count18
3 / 15
NULLs sao ignorados
um valor NULL nao conta para uma soma, media ou contagem.
um valor NULL nunca pode ser o mınimo ou maximo de uma coluna.
mas se todos os valores de uma coluna forem NULL, entao oresultado da agregacao e NULL.
4 / 15
Exemplo
--
-- numero de filmes da Disney
--
SELECT COUNT(*)
FROM Filmes
WHERE nomeEstudio = ’Disney’;
--
-- numero de filmes da Disney
-- cuja duracao e conhecida
--
SELECT COUNT(duracao)
FROM Filmes
WHERE nomeEstudio = ’Disney’;
5 / 15
Agrupar
apos um SELECT-FROM-WHERE podemos utilizar GROUP BYseguido de uma lista de atributos.
o resultado do SELECT-FROM-WHERE e agrupado de acordo comos valores desses atributos.
as agregacoes sao aplicadas a cada grupo.
6 / 15
Exemplo
Quantos filmes e que cada estudio ja produziu?
SELECT nomeEstudio, COUNT(*)
FROM Filmes
GROUP BY nomeEstudio;
nomeEstudio countDisney 3Fox 8Paramount 5Universal 5Warner Brothers 1
7 / 15
Como funciona?
nome ano duracao aCores nomeEstudio
Mighty Ducks 1991 104 t DisneyLion King 1994 122 t DisneyPocahontas 1995 115 t DisneyStar Wars 1977 124 t FoxEmpire Strikes Back 1980 143 t FoxReturn of the Jedi 1983 165 t FoxTotal Recall 1990 110 t FoxTop Gun 1986 145 t FoxMoulin Rouge 2001 124 t FoxJFK 1996 130 t FoxDances with Wolves 1990 132 t FoxWayne’s World 1992 95 t ParamountAddams Family 1991 102 t ParamountGone With the Wind 1939 181 f ParamountBasic Instinct 1986 100 t ParamountEyes Wide Shut 1999 148 t ParamountKing Kong 1933 f UniversalKing Kong 1976 130 t UniversalIndiana Jones 1981 130 t UniversalThe Fugitive 1993 120 t UniversalBridges of Madison County 1995 147 t UniversalBatman Returns 1992 122 t Warner Brothers
COUNT(*) e aplicado a cada grupo.
8 / 15
Outro exemplo
Quantos filmes e que cada actriz fez?
SELECT nomeActor AS ’actriz’, COUNT(*)
FROM Participa, Actores
WHERE nomeActor = nome
AND sexo=’f’
GROUP BY nomeActor;
actriz countCarrie Fisher 3Dana Carvey 1Meryl Streep 1Michelle Pfeiffer 1Nicole Kidman 2Sharon Stone 2
9 / 15
Mais um exemplo
Qual a duracao maxima e mınima de cada estudio?
SELECT nomeEstudio AS ’estudio’,
MAX(duracao), MIN(duracao)
FROM Filmes
GROUP BY nomeEstudio;
estudio max minDisney 122 104Fox 165 110Paramount 181 95Universal 147 120Warner Brothers 122 122
10 / 15
Restricoes nos elementos a especificar em SELECT
se usarmos um operador de agregacao, entao cada elementoespecificado em SELECT tem de ser:
1 uma agregacao, ou
2 um atributo especificado em GROUP BY.
11 / 15
Exemplo de um query invalido
Qual a filme da Disney com maior duracao?
-- incorrecto
SELECT nome, MAX(duracao)
FROM Filmes
WHERE nomeEstudio=’Disney’;
a query e invalida.
nome nao e uma agregacao, e tambem nao aparece especificado emGROUP BY.
12 / 15
Porque e que e invalido?
-- incorrecto
SELECT nome, MAX(duracao)
FROM Filmes
WHERE nomeEstudio=’Disney’;
nome ano duracao nomeEstudio . . .
Mighty Ducks 1991 104 Disney . . .Lion King 1994 122 Disney . . .Pocahontas 1995 115 Disney . . .
MAX(duracao)! 122.nome! ???
Nao faz sentido seleccionar nome.
13 / 15
Clausula HAVING
podemos ter HAVING <condicao> a seguir a uma clausula GROUPBY.
a condicao e aplicada a cada grupo.
os grupos que satisfazem a condicao vao para o output, os outrossao eliminados.
14 / 15
Exemplo
Quais as actrizes que fizeram mais do que 1 filme?
SELECT nomeActor AS ’actriz’, COUNT(*)
FROM Participa, Actores
WHERE nomeActor = nome
AND sexo=’f’
GROUP BY nomeActor
HAVING COUNT(*) > 1;
actriz countCarrie Fisher 3Nicole Kidman 2Sharon Stone 2
15 / 15
SQL: Vistas, Indices, Autorizacao, Restricoes
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 20
Vistas
Uma vista (view em ingles) e uma “tabela virtual”.
Nao existe fisicamente na BD.
E definida a custa de outras tabelas ou views.
Sintaxe: CREATE VIEW <nome> AS <query>;
2 / 20
ExemploCriar uma view que da o nome, ano e duracao de todos os filmes daDisney.
CREATE VIEW filmes_disney (nome,ano,realizador) AS
SELECT nome, ano, nomeRealizador
FROM Filmes
WHERE nomeEstudio = ’Disney’;
Agora, podemos fazer queries a view filmes disney tal e qual comese fosse uma tabela.
-- Quais os filmes da Disney feitos nos anos 90?
SELECT *
FROM filmes_disney
WHERE ano>=1990 AND ano<2000;
3 / 20
Outro exemplo
CREATE VIEW filmes_actores (filme, ano, estudio,
realizador, actor) AS
SELECT F.nome, F.ano, F.nomeEstudio,
F.nomeRealizador, P.nomeActor
FROM Filmes AS F, Participa AS P
WHERE F.nome = P.nomeFilme
AND F.ano = P.anoFilme;
Quais os estudios que ja trabalharam com a Nicole Kidman?
SELECT estudio
FROM filmes_actores
WHERE actor = ’Nicole Kidman’;
4 / 20
Indices
Um ındice e uma estrutura de dados que e utilizada para acelerar aspesquisas.
Os ındices aceleram as pesquisas mas tornam mais lentos osinserts, deletes, e updates.
I porque o SGBD para alem de modificar tabelas, tambem tem demodificar a estrutura de dados.
Muitos SGBDs criam ındices automaticamente para as chavesprimarias. PostgreSQL faz isso.
5 / 20
Indices (cont.)
Vamos supor que temos de procurar muitas vezes por filmes cujaduracao seja maior que x minutos.
Se nao tivermos um ındice, o SGBD tera de fazer uma pesquisasequencial por todos os tuplos da tabela.
Se tivermos um ındice para o atributo duracao, o SGBD poderautilizar um metodo de pesquisa mais sofisticado.
-- criar um ındice para ’duracao’
CREATE INDEX IndiceDuracao ON Filmes(duracao);
-- apagar o ındice
DROP INDEX IndiceDuracao;
6 / 20
Permissoes/Autorizacao
Cada objecto da BD tem um dono (o utilizador que criou o objecto).
Por exemplo, se o utilizador ’ronaldo’ criar a tabela de filmes, apenaso ’ronaldo’ pode aceder e modificar os dados dessa tabela.
O SQL oferece um mecanismo de permissoes de modo a que o’ronaldo’ possa dar permissoes a outros utilizadores.
7 / 20
Permissoes/Autorizacao (cont.)
Em SQL usa-se o comando GRANT. Existe varios tipos de permissoes:
SELECT
INSERT
DELETE
UPDATE
8 / 20
Exemplos
Dar permissao ao utilizador mourinho para fazer SELECTs na tabela defilmes.
GRANT SELECT, UPDATE ON Filmes TO mourinho;
Dar permissao ao utilizador mourinho para fazer SELECTs, e UPDATEsapenas a coluna aCores
GRANT SELECT, UPDATE(aCores) ON Filmes TO mourinho;
9 / 20
Exemplos
Dar todas as permissoes (SELECT, DELETE e UPDATE) ao utilizadormourinho para aceder e/ou modificar a tabela de filmes.
GRANT ALL ON Filmes TO mourinho;
Tambem se pode dar permissoes a varios utilizadores.
GRANT SELECT ON Filmes
TO mourinho, ronaldo, quaresma;
Tambem se pode dar permissoes a todos os utilizadores.
GRANT SELECT ON Filmes TO PUBLIC;
10 / 20
Permissoes/Autorizacao (cont.)
O comando REVOKE retira as permissoes.
O comando REVOKE retira as permissoes.
Exemplo:
REVOKE SELECT ON Filmes TO mourinho;
11 / 20
Restricoes
PRIMARY KEY
UNIQUE
NOT NULL
FOREIGN KEY
12 / 20
Mais restricoes
Podemos ainda,
Restringir valores ao nıvel do atributo.
Restringir valores ao nıvel do tuplo.
Restringir valores para a BD em geral.
13 / 20
Restricoes ao nıvel do atributo
Coloca-se CHECK( <condicao> ) a seguir a definicao do atributo.
A condicao pode referir o nome do respectivo atributo. Apenas podereferir outros atributos ou outras tabelas num subquery.
Exemplo:
CREATE TABLE Actores(
...
sexo CHAR CHECK (sexo IN (’F’,’M’)),
nomeEstudio VARCHAR(30) CHECK (
nomeEstudio IN (SELECT nome FROM Estudios)),
...
);
14 / 20
Restricoes ao nıvel do atributo (cont.)
O check so e verificado quando existe um insert ou update noatributo respectivo.
Ex 1: CHECK(sexo IN (’F’,’M’)) e verificado cada vez que ha uminsert ou update ao valor de sexo.
I se o valor nao for ’F’ nem ’M’, o SGBD rejeita a modificacao.
Ex 2: CHECK(nomeEstudio IN (SELECT nome FROM Estudios))nao e verificado se apagarmos um estudio da tabela de Estudios.
I e diferente de uma chave estrangeira.
15 / 20
Restricoes ao nıvel do tuplo
Podemos ter um CHECK( <condicao> ) como um elemento a partena definicao de uma tabela.
A condicao pode referir-se a qualquer atributo da tabela. Apenaspode referir outros atributos ou outras tabelas num subquery.
Novamente, o check so e verificado em inserts e updates.
Se a condicao do check for falsa, o insert ou update do respectivotuplo e rejeitado.
16 / 20
Exemplo
Os filmes anteriores a 1939 nao podem ser a cores.
CREATE TABLE Filmes(
...
CHECK (NOT (ano<1939 AND aCores=TRUE))
);
17 / 20
Restricoes para a BD em geral (Assercoes)
Uma assercao e uma restricao mais geral que pode especificarvarias tabelas.
Uma vez definida, a assercao faz parte do esquema da BD.
As assercoes sao verificadas cada vez que ha uma modificacao noestado da BD.
Nao esta implementado em PostgreSQL nem em MySQL.
CREATE ASSERTION <nome>
CHECK ( <condicao> );
18 / 20
Exemplo
Nao pode haver realizadores que tambem sejam actores (este exemplo eobviamente fictıcio)
CREATE ASSERTION NaoHaActoresRealizadores
CHECK( NOT EXISTS
(SELECT nome FROM Actores
INTERSECT
SELECT nome FROM Realizadores
)
);
19 / 20
Outro exemplo
A duracao media de todos os filmes de um determinado estudio nao podeexceder 200 minutos.
CREATE ASSERTION DuracaoMedia
CHECK( 200 >= ALL
(SELECT AVG(duracao)
FROM Filmes
GROUP BY nomeEstudio
)
);
Com um ’check’ ao nıvel da tabela de filmes, a restricao poderiafalhar quando houvesse ’deletes’, visto que as restricoes ao nıvel databela apenas sao testadas em ’inserts’ e ’updates’.
20 / 20
Desenvolvimento de aplicacoes com SQL
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 15
Desenvolvimento de aplicacoes
Ate agora temos dado comandos de SQL de forma interactiva numinterpretador de comandos.
Quando se desenvolve aplicacoes utilizamos uma linguagemconvencional, como C ou Java, e incorporamos comandos de SQL.
2 / 15
Utilizacao de SQL em programas
O mais comum e utilizar-se uma Application Programming Interface(API)
Vamos ver alguns exemplos em Java, disponıveis na pagina web dadisciplina.
3 / 15
Programas em Java com SQL
O mais comum e usar JDBC ! Java Database Connectivity.
JDBC e uma API que facilita a escrita de programas em Java comSQL.
4 / 15
JDBC
JDBC e uma coleccao de classes e interfaces.
E necessario usar um driver especıfico para um SGBD concreto.
Usa-se a classe DriverManager para estabelecer uma conexao a umabase de dados.
5 / 15
Arquitectura JDBC
Imagem retirada do livro PostgreSQL de Kerry Douglas e Susan Douglas.
6 / 15
Passos necessarios
1 Importar o package java.sql
import java.sql.*;
2 Carregar o driver apropriado. Para PostgreSQL,
Class.forName("org.postgresql.Driver");
7 / 15
3 Estabelecer uma conexao a uma BD. Exemplo para uma conexaolocal.
String url = "jdbc:postgresql://localhost:5432/filmes";
Connection c = DriverManager.getConnection(url);
Exemplo de url para uma conexao remota,
String url = "jdbc:postgresql://www.mysite.com/filmes";
8 / 15
4 Criar um objecto da classe Statement. Utiliza-se o metodocreateStatement do objecto da classe Connection.
Statement stmt = c.createStatement();
9 / 15
5 Executar um Query ou um Update.
I Update em JDBC refere-se a qualquer operacao que altere o estado dabase de dados.
I Pode ser um comando SQL de UPDATE, INSERT, DELETE, CREATETABLE, etc.
A classe Statement tem os metodos
I executeQuery
I executeUpdate
10 / 15
Exemplos
executeQuery retorna um objecto da classe ResultSet
String cmd = "SELECT nome, ano, duracao " +
"FROM filmes " +
"WHERE nomeEstudio=’Universal’;";
ResultSet rs = stmt.executeQuery(cmd);
executeUpdate retorna o numero de linhas afectadas pela operacao
String cmd = "INSERT INTO estudios(nome,morada) " +
"VALUES(’UAlg’, ’Campus de Gambelas’);";
int nrows = stmt.executeUpdate(cmd);
11 / 15
5 Iterar sobre o ResultSet
I ResultSet tem uma serie de metodos.
I Tipicamente usa-se o metodo next() dentro de um ciclo while paraiterar sobre os tuplos/linhas do ResultSet
I Em cada iteracao usamos metodos (getString, getInt, getFloat,etc) consoante o tipo de dados apropriado, para aceder aoscomponentes de um tuplo.
ResultSet rs = stmt.executeQuery(cmd);while ( rs.next() ) {
String nome = rs.getString("nome");int ano = rs.getInt("ano");...
}
12 / 15
6 Fechar os objectos criados
rs.close();
stmt.close();
c.close();
13 / 15
Exemplos
Vejamos alguns exemplos, disponıveis na pagina web da disciplina.
prog1.java
insereEstudioUalg.java
insereEstudio.java
printStarWars1977.java
printFilmesUniversal.java
printFilmesDeEstudio.java
14 / 15
Mais informacao
Ha muito mais detalhes que nao vimos.
Pesquisar por JDBC no google.
Para SGBDs concretos, pesquisar de forma apropriada (Java withPostgreSQL, Java with MySQL, etc.)
15 / 15
Triggers e Regras
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 21
Triggers
Um trigger permite que uma determinada sequencia de comandos
SQL seja accionada quando um determinado evento ocorre.
O evento pode ser INSERT, UPDATE, ou DELETE.
O trigger pode ser accionado imediatamente antes (BEFORE) ou
imediatamente depois (AFTER) de cada evento.
2 / 21
Triggers
A sequencia de comandos (procedimento) pode ser programada
numa linguagem qualquer desde que devidamente instalada no
servidor do SGBD.
No exemplo que se segue, vamos utilizar PL/pgSQL, uma linguagem
procedimental que vem instalada no PostgreSQL e que e muito
semelhante a linguagem PL/SQL da Oracle.
3 / 21
Exemplo 1
Ao inserir um filme pretende-se que a duracao seja truncada para 300
minutos no caso de se tentar inserir um valor superior.
Associamos um trigger a tabela de filmes.
O trigger sera accionado imediatamente antes de um INSERT ou
UPDATE a tabela de filmes.
Ao ser disparado, o trigger ira executar um procedimento chamado
td300()
CREATE TRIGGER trunca_duracaoBEFORE INSERT OR UPDATEON FilmesFOR EACH ROW
EXECUTE PROCEDURE td300();
4 / 21
Exemplo 1 (cont.)
O procedimento verifica se a duracao do(s) filme(s) a serem inseridos
ou modificados e maior do que 300. Em caso afirmativo forca a
duracao a ser 300.
CREATE OR REPLACE FUNCTION td300() RETURNS TRIGGER AS $$BEGINIF NEW.duracao > 300 THENNEW.duracao := 300;
END IF;RETURN NEW;
END;$$ LANGUAGE plpgsql;
5 / 21
NEW e OLD
Quando o evento e um INSERT, UPDATE ou DELETE, podemos
fazer referencia a duas pseudo-tabelas, NEW e OLD.
NEW refere-se aos novos tuplos (no caso de INSERTs e UPDATEs).
OLD refere-se aos velhos tuplos (no caso de DELETEs e UPDATEs).
6 / 21
AFTER e BEFORE
O trigger pode ser accionado imediatamente apos (AFTER)
ou imediatamente antes (BEFORE) do evento ocorrer.
7 / 21
Exemplo 2
Ao inserir um filme na tabela Filmes, se o estudio nao existir, entao
automaticamente inserir esse estudio na tabela Estudios (com morada a
NULL).
CREATE TRIGGER insere_estudioBEFORE INSERTON FilmesFOR EACH ROWEXECUTE PROCEDURE insere_estudio_de_filme();
8 / 21
Exemplo 2 (cont.)
CREATE OR REPLACE FUNCTION insere_estudio_de_filme()RETURNS TRIGGER AS $$BEGINIF NOT EXISTS (SELECT * FROM Estudios
WHERE nome = NEW.nomeEstudio)THENINSERT INTO Estudios(nome) VALUES (NEW.nomeEstudio);
END IF;RETURN NEW;
END;$$ LANGUAGE plpgsql;
9 / 21
Exemplo 3
Cada vez que e feito um DELETE ou um UPDATE a tabela de Filmes,
guardar um registo numa tabela a parte sobre quem fez a alteracao, em
que data, e que tipo de operacao foi efectuada.
CREATE TABLE arquivoFilmes(nome VARCHAR(50),ano INTEGER,duracao INTEGER,aCores BOOLEAN,nomeEstudio VARCHAR(30),nomeRealizador VARCHAR(50),userchanged VARCHAR,datechanged DATE,operation VARCHAR
);
10 / 21
Exemplo 3 (cont.)
CREATE TRIGGER arquiva_filmeAFTER DELETE OR UPDATEON FilmesFOR EACH ROWEXECUTE PROCEDURE arquiva_filme();
11 / 21
Exemplo 3 (cont.)
CREATE OR REPLACE FUNCTION arquiva_filme()RETURNS TRIGGER AS $$BEGININSERT INTO arquivoFilmes VALUES(OLD.nome, OLD.ano, OLD.duracao, OLD.aCores,OLD.nomeEstudio, OLD.nomeRealizador,CURRENT_USER, now(),TG_OP);
RETURN NULL;END;
$$ LANGUAGE plpgsql;
12 / 21
Regras (Rules)
As regras nao fazem parte do SQL standard, mas sao
implementadas pelo PostgreSQL e dao muito jeito.
Permitem especificar uma accao alternativa que e executada em
SELECTs, INSERTs, UPDATESs, ou DELETEs.
Tal como nos triggers, podemos fazer uso das pseudo-tabelas NEW
e OLD.
13 / 21
Exemplo 1
Exemplo: a seguinte regra nao permite apagar filmes do estudio
Disney.
CREATE RULE nao_apaga_filmes_disney ASON DELETE TO FilmesWHERE OLD.nomeEstudio = ’Disney’DO INSTEAD NOTHING;
14 / 21
Regras e Vistas
Em PostgreSQL, as views sao implementadas com regras.
Em PostgreSQL, as views sao “read-only”, mas podemos simular a
“escrita” em views utilizando regras.
Exemplo: criar uma regra de modo a podermos inserir tuplos na view
filmes disney.
CREATE VIEW filmes_disney (nome,ano,realizador) ASSELECT nome, ano, nomeRealizadorFROM FilmesWHERE nomeEstudio = ’Disney’;
15 / 21
Exemplo (cont.)
CREATE RULE insere_filmes_disney ASON INSERT TO filmes_disneyDO INSTEADINSERT INTO Filmes (nome, ano,
nomeRealizador, nomeEstudio)VALUES (NEW.nome, NEW.ano, NEW.realizador, ’Disney’);
Agora ja podemos inserir dados na view.
INSERT INTO filmes_disneyVALUES (’The Huntchback of Notre Dame’,
1995, ’Steven Spielberg’);
16 / 21
Outro exemplo
Inserir dados na view filmes actores
CREATE VIEW filmes_actores (filme, ano, estudio,realizador, actor) AS
SELECT F.nome, F.ano, F.nomeEstudio,F.nomeRealizador, P.nomeActor
FROM Filmes AS F, Participa AS PWHERE F.nome = P.nomeFilmeAND F.ano = P.anoFilme;
A insercao de um tuplo na view, pode fazer com que tenhamos de
inserir tuplos na tabela Filmes, Estudios, Realizadores, Actores
e Participa.
17 / 21
Outro exemplo (cont.)
CREATE RULE insere_em_filmes_actores ASON INSERT TO filmes_actoresDO INSTEAD(INSERT INTO Filmes(nome, ano,
nomeEstudio, nomeRealizador)VALUES (NEW.filme, NEW.ano,
NEW.estudio, NEW.realizador);
INSERT INTO Actores(nome) VALUES (NEW.actor);
INSERT INTO Estudios(nome) VALUES (NEW.estudio);
INSERT INTO Realizadores(nome) VALUES (NEW.realizador);
INSERT INTO Participa(nomeFilme,anoFilme,nomeActor)VALUES (NEW.filme, NEW.ano, NEW.actor);
);
18 / 21
Outro exemplo (cont.)
Agora podemos inserir dados na view filmes actores.
INSERT INTO filmes_actoresVALUES (’Taxi Driver’, 1978, ’Universal’,
’Martin Scorcese’, ’Roxana Arquette’);
19 / 21
Os INSERTs podem dar erro porque podem violar restricoes que
hajam nas tabelas. Por exemplo, se o estudio Universal ja existir na
tabela de estudios, o INSERT falha porque o nome do estudio e
chave primaria.
A solucao para este problema e criar regras adicionais. Por exemplo:
CREATE RULE nao_insere_estudios_duplicados ASON INSERT TO EstudiosWHERE( EXISTS
(SELECT * FROM EstudiosWHERE nome=NEW.nome)
)DO INSTEAD NOTHING;
20 / 21
A insercao de dados na view “esconde” a insercao efectiva dos
dados nas tabela base.
Ao inserir dados na view ficamos impossibilitados de inserir todos os
atributos das tabelas base.
Esses atributos ficam com o valor NULL (ou com o valor que estiver
especificado como DEFAULT).
Podem consultar mais coisas na documentacao online do
PostgreSQL (Programmer’s Guide! Server Programming! The
Rule System)
http://www.postgresql.org/docs/10/static/rules.html
21 / 21
Transaccoes
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 23
Motivacao
Acesso concorrente: Varios utilizadores (ou programas) fazem
selects, updates, deletes e inserts, em simultaneo.
O SGBD tem de orquestrar os acessos concorrentes de modo a que
o estado da BD seja sempre coerente.
Exemplos crıticos: Bancos, reservas de avioes, vendas online, etc.
2 / 23
Multibanco
Marido e mulher tiram dinheiro de uma conta conjunta a partir de
caixas multibanco distintas, mais ou menos ao mesmo tempo.
I Saldo inicial = 400 euros.
I Marido tira 100 euros, mulher tira 70 euros.
I Saldo final = ?
Suponhamos que temos esta tabela,
CREATE TABLE conta (
numero INTEGER PRIMARY KEY,
saldo FLOAT
);
3 / 23
Multibanco (cont.)
Codigo para levantamento de dinheiro
// utilizador introduz no da conta
...
meuSaldo = SELECT saldo FROM conta
WHERE numero = meuNumero;
// utilizador introduz quantidade a levantar
...
meuSaldo = meuSaldo - quantidade;
IF( meuSaldo > 0 ) THEN
UPDATE conta SET saldo = meuSaldo
WHERE numero = meuNumero;
END IF;
4 / 23
Multibanco (cont.)
Acesso concorrente a mesma conta pode dar problemas.
Mas acesso concorrente a contas distintas nao faz mal.
5 / 23
Outro exemplo
Transferir 100 euros da conta no
333 para a conta no
888.
UPDATE conta SET saldo = saldo - 100
WHERE numero = 333;
UPDATE conta SET saldo = saldo + 100
WHERE numero = 888;
SGBD tem um “crash” no meio. O que e que acontece?
6 / 23
Transaccoes
Uma transaccao e uma sequencia de operacoes SQL que e tratada
como um todo.
As transaccoes devem obedecer as propriedades “ACID”:
I Atomicity
I Consistency
I Isolation
I Durability
7 / 23
Propriedades “ACID”
Atomic: Transaccao deve ser tratada como uma unidade. Ou tudo e
executado, ou nada e executado.
Consistent: As restricoes na BD devem ser mantidas.
Isolated: Da a ilusao ao utilizador de que a transaccao e executada
isoladamente, sem interferencias de outras transaccoes.
Durable: Os efeitos das transaccoes nao se podem perder devido a
“crashes” do sistema.
8 / 23
COMMIT e ROLLBACK
Em SQL, a instrucao BEGIN da inıcio a uma transaccao.
COMMIT termina uma transaccao (as modificacoes sao feitas
fisicamente na BD).
ROLLBACK tambem termina uma transaccao (mas o efeito da
transaccao e anulado, uma especie de “undo”).
Por defeito, no interpretador de SQL que temos usado (sqlite3),uma instrucao SQL e uma transaccao.
I E como se o sistema colocasse um BEGIN e um COMMIT,
mediatamente antes e apos a instrucao.
9 / 23
Encadeamento de instrucoes
numero nome saldo
333 Ze 300
888 Maria 250
Programa 1
UPDATE conta // (updt1)SET saldo = saldo-100 WHERE numero = 333;
UPDATE conta // (updt2)SET saldo = saldo+100 WHERE numero = 888;
Programa 2
UPDATE conta // (updt3)SET saldo = saldo+150 WHERE numero = 888;
SELECT SUM(saldo) FROM conta; // (sum)
10 / 23
Encadeamento de instrucoes (cont.)
A unica restricao que existe e que (updt1) tem de vir antes de
(updt2), e que (updt3) tem de vir antes de (sum).
Qualquer outro tipo de encadeamento de instrucoes e possıvel.
11 / 23
Exemplo
Vamos supor que as instrucoes sao executadas pela ordem (updt1)
(updt3) (sum) (updt2).
Instrucao: (updt1) (updt3) (sum) (updt2)
Resultado: 600???
sum=600 e inconsistente, deveria ser 700.
12 / 23
A solucao e usar transaccoes
Agrupamos (updt1) e (updt2) numa transaccao.
O programa 2 so pode ver o estado da BD antes da transferencia ter
sido iniciado, ou depois da transferencia ter sido completada.
Programa 1
BEGIN;
UPDATE conta // (updt1)SET saldo = saldo - 100WHERE numero = 333;
UPDATE conta // (updt2)SET saldo = saldo + 100WHERE numero = 888;
COMMIT;
13 / 23
Nıveis de isolamento
Os utilizadores (programas) so veem resultados de transaccoes que
fizeram COMMIT.
E se estivermos no meio de uma transaccao, e outra transaccao fizer
COMMIT?
14 / 23
Exemplo
Programa 1
UPDATE conta // (updt1)SET saldo = saldo-100 WHERE numero = 333;
UPDATE conta // (updt2)SET saldo = saldo+100 WHERE numero = 888;
Programa 2
UPDATE conta // (updt3)SET saldo = saldo+150 WHERE numero = 888;
SELECT SUM(saldo) FROM conta; // (sum)
15 / 23
Tempo----------------------------------------------------->P1.begin
updt1updt2
P1.commit
P2.beginupdt3
sumP2.commit
Entre o final de (updt1) e o inıcio de (updt2), o estado da BD
alterou-se.
(updt2) deve ver o novo estado da BD?
SQL define 4 nıveis de isolamento para tratar este problema.
Compete ao utilizador (programador) especificar o nıvel de
isolamento pretendido.
16 / 23
Nıveis de isolamento (cont.)
Nıveis de isolamento de transaccoes em SQL:
1 SERIALIZABLE
2 REPEATABLE READ
3 READ COMMITTED
4 READ UNCOMMITTED
Em SQL:
SET TRANSACTION ISOLATION LEVEL <X>
onde <X> e um dos 4 nıveis especificados acima
17 / 23
SERIALIZABLE
Prog1 = (begin)(updt1)(updt2)(commit)
Prog2 = (begin)(updt3)(sum)(commit)
Se Prog1 correr com nıvel de isolamento SERIALIZABLE, entao
apenas vera o estado da BD antes ou depois de Prog2 ter sido
executado, nunca no meio.
18 / 23
READ COMMITTED
Se Prog1 correr com nıvel de isolamento READ COMMITTED, entao
o encadeamento (updt1) (updt3) (max) (p2.commit) (updt2) e
possıvel.
19 / 23
REPEATABLE READ
E semelhante ao READ COMMITTED, com a diferenca de que se um
tuplo e lido uma vez, entao tera de ser forcosamente devolvido se a
leitura for repetida.
20 / 23
READ UNCOMMITTED
Se uma transaccao correr com READ UNCOMMITTED, podera ler
dados que tenham sido escritos temporariamente por outras
transaccoes (mesmo que essas transaccoes venham a fazer
ROLLBACK)
Exemplo, vamos supor que Prog2 faz ROLLBACK em vez de
COMMIT. Nesse caso, o estado da BD vai ficar incoerente.
21 / 23
Em SQLite
Apenas implementa o modo SERIALIZABLE.
Mecanismo de gestao de transaccoes nao e tao poderoso como
noutros SGBDs.
Se uma transaccao fizer um SELECT a uma tabela, mais ninguem
consegue fazer modificacoes a essa tabela enquanto a transaccao
nao terminar.
22 / 23
Em PostgreSQL.
Permite SERIALIZABLE, REPEATABLE READ, READ COMMITTED.
I SERIALIZABLE da o maior nıvel de isolamento.
I REPEATABLE READ da um menor nıvel de isolamento.
I READ COMMITTED ainda menos isolamento da mas e mais eficiente
de implementar pelo SGBD.
A escolha do nıvel de isolamento depende da aplicacao.
23 / 23
Bases de dados semi-estruturadas, XML
Fernando Lobo
Base de Dados, Universidade do Algarve
1 / 40
Modelo de informacao semi-estruturado
Esquema esta implıcito nos dados.
Ao inves do modelo relacional, nao e obrigatorio a existencia de umesquema para a BD.
Muito em voga nos ultimos anos com XML.
2 / 40
Modelo de informacao semi-estruturado
Os dados sao auto-descritivos.
Podemos forcar a existencia de um esquema se assim o desejarmos.
E mais flexıvel que o modelo relacional.
As linguagens para manipular os dados nao sao tao eficientes comono modelo relacional.
3 / 40
Representacao
A BD e um grafo, uma coleccao de nos e arcos entre nos.
Um no pode ser um no interior ou uma folha.
As folhas tem informacao associada (inteiros, strings, datas, etc.)
Os nos interiores tem 1 ou mais arcos para outros nos.
4 / 40
Nos interiores
Cada arco tem uma anotacao que indica como o no de origem serelaciona com o no destino.
Existe um no especial, a raız, que nao tem arcos a apontar para ele, eque representa a BD inteira.
Todo o no pode ser alcancado atraves de um caminho a partir da raız.
5 / 40
Exemplo: BD de filmes
raiz
rua cidade rua cidade
cf
Beverly
Hills
Carrie
Fisher
Harrison
Ford
Hollywood123 Maple St 7th Av New York
Star Wars 1977
morada
nome
hf
ruacidadenome
Oak Rd
filmeactor
actor
participaEm
temActor
morada
sw
nomeano
temActor
participaEm
6 / 40
Etiquetas em no interior
Uma anotacao L num arco do no N para o no M pode significar 2 coisas:
N e M podem ser objectos que estao relacionados atraves de umaassociacao de nome L.
hf swparticipaEm
N pode ser um objecto e M e um dos atributos do objecto. Nestecaso L e o nome do atributo.
sw 1977
ano
7 / 40
XML — eXtensible Markup Language
XML e um standard que nos permite armazenar e manipularinformacao semi-estruturada.
Muito bom para integrar informacao oriunda de bases de dadosdistintas e para partilhar informacao na web.
8 / 40
XML
XML e uma linguagem de anotacao.
Utiliza etiquetas (tags, em ingles) para descrever informacao.
Podemos definir os tags que quisermos.
9 / 40
XML: tags e elementos
Tags:
<ano> </ano>
Um elemento e um par de “matching tags”e tudo o que esta aıincluıdo.
Um documento XML tem um so elemento raız, que corresponde a BDinteira.
10 / 40
XML bem formado
Nao ha esquema pre-definido.
Encadeamento de tags tem de ser respeitado, tal como os parentesisde uma expressao aritmetica.
11 / 40
Exemplo
<?xml version="1.0" standalone="yes"?>
<Info_Filmes>
<Actor>
<Nome>Carrie Fisher</Nome>
<Morada>
<Rua>123 Maple St</Rua>
<Cidade>Hollywood</Cidade>
</Morada>
<Morada>
<Rua>7th Ave</Rua>
<Cidade>New York</Cidade>
</Morada>
</Actor>
12 / 40
Exemplo (cont.)
<Actor>
<Nome>Harrison Ford</Nome>
<Rua>Oak Rd</Rua>
<Cidade>Beverly Hills</Cidade>
</Actor>
<Filme>
<Nome>Star Wars</Nome>
<Ano>1977</Ano>
</Filme>
</Info_Filmes>
13 / 40
Atributos
Os elementos podem ter atributos. E um modo alternativo derepresentar uma folha no modelo semi-estruturado.
Exemplo,
<Filme ano="1977"><Nome>Star Wars</Nome></Filme>
Ou,
<Filme nome="Star Wars" ano="1977"></Filme>
Ou ainda,
<Filme nome="Star Wars" ano="1977" />
14 / 40
Atributos para associar elementosPodemos usar atributos para representar associacoes entre elementos.
Tornam-se uma especie de apontadores.
<?xml version="1.0" standalone="yes"?>
<Info_Filmes>
<Actor actorID="cf" participaEm="sw">
<Nome>Carrie Fisher</Nome>
<Morada>
<Rua>123 Maple St</Rua>
<Cidade>Hollywood</Cidade>
</Morada>
<Morada>
<Rua>7th Ave</Rua>
<Cidade>New York</Cidade>
</Morada>
</Actor>15 / 40
<Actor actorID="hf" participaEm="sw">
<Nome>Harrison Ford</Nome>
<Rua>Oak Rd</Rua>
<Cidade>Beverly Hills</Cidade>
</Actor>
<Filme filmeID="sw" actores="cf hf">
<Nome>Star Wars</Nome>
<Ano>1977</Ano>
</Filme>
</Info_Filmes>
16 / 40
XML valido
Requer um esquema.
Pode ser definido usando um DTD (Document Type Definition)
Um DTD e uma especie de gramatica que define regras para odocumento.
Uma alternativa ao DTD e usar XML Schema (que nao vamos vernesta disciplina.)
17 / 40
DTDs
<!DOCTYPE <tag raiz> [
<!ELEMENT <nome> ( <componentes> )
<mais elementos>
]>
A descricao de um elemento consiste num nome (tag), e na descricaodos seus elementos constituintes.
I inclui ordem e multiplicidade.
As folhas sao elementos de texto e tem #PCDATA
(Parsed Character Data)
18 / 40
DTD para filmes
<!DOCTYPE Info_Filmes [
<!ELEMENT Info_Filmes (Actor*, Filme*)>
<!ELEMENT Actor (Nome, (Morada+ | (Rua, Cidade)))>
<!ELEMENT Morada (Rua, Cidade)>
<!ELEMENT Rua (#PCDATA)>
<!ELEMENT Cidade (#PCDATA)>
<!ELEMENT Filme (Nome, Ano)>
<!ELEMENT Nome (#PCDATA)>
<!ELEMENT Ano (#PCDATA)>
]>
19 / 40
Definicao de elementos
Os elementos devem aparecer pela ordem especificada.
No final do tag coloca-se um sımbolo que indica a multiplicidade.
I * ! zero ou mais.
I + ! um ou mais.
I ? ! zero ou um.
O sımbolo | tem o significado de “ou” (permite especificar umasequencia alternativa de tags).
20 / 40
Definicao de atributos
<!ATTLIST nome-elemento nome-atributo tipo >
O tipo mais comum e CDATA (uma string)
Identificador e do tipo ID
Referencia e do tipo IDREF, lista de referencias e do tipo IDREFS.
Atributos podem ser obrigatorios (#REQUIRED) ou opcionais(#IMPLIED)
21 / 40
DTD para filmes, com ID’s e IDREF’s
<!DOCTYPE Info_Filmes [
<!ELEMENT Info_Filmes (Actor*, Filme*)>
<!ELEMENT Actor (Nome, Morada+)>
<!ATTLIST Actor
actorID ID #REQUIRED
participaEm IDREFS #IMPLIED
>
<!ELEMENT Nome (#PCDATA)>
<!ELEMENT Morada (Rua, Cidade)>
<!ELEMENT Rua (#PCDATA)>
<!ELEMENT Cidade (#PCDATA)>
<!ELEMENT Filme (Nome, Ano)>
<!ATTLIST Filme
filmeID ID #REQUIRED
actores IDREFS #IMPLIED
>
<!ELEMENT Ano (#PCDATA)>
]> 22 / 40
Utilizacao do DTD
No documento XML colocar STANDALONE = “no”, e depois,
I Incluir o DTD no preambulo do documento XML, ou
I Colocar DOCTYPE <elemento raiz> SYSTEM “path para o ficheiroque contem o DTD”.
23 / 40
Exemplo 1
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Info_Filmes [
<!ELEMENT Info_Filmes (Actor*, Filme*)>
<!ELEMENT Actor (Nome, Morada+)>
...
]>
<Info_Filmes>
<Actor actorID="cf" participaEm="sw">
<Nome>Carrie Fisher</Nome>
<Morada>
...
</Morada>
</Actor>
...
</Info_Filmes>
24 / 40
Exemplo 2, DTD em ficheiro externo
<?xml version="1.0" standalone="no"?>
<!DOCTYPE Info_Filmes SYSTEM "filmes-ID.dtd">
<Info_Filmes>
<Actor actorID="cf" participaEm="sw">
<Nome>Carrie Fisher</Nome>
<Morada>
...
</Morada>
</Actor>
...
</Info_Filmes>
25 / 40
Como validar
Existem programas que permitem validar um documento XML
Um desses programas chama-se xmllint e corre na linha decomandos.
Exemplo de utilizacao,
xmllint --dtdvalid filmesID.dtd --noout filmesID.xml
26 / 40
Linguagens de programacao para XML
Duas linguagens importantes para manipular XML,
XPath
XQuery
27 / 40
XPath
Permite extrair informacao de um documento XML usando expressoesque denotam caminhos a partir do raız do grafo.
Exemplos,
I Retorna os actores
Info_Filmes/Actor
I Retorna os nomes dos actores
Info_Filmes/Actor/Nome
28 / 40
Atributos
Para extrair o valor de um atributo temos de usar @nome-do-atributo.
Exemplo,
I Retorna os IDs dos actores
Info_Filmes/Actor/@actorID
29 / 40
Condicoes
Nome dos actores que moram em Hollywood
/Info_Filmes/Actor[Morada/Cidade = "Hollywood"]/Nome
Nome dos filmes feitos depois de 1980
/Info_Filmes/Filme[Ano > 1980]/Nome
30 / 40
XQuery
XQuery e uma generalizacao do XPath
E uma linguagem funcional baseada em expressoes
Tem algumas semelhancas com SQL
31 / 40
Expressoes FLWR (flower)
F ! for . . .
L ! let . . .
W ! where . . .
R ! return . . .
32 / 40
Expressoes FLWR (flower)
Query tem,
zero ou mais clausulas for e let, intercaladas em qualquer ordem
seguido de uma clausula opcional where
seguido de uma clausula return
33 / 40
Exemplo
Nome dos actores
let $info := doc("filmes-ID.xml")
for $a in $info//Actor
return $a/Nome
variaveis comecam com $
:= ! sinal de atribuicao
return nao tem o significado habitual como em C ou Java. Pode serchamado varias vezes. O resultado vai sendo concatenado sempre quea clausula where e verdadeira.
34 / 40
Mais exemplos
Nome dos actores que moram em Hollywood
let $info := doc("filmes-ID.xml")
for $a in $info//Actor
where $a/Morada/Cidade = "Hollywood"
return $a/Nome
Nome de filmes feitos depois de 1980
let $info := doc("filmes-ID.xml")
for $f in $info//Filme
where $f/Ano > 1980
return $f/Nome
35 / 40
Mais exemplos
Numero de actores
let $seq := (
let $info := doc("filmes-ID.xml")
for $a in $info//Actor
return $a/Nome
)
return count($seq)
36 / 40
Mais exemplos
Dentro de tags, substituir variaveis pelo respectivo valor
let $seq := (
let $info := doc("filmes-ID.xml")
for $a in $info//Actor
return $a/Nome
)
return <actores>{$seq}</actores>
37 / 40
Mais exemplos
Nome dos filmes em que participou o Harrison Ford
let $info := doc("filmes-ID.xml")
let $actores := $info//Actor
let $filmesID_hf := (
for $a in $actores
where $a/Nome = "Harrison Ford"
return $a/data(@participaEm)
)
let $filmes := $info//Filme
for $f in $filmes
where contains($filmesID_hf, $f/@filmeID)
return $f/Nome
38 / 40
Mais exemplos
Retornar pares de actores com a mesma morada(equivalente a um Join)
let $info := doc("filmes-ID.xml")
let $actores := $info//Actor
for $a1 in $actores, $a2 in $actores
where $a1/Morada/Rua = $a2/Morada/Rua
and $a1/Morada/Cidade = $a2/Morada/Cidade
and $a1/Nome < $a2/Nome
return <par>{$a1/Nome}{$a2/Nome}</par>
39 / 40
Informacao adicional
Ha muito mais para alem disto.
Um bom local para explorar e ver os tutoriais de XPath e XQuery emhttp://www.w3schools.com/
Podem testar os exemplos que dei usando um processador de XML,como o Saxon. (Kernow e uma aplicacao grafica que usa Saxon, podeser decarregada em http://kernowforsaxon.sourceforge.net/)
Existem API’s para usar XQuery em programas Java.
40 / 40