Você está na página 1de 12

Álgebra Relacional Linguagens de Query

Banco de Dados: Teoria e Prática ▪ Para manipulação e recuperação de dados


▪ Linguagens de Query (LQ) em BD:
André Santanchè
▫ Fundamentação formal
Instituto de Computação – UNICAMP
Setembro 2011 ▫ Subsidiam otimização
▪ LQ <> linguagens de programação
▫ não se espera que sejam “Turing completas”.
▫ não pensadas para cálculos complexos.
▫ suportam acessos simples e eficientes a extensos
conjuntos de dados
(Ramakrishnan, 2003)

Picture by Evan Leeson [http://www.flickr.com/photos/ecstaticist/]


Uma
Umalinguagem
linguageméédita
dita“Turing
“Turing
completa”
completa”se
sepuder
puderser
ser
Linguagens de Query demonstrado
demonstradoque
queela
elaéé
Bases do SQL
computacionalmente
computacionalmente
equivalente
equivalenteààmáquina
máquinade de
Turing.
Turing.
▪ Para manipulação e recuperação de dados ▪ Álgebra Relacional
▪ Linguagens de Query (LQ) em BD: ▫ operacional
▫ Fundamentação formal ▪ Cálculo Relacional
▫ Subsidiam otimização ▫ Declarativo
▪ LQ <> linguagens de programação (Ramakrishnan, 2003)

▫ não se espera que sejam “Turing completas”.


▫ não pensadas para cálculos complexos.
▫ suportam acessos simples e eficientes a extensos
conjuntos de dados
(Ramakrishnan, 2003)

Operacional x Declarativo

▪ Declarativo:
▫ Quero um misto quente
▪ Operacional: Caso Prático - Taxis
▫ Quero duas fatias de pão de forma,
recheadas com uma fatia de queijo e
uma fatia de presunto. Tudo isto bem
tostado.
Esquema Conceitual – Exemplo Esquema Conceitual – Exemplo
Cliente
Táxis Cliente

CliId
DataPedido Placa
Nome CPF
Marca
Modelo ISA CGC
AnoFab

Cliente Cliente
1 N Particular Empresa
Cliente Corrida N 1 Taxi
Para ilustrar o tema apresentado, foram acrescentadas
duas entidades que são especialização de Cliente. A
Este é um subconjunto do Estudo de Caso primeira representa um indivíduo que irá pagar a conta,
proposto “Despacho e controle de Táxis via a segunda representa um funcionário de uma empresa
terminais móveis ligados on-line com um sistema conveniada, para a qual a conta será enviada. Um
multi-usuário” por prof. Geovane Cayres cliente pode pertencer a ambas especializações.
Magalhães

Tabelas para exemplo - Táxis


Esquema Conceitual completo
Táxis Cliente Particular (CP)
CliId Nome CPF
CliId DataPedido
Placa
Nome 1532 Asdrúbal 448.754.253-65
Marca
Modelo
AnoFab
1755 Doriana 567.387.387-44
1780 Quincas 546.373.762-02
Cliente 1 N Corrida N 1 Taxi
Cliente Empresa (CE)
CliId Nome CGC
CPF
ISA CGC 1532 Asdrúbal 754.856.965/0001-54
1644 Jepeto 478.652.635/0001-75
Cliente Cliente 1780 Quincas 554.663.996/0001-87
Particular Empresa 1982 Zandor 736.952.369/0001-23

Tabelas para exemplo - Táxis Álgebra Relacional

Táxi (TX)
Operações Básicas
Placa Marca Modelo AnoFab ▪ Operações unárias
DAE6534 Ford Fiesta 1999
DKL4598 Wolksvagen Gol 2001
▫ Projeção () e Seleção ()
DKL7878 Ford Fiesta 2001 ▪ Operações de conjuntos
JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999 ▫ União (), Intersecção () e Diferença ()
▫ Produto cartesiano ( )
Corrida (R1) ▪ Operações binárias
ClId Placa DataPedido ▫ Junção ( ) e Divisão (/)
1755 DAE6534 15/02/2003
1982 JDM8776 18/02/2003 ▪ Outras operações
▫ Renomeamento ()
Projeção Projeção
Marca,Modelo(TX)
Marca,Modelo(TX)
Placa Marca Modelo AnoFab Placa Marca Modelo AnoFab
DAE6534 Ford Fiesta 1999 DAE6534 Ford Fiesta 1999
DKL4598 Wolksvagen Gol 2001 DKL4598 Wolksvagen Gol 2001
DKL7878 Ford Fiesta 2001 DKL7878 Ford Fiesta 2001
JDM8776 Wolksvagen Santana 2002 JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999 JJM3692 Chevrolet Corsa 1999

Projeção Projeção
Marca,Modelo(TX) Marca,Modelo(TX)

Marca Modelo Marca Modelo


Ford Fiesta Ford Fiesta
Wolksvagen Gol Wolksvagen Gol
Ford Fiesta Ford Fiesta
Wolksvagen Santana Wolksvagen Santana
Chevrolet Corsa Chevrolet Corsa

Projeção Projeção – Cliente Particular


Marca,Modelo(TX) CliId,Nome(CP)
CliId Nome CPF
1532 Asdrúbal 448.754.253-65
1755 Doriana 567.387.387-44
Marca Modelo 1780 Quincas 546.373.762-02
Ford Fiesta
Wolksvagen Gol
Wolksvagen Santana
C1*
Chevrolet Corsa
CliId Nome
1532 Asdrúbal
1755 Doriana
1780 Quincas
(*) Adotaremos o nome C1 para o resultado da projeção (o modo como isto é feito será
estudado mais adiante em renomeamento).
Projeção Tabela Cliente Particular SELECT
CliId,Nome(CE) Projeção
CliId Nome CGC
1532 Asdrúbal 754.856.965/0001-54 SELECT Marca, Modelo FROM Taxi
1644 Jepeto 478.652.635/0001-75
1780 Quincas 554.663.996/0001-87
1982 Zandor 736.952.369/0001-23 Placa Marca Modelo AnoFab
DAE6534 Ford Fiesta 1999
DKL4598 Wolksvagen Gol 2001
DKL7878 Ford Fiesta 2001
C2 JDM8776 Wolksvagen Santana 2002
CliId Nome JJM3692 Chevrolet Corsa 1999
1532 Asdrúbal
1644 Jepeto
1780 Quincas
1982 Zandor

SELECT SELECT
Projeção Projeção
SELECT Marca, Modelo FROM Taxi SELECT Marca, Modelo FROM Taxi

Placa Marca Modelo AnoFab Marca Modelo


DAE6534 Ford Fiesta 1999 Ford Fiesta
DKL4598 Wolksvagen Gol 2001 Wolksvagen Gol
DKL7878 Ford Fiesta 2001 Ford Fiesta
JDM8776 Wolksvagen Santana 2002 Wolksvagen Santana
JJM3692 Chevrolet Corsa 1999 Chevrolet Corsa

Seleção Seleção
AnoFab>2000(TX) AnoFab>2000(TX)

Placa Marca Modelo AnoFab Placa Marca Modelo AnoFab


DAE6534 Ford Fiesta 1999 DAE6534 Ford Fiesta 1999
DKL4598 Wolksvagen Gol 2001 DKL4598 Wolksvagen Gol 2001
DKL7878 Ford Fiesta 2001 DKL7878 Ford Fiesta 2001
JDM8776 Wolksvagen Santana 2002 JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999 JJM3692 Chevrolet Corsa 1999
Seleção SELECT
AnoFab>2000(TX) Seleção
SELECT * FROM Taxi WHERE AnoFab > 2000

Placa Marca Modelo AnoFab Placa Marca Modelo AnoFab


DKL4598 Wolksvagen Gol 2001 DAE6534 Ford Fiesta 1999
DKL7878 Ford Fiesta 2001 DKL4598 Wolksvagen Gol 2001
JDM8776 Wolksvagen Santana 2002 DKL7878 Ford Fiesta 2001
JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999

SELECT SELECT
Seleção Seleção
SELECT * FROM Taxi WHERE AnoFab > 2000 SELECT * FROM Taxi WHERE AnoFab > 2000

Placa Marca Modelo AnoFab Placa Marca Modelo AnoFab


DAE6534 Ford Fiesta 1999 DKL4598 Wolksvagen Gol 2001
DKL4598 Wolksvagen Gol 2001 DKL7878 Ford Fiesta 2001
DKL7878 Ford Fiesta 2001 JDM8776 Wolksvagen Santana 2002
JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999

União União
C1  C2 C1  C2

CliId Nome CliId Nome


1532 Asdrúbal 1532 Asdrúbal
1755 Doriana 1755 Doriana CliId Nome
1780 Quincas 1780 Quincas 1532 Asdrúbal
1755 Doriana
1780 Quincas
CliId Nome CliId Nome
1532 Asdrúbal 1532 Asdrúbal
1644 Jepeto 1644 Jepeto
1780 Quincas 1780 Quincas
1982 Zandor 1982 Zandor
União Interseção
C1  C2 C1  C2

CliId Nome CliId Nome


1532 Asdrúbal 1532 Asdrúbal
1755 Doriana CliId Nome 1755 Doriana
1780 Quincas 1532 Asdrúbal 1780 Quincas
1644 Jepeto
1755 Doriana
CliId Nome 1780 Quincas CliId Nome
1532 Asdrúbal 1982 Zandor 1532 Asdrúbal
1644 Jepeto 1644 Jepeto
1780 Quincas 1780 Quincas
1982 Zandor 1982 Zandor

Interseção Interseção
C1  C2 C1  C2

CliId Nome CliId Nome


1532 Asdrúbal 1532 Asdrúbal
1755 Doriana 1755 Doriana
1780 Quincas CliId Nome 1780 Quincas CliId Nome
1532 Asdrúbal 1532 Asdrúbal
CliId Nome CliId Nome 1780 Quincas
1532 Asdrúbal 1532 Asdrúbal
1644 Jepeto 1644 Jepeto
1780 Quincas 1780 Quincas
1982 Zandor 1982 Zandor

Diferença de conjuntos Diferença de conjuntos


C1 - C2 C1 - C2

CliId Nome CliId Nome CliId Nome CliId Nome CliId Nome
1532 Asdrúbal 1532 Asdrúbal 1532 Asdrúbal 1532 Asdrúbal
1755 Doriana 1644 Jepeto 1755 Doriana 1644 Jepeto
1780 Quincas 1780 Quincas 1780 Quincas 1780 Quincas
1982 Zandor 1982 Zandor
Diferença de conjuntos Diferença de conjuntos
C1 - C2 C1 - C2

C liI d N om e C liI d N om e CliId Nome C liI d N om e C liI d N om e CliId Nome


1532 A sd r ú b al 1532 A sd r ú b al 1755 Doriana 1532 A sd r ú b al 1532 A sd r ú b al 1755 Doriana
1755 D o r i an a 1644 Jep e t o 1755 D o r i an a 1644 Jep e t o
1780 Q u i n c as 1780 Q u i n c as 1780 Q u i n c as 1780 Q u i n c as
1982 Z an d o r 1982 Z an d o r

Diferença de conjuntos Produto Cartesiano


C1 - C2 C1 × R1

CliId Nome ClId Placa DataPedido


C li I d N om e C li I d N om e CliId Nome 1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 A sd r ú b al 1532 A sd r ú b al 1755 Doriana 1755 Doriana 1982 JDM8776 18/02/2003
1755 D o r i an a 1644 Jep et o 1780 Quincas
1780 Q u i n c as 1780 Q u i n c as
1982 Z an d o r

Produto Cartesiano Produto Cartesiano


C1 × R1 C1 × R1

CliId Nome ClId Placa DataPedido CliId Nome ClId Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003 1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1780 Quincas

(CliId) Nome (ClId) Placa DataPedido (CliId) Nome (ClId) Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003 1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003
Produto Cartesiano Produto Cartesiano
SELECT Cliente.CliId, Cliente.Nome,
Corrida.CliId, Corrida.Placa,
C1 × R1 Corrida.DataPedido
FROM Cliente, Corrida

CliId Nome ClId Placa DataPedido CliId Nome ClId Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003 1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1780 Quincas

(CliId) Nome (ClId) Placa DataPedido


1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1755 DAE6534 15/02/2003
1780 Quincas 1982 JDM8776 18/02/2003

Produto Cartesiano Produto Cartesiano


SELECT Cliente.CliId, Cliente.Nome, SELECT Cliente.CliId, Cliente.Nome,
Corrida.CliId, Corrida.Placa, Corrida.CliId, Corrida.Placa,
Corrida.DataPedido Corrida.DataPedido
FROM Cliente, Corrida FROM Cliente, Corrida

CliId Nome ClId Placa DataPedido CliId Nome ClId Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003 1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1780 Quincas

(CliId) Nome (ClId) Placa DataPedido (CliId) Nome (ClId) Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003 1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003

Produto Cartesiano Junção


SELECT Cliente.CliId, Cliente.Nome,
Corrida.CliId, Corrida.Placa,
Corrida.DataPedido C1
FROM Cliente, Corrida C1.CliId<R1.CliIdR1

CliId Nome ClId Placa DataPedido


1532 Asdrúbal 1755 DAE6534 15/02/2003 (CliId) Nome (ClId) Placa DataPedido
1755 Doriana 1982 JDM8776 18/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1780 Quincas 1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003
(CliId) Nome (ClId) Placa DataPedido 1755 Doriana 1982 JDM8776 18/02/2003
1532 Asdrúbal 1755 DAE6534 15/02/2003 1780 Quincas 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003 1780 Quincas 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1755 DAE6534 15/02/2003
1780 Quincas 1982 JDM8776 18/02/2003
Junção Junção
C1 C1.CliId<R1.CliIdR1 C1 C1.CliId<R1.CliIdR1

(CliId) Nome (ClId) Placa DataPedido (CliId) Nome (ClId) Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003 1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003 1755 Doriana 1982 JDM8776 18/02/2003
1755 Doriana 1982 JDM8776 18/02/2003 1780 Quincas 1982 JDM8776 18/02/2003
1780 Quincas 1755 DAE6534 15/02/2003
1780 Quincas 1982 JDM8776 18/02/2003

Equi-Junção Equi-Junção
C1 CliIdR1 C1 CliIdR1

(CliId) Nome (ClId) Placa DataPedido (CliId) Nome (ClId) Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003 1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003 1755 Doriana 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003 1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1755 DAE6534 15/02/2003 1780 Quincas 1755 DAE6534 15/02/2003
1780 Quincas 1982 JDM8776 18/02/2003 1780 Quincas 1982 JDM8776 18/02/2003

Equi-Junção
Junção Natural
C1 CliIdR1
C1 * R1
(CliId) Nome (ClId) Placa DataPedido
1755 Doriana 1755 DAE6534 15/02/2003
equivalente a

C1 CliIdR1

(CliId) Nome (ClId) Placa DataPedido


1755 Doriana 1755 DAE6534 15/02/2003
Equi-Junção Equi-Junção
SELECT Cliente.CliId, Cliente.Nome, SELECT Cliente.CliId, Cliente.Nome,
Corrida.CliId, Corrida.Placa, Corrida.CliId, Corrida.Placa,
Corrida.DataPedido Corrida.DataPedido
FROM Cliente, Corrida FROM Cliente, Corrida
WHERE Cliente.CliId = Corrida.CliId WHERE Cliente.CliId = Corrida.CliId
(CliId) Nome (ClId) Placa DataPedido (CliId) Nome (ClId) Placa DataPedido
1532 Asdrúbal 1755 DAE6534 15/02/2003 1532 Asdrúbal 1755 DAE6534 15/02/2003
1532 Asdrúbal 1982 JDM8776 18/02/2003 1532 Asdrúbal 1982 JDM8776 18/02/2003
1755 Doriana 1755 DAE6534 15/02/2003 1755 Doriana 1755 DAE6534 15/02/2003
1755 Doriana 1982 JDM8776 18/02/2003 1755 Doriana 1982 JDM8776 18/02/2003
1780 Quincas 1755 DAE6534 15/02/2003 1780 Quincas 1755 DAE6534 15/02/2003
1780 Quincas 1982 JDM8776 18/02/2003 1780 Quincas 1982 JDM8776 18/02/2003

Equi-Junção Álgebra Relacional


SELECT Cliente.CliId, Cliente.Nome,
Corrida.CliId, Corrida.Placa, Operações Básicas
Corrida.DataPedido
FROM Cliente, Corrida ▪ Operações básicas
WHERE Cliente.CliId = Corrida.CliId
(CliId) Nome (ClId) Placa DataPedido ▫ Projeção (), Seleção (), Produto cartesiano ( ),
1755 Doriana 1755 DAE6534 15/02/2003 Diferença () e União ()
▪ Operações adicionais (não essenciais)
▫ Intersecção (), Junção ( ), Divisão (/) e
Renomeamento ()
▪ Álgebra é fechada
▫ Operações sobre relações retornam relações
(Ramakrishnan, 2003)

Renomeamento Renomeamento
(FR,Marca=‘Ford’TX) (FR,Marca=‘Ford’TX)

TX FR
Placa Marca Modelo AnoFab Placa Marca Modelo AnoFab
DAE6534 Ford Fiesta 1999 DAE6534 Ford Fiesta 1999
DKL4598 Wolksvagen Gol 2001 DKL7878 Ford Fiesta 2001
DKL7878 Ford Fiesta 2001
JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999
Tabela adicional Divisão
Corrida (R2) Encontre clientes que tenham andado com todos os
ClId Placa DataPedido táxis da Marca Ford.
1532 DAE6534 15/02/2003
1532 DKL4586 17/02/2003
1644 DKL7878 10/01/2003
1644 JDM8776 18/02/2003
1780 JJM3692 08/01/2003
1982 DAE6534 15/01/2003
1982 DKL4598 26/01/2003
1982 DKL7878 01/02/2003

Táxi (FR)
Placa Marca Modelo AnoFab
DAE6534 Ford Fiesta 1999
DKL7878 Ford Fiesta 2001

Divisão Divisão
(SR2,ClId,Placa(R2)) SR2 / SFR
ClId Placa
1532 DAE6534 ClId Placa Placa
1532 DKL4586 1532 DAE6534 DAE6534
1644 DKL7878 1532 DKL4586 DKL7878
1644 JDM8776 1644 DKL7878
1780 JJM3692 1644 JDM8776
1982 DAE6534 1780 JJM3692
1982 DKL4598 1982 DAE6534
1982 DKL7878 1982 DKL4598
(SFR,Placa(FR)) 1982 DKL7878
Placa
DAE6534
DKL7878

Divisão Divisão
SR2 / SFR SR2 / SFR
C lI d P l a ca Placa ClId C lI d P l a ca Placa ClId
1532 D A E 6534 DAE6534 1532 D A E 6534 DAE6534 ?
1532 D K L 4586 DKL7878 ? 1532 D K L 4586 DKL7878
1644 D K L 7878 1644 D K L 7878
1644 JD M 8 7 7 6 1644 JD M 8 7 7 6
1780 JJM 3 6 9 2 1780 JJM 3 6 9 2
1982 D A E 6534 1982 D A E 6534
1982 D K L 4598 1982 D K L 4598
1982 D K L 7878 1982 D K L 7878
Divisão Divisão
SR2 / SFR SR2 / SFR

ClId Placa Placa ClId C lI d P l a ca Placa ClId


1532 DAE6534 DAE6534 ? 1532 D A E 6534 DAE6534 1982
1532 DKL4586 DKL7878 ? 1532 D K L 4586 DKL7878
1644 DKL7878 1644 D K L 7878

1644 JDM8776 1644 JD M 8 7 7 6

1780 JJM3692 1780 JJM 3 6 9 2

1982 DAE6534 1982 D A E 6534

1982 DKL4598 1982 D K L 4598

1982 DKL7878 1982 D K L 7878

Tabelas para exemplo - Táxis Tabelas para exemplo - Táxis


Cliente Particular (CP) Táxi (TX)
CliId Nome CPF Placa Marca Modelo AnoFab
1532 Asdrúbal 448.754.253-65 DAE6534 Ford Fiesta 1999
1755 Doriana 567.387.387-44 DKL4598 Wolksvagen Gol 2001
1780 Quincas 546.373.762-02 DKL7878 Ford Fiesta 2001
JDM8776 Wolksvagen Santana 2002
JJM3692 Chevrolet Corsa 1999

Corrida (R1)
Modelo original
ClId Placa DataPedido
por prof. Geovane
1755 DAE6534 15/02/2003
Cayres Magalhães
1982 JDM8776 18/02/2003

Referências Referências
▪ Heuser, Carlos Alberto (2004) Projeto de Banco de
▪ Codd, Edgar Frank (1970) A relational model of data for
large shared data banks. Communications ACM 13(6), Dados. Editora Sagra Luzzato, 5 a edição.
377-387. ▪ Ramakrishnan, Raghu; Gehrke, Johannes (2003) Database
Elmasri, Ramez; Navathe, Shamkant B. (2005) Sistemas Management Systems. McGraw-Hill, 3rd edition.

de Bancos de Dados. Addison-Wesley, 4 a edição em
português.
▪ Elmasri, Ramez; Navathe, Shamkant B. (2010) Sistemas
de Banco de Dados. Pearson, 6a edição em português.
▪ Guimarães, Célio (2003) Fundamentos de Bancos de
Dados: Modelagem, Projeto e Linguagem SQL. Editora
UNICAMP, 1a edição.

Você também pode gostar