Banco de Dados - SQL

Propaganda
Banco de Dados - SQL
Profa. Flávia Cristina Bernardini
O que é?


SQL = DDL + DML
Structured Query Language = Data
Definition Language + Data Manipulation
Language
◦ comandos para definir, modificar e remover
relações (tabelas), além de criar e remover
índices.

Implementa operadores de AR + as
seguintes operações:
◦ Inserção, Atualização e Remoção
◦ CRUD (CReate, Update, Delete)
Composição da SQL

DML embutida
◦ pode ser utilizada a partir de linguagens
de programação de propósito geral

Definição de visões
◦ SQL DDL inclui comandos para a criação
e a remoção de visões

Restrições de integridade
◦ SQL DDL possui comandos para a
especificação de restrições de integridade
Composição da SQL

Autorização
◦ SQL DDL inclui comandos para a
especificação de direitos de acesso a
relações e visões

Gerenciamento de transações
◦ introduz comandos para a especificação
do início e do fim das transações

Recuperação de falhas
◦ introduz comandos para utilização do
arquivo de log
Versões
Ansi SQL
 SQL 92 (SQL 2)
 SQL 99 (SQL 3)

◦ Características Objeto-Relacionais e
outras capacidades
◦ Será o alvo do nosso estudo
SQL DDL

CREATE DATABASE | SCHEMA
◦ cria um esquema de BD relacional

DROP DATABASE | SCHEMA
◦ remove um esquema de BD relacional
CREATE DATABASE

Cria um esquema de BD relacional
◦ agrupa tabelas/comandos que pertencem
à aplicação
◦ identifica o proprietário do esquema
◦ esquema inicial não possui tabelas/dados
CREATE {DATABASE | SCHEMA} nome
[USER `username` [PASSWORD `password`] ]
... ;
DROP DATABASE

Remove um esquema de BD
relacional
◦ tabelas/dados
◦ índices
◦ arquivos de log

Usuários autorizados
◦ proprietário do banco de dados
◦ DBA
DROP DATABASE

CASCADE
◦ remove um esquema de BD, incluindo
todas as suas tabelas e os seus outros
elementos

RESTRICT
◦ remove um esquema de BD somente se
não existirem elementos definidos para
esse esquema
SQL DDL

CREATE TABLE
◦ cria uma nova tabela (relação) no BD
nova tabela não possui dados

DROP TABLE
◦ remove uma tabela e sua instância do BD

ALTER TABLE
◦ altera a estrutura de uma tabela já
existente no BD
CREATE TABLE
Cria uma nova tabela (relação)
 Cria os atributos da nova tabela, com

◦ nome do atributo: Ai (1 <= i <= n)
◦ tipo de dado (domínio do atributo): Di
◦ restrições que atuam no atributo: Ri
CREATE TABLE nome_tabela (
A1 D1 R1,
A2 D2 R2,
...
An Dn Rn ) ;
Exemplos de Tipos de Dados

Numéricos
◦ Integer, float, ...

Hora/Data
◦ Date (YYYY-MM-DD), time (HH-MM-SS),
...
Strings
 Etc.

Restrições de Integridade

Valor nulo
◦ representado por NULL
◦ membro de todos os domínios

Restrição NOT NULL
◦ especificada quando NULL não é
permitido
◦ proíbe que o atributo receba valor nulo
Restrições de Integridade

Cláusula PRIMARY KEY
◦ identifica os atributos que formam a
chave primária
 NOT NULL
◦ sintaxe
PRIMARY KEY (atributo1, atributo2, ...,
atributoX)

Cláusula UNIQUE
◦ não permite valores duplicados para um
atributo
Restrições de Integridade

Cláusula DEFAULT
◦ associa um valor default para um atributo,
caso nenhum outro valor seja
especificado

Cláusula CHECK
◦ especifica um predicado que precisa ser
satisfeito por todas as tuplas de uma
relação
◦ exemplos
 saldo int CHECK (saldo >= 0)
 nível char(15) CHECK (nível IN
Restrições de Integridade

Integridade referencial
◦ dependência existente entre a chave
estrangeira de uma relação R1 (referência) e
a chave primária da relação referenciada R2
(relação referida).
◦ problemas
 atualização ou exclusão de elementos da chave
primária sem fazer um ajuste coordenado nas
chaves estrangeiras:
 Excluir tupla de Empregado que é gerente de
Departamento.
 inclusão ou alteração de valores não nulos na
chave estrangeira de R1 que não existam na chave
primária de R2
Restrições de Integridade

Cláusula FOREIGN KEY
◦ características
 elimina a possibilidade de violação da
integridade referencial
 reflete nas chaves estrangeiras todas as
alterações na chave primária
◦ sintaxe
FOREIGN KEY (atributos)
REFERENCES nome_relação (atributos)
[ON UPDATE [NO ACTION | CASCADE | SET NULL | SET
DEFAULT]]
[ON DELETE [NO ACTION | CASCADE | SET NULL | SET
DEFAULT]]
DROP TABLE

Remove uma tabela existente do BD
◦ dados
◦ índices, etc.

Usuários autorizados
◦ proprietário do banco de dados
◦ DBA
DROP TABLE nome_tabela ;
ALTER TABLE

Altera o esquema de uma tabela do
BD
colunas ou
◦ adiciona
◦ remove
◦ altera
restrições de
integridade
ALTER TABLE nome_tabela;
Exemplos: ALTER TABLE

inclui novas colunas na tabela
ALTER TABLE nome_tabela
ADD (A1 D1 R1),
...
ADD (An Dn Rn)

elimina uma coluna já existente da
tabela
ALTER TABLE nome_tabela DROP A1
Exemplos: ALTER TABLE

modifica o nome de uma coluna
existente de A1 para A2
ALTER TABLE nome_tabela ALTER [COLUMN]
A1
TO A2

modifica o tipo de dado de uma
coluna
ALTER TABLE nome_tabela
ALTER [COLUMN] A1 TYPE INT
SQL DDL

CREATE DOMAIN
◦ cria um domínio para um tipo de dados

DROP DOMAIN
◦ remove um domínio existente do BD

ALTER DOMAIN
◦ altera a definição de domínio
CREATE DOMAIN

Cria um domínio para um tipo de
dados
◦ restrições de integridade

Característica
◦ a definição do domínio é global ao BD
CREATE DOMAIN nome_domínio [AS] tipo_dado
[DEFAULT ... ]
[NOT NULL]
[CHECK ...]
... ;
DROP DOMAIN

Remove um domínio existente do BD
◦ falha caso o domínio esteja definindo o
tipo de dado de alguma coluna

Usuários autorizados
◦ proprietário do banco de dados
◦ DBA
DROP DOMAIN nome_domínio ;
ALTER DOMAIN

Altera um domínio existente do BD
◦ remove ou define restrições de
integridade
ALTER DOMAIN nome_domínio... ;
Exemplo
Exemplo ...
CREATE DATABASE loja_vinhos;
CREATE TABLE região
(
região_id int NOT NULL,
nome_região varchar(100) NOT NULL,
mapa_região blob,
descrição_região blob,
PRIMARY KEY (região_id),
);
* BLOB: Binary Long Objects (para armazenar áudio e
vídeo)
Exemplo ...
CREATE TABLE vinícola
(
vinícola_id int NOT NULL,
nome_vinícola varchar(100) NOT NULL,
descrição_vinícola blob,
fone_vinícola varchar(15),
fax_vinícola varchar(15),
região_id int DEFAULT ‘0’ NOT NULL,
PRIMARY KEY (vinícola_id),
FOREIGN KEY (região_id)
REFERENCES região (região_id)
ON UPDATE SET DEFAULT,
ON DELETE SET DEFAULT,
);
Exemplo
CREATE TABLE vinho
(
vinho_id int NOT NULL,
nome_vinho varchar(50) DEFAULT ‘ ’ NOT NULL,
tipo_vinho varchar(10) DEFAULT ‘ ’ NOT NULL,
ano_vinho int DEFAULT ‘0’ NOT NULL,
descrição_vinho blob,
vinícola_id int DEFAULT ‘0’ NOT NULL,
PRIMARY KEY (vinho_id),
FOREIGN KEY (vinícola_id)
REFERENCES vinícola (vinícola_id),
ON UPDATE CASCADE,
ON DELETE CASCADE,
);
SQL DML

SELECT ... FROM ... WHERE ...
◦ lista atributos de uma ou mais tabelas de
acordo com alguma condição

INSERT INTO ...
◦ insere dados em uma tabela

DELETE FROM ... WHERE ...
◦ remove dados de tabelas já existentes

UPDATE ... SET ... WHERE ...
◦ altera dados específicos de uma tabela
SELECT
SELECT <lista de atributos>
FROM <lista de tabelas>
[ WHERE predicado/condição ]
[ GROUP BY <atributos de agrupamento> ]
[ HAVING <condição para agrupamento> ]
[ ORDER BY <lista de atributos> ] ;
SELECT

Cláusula SELECT (lista de atributos)
◦ lista os atributos cujos valores serão
recuperados.

Cláusula FROM (lista de tabelas)
◦ especifica as relações necessárias para o
processamento da consulta.

Cláusula WHERE (condição)
◦ especifica as condições para a seleção
das tuplas a serem recuperadas.
◦ pode ser omitida.
Exemplo 1:

SELECT datanasc, endereco
FROM Empregado
WHERE Pnome=Flavia AND
Unome=Bernardini
SELECT

Resultado de uma consulta
◦ ordem de apresentação dos atributos
 ordem dos atributos na cláusula SELECT
◦ ordem de apresentação dos dados (parte
das tuplas)
 ordem ascendente ou descendente de acordo com
a cláusula ORDER BY
 sem ordenação
◦ duas ou mais tuplas podem possuir valores
idênticos de atributos
 para eliminação de tuplas duplicadas: SELECT
DISTINCT
Exemplo 2:
Select model
From PC
Where speed > 1000 AND rd = ’16xDVD’;
Select model: atributos selecionados (π)
From PC: tabelas afetadas
Where ...: condição de filtro (σ), que é
opcional
Expressão em AR:
πmodel(σspeed>1000 AND RD=’16xDVD’(PC))
Projeção





Lista de atributos do select
Podem ser renomeados (ρ em AR)
Podem conter expressões e constantes
Curinga ‘*’ lista todos os atributos
Pode conter o modificador DISTINCT
Select DISTINCT ram AS memória, price*1.2,
‘reais’ AS moeda
From ...
Where ...;
Seleção
Conteúdo do where
 Pode conter qualquer expressão
condicional usual de Ling’s de
Programação

Select *
From PC
Where speed > 100 AND hd <> 40 AND
NOT (ram < 512);
Cláusula WHERE

Operadores de comparação
igual a
=
diferente de
<>
maior que
>
maior ou igual
a
>=
menor que
<
menor ou igual
a
<=
entre dois
valores
BETWEEN ...
AND ...
de cadeias de
caracteres
LIKE ou
NOT LIKE
Strings
Representadas entre ‘ ’
Podem ter tamanho fixo ou variável (CHAR
e VARCHAR)
 Podem ser comparadas lexicograficamente
(=, <, >, ...)
 Operador LIKE: compara strings baseadas
num padrão:


Select model
From Printer
Where type LIKE ‘las__’ OR type LIKE
‘%jet%’;
Strings

Operadores de comparação de
cadeias de caracteres
◦ % (porcentagem): substitui qualquer
string
◦ _ (underscore): substitui qualquer
caractere

Característica
◦ operadores sensíveis ao caso
 letras maiúsculas são consideradas diferentes
de letras minúsculas
Exemplo
Cláusula WHERE

Exemplos
◦ WHERE nome_região LIKE ‘Mar%’
 qualquer string que se inicie com ‘Mar’
◦ WHERE nome_região LIKE ‘Mar_’
 qualquer string de 4 caracteres que se inicie
com ‘Mar’
Exemplos

SELECT *
FROM região;

SELECT região_id, nome_região
FROM região
WHERE nome_região LIKE ‘M%’ AND
região_id >= 3 AND
mapa_região IS NOT NULL;
Data e Hora

Implementações de SQL usualmente
suportam tipos específicos para data
(DATE) e hora (TIME)
◦ Exemplo: ‘1975-07-07’ e ’20:05:00.5’

Timestamp é um tipo comum que
combina data e hora
◦ Exemplo: ‘1975-07-07 20:05:00’
Null
Valor especial em SQL
 Entretanto, não há como utilizá-los
explicitamente em expressões SQL (um
teste, por exemplo)
 Em clásulas Where, precisamos nos
preparar para a ocorrência de valores
nulos:

◦ Operações aritméticas envolvendo NULL
retornam NULL
◦ Operações de comparação envolvendo NULL
retornam UNKNOWN (terceiro valor-verdade)
Unknown
Terceiro valor-verdade
 Pode ser interpretado como ½, com
TRUE=1 e FALSE=0
 Fórmulas

◦ A AND B = MIN (A, B)
◦ A OR B = MAX (A, B)
◦ NOT A = |1 – A|

Caso atípico:
Select * From Laptop
Where screen > 14.0 OR screen <= 14.0;
Operações sobre conjuntos

SQL
Álgebra Relacional
UNION
União
INTERSECT
Intersecção
MINUS
Diferença
Observações
◦ as relações participantes das operações
precisam ser compatíveis.
Exemplo

Liste os anos de fabricação dos vinhos
tintos e brancos:
SELECT ano_vinho
FROM vinho
WHERE tipo_vinho = ‘tinto’
UNION ALL
SELECT ano_vinho
FROM vinho
WHERE tipo_vinho = ‘branco’;

Modificador ALL considera duplicatas
Exemplo
(Select model
From Product
Where maker = ‘A’) UNION
(Select model
From PC
Where price < 1000)
Junção

Usar SELECT e WHERE
◦ especificam atributos com mesmo nome
usando nomes de tabelas e atributos
(nome_tabela.nome_atributo)

Cláusula FROM
◦ possui mais do que uma tabela

Cláusula WHERE
◦ inclui as condições de junção
Exemplo
Select maker
From Product, Printer
Where Product.model = Printer.model AND
Printer.type = ‘laser’;

From Product, Printer realiza o produto
cartesiano entre as 2 tabelas
Exemplo
SELECT nome_vinícola, nome_região
FROM vinícola, região
WHERE vinícola.região_id = região.região_id;
SELECT nome_vinícola, nome_região,
nome_vinho
FROM vinícola, região, vinho
WHERE vinícola.região_id = região.região_id
AND vinho.vinícola_id = vinícola.vinícola_id;
Variáveis de Tupla

Imagine uma consulta que retorne os
modelos de PC’s com a mesma
quantidade de hd
Select p1.model, p2.model
From PC p1, PC p2
Where p1.hd = p2.hd AND p1.model <
p2.model;
Sub-consultas Aninhadas

Produzindo um valor atômico:
Select maker
From Product
Where type = ‘printer’ AND
Product.model =
(Select model
From Printer
Where price < 500)
Condições envolvendo Relações
(1/2)

Operadores existentes: EXISTS, IN, ALL,
ANY e combinações com NOT
Select maker
From Product
Where type = ‘printer’ AND Product.model IN
(Select model
From Printer
Where price < 500)
Condições envolvendo Relações
(2/2)

Significado dos operadores:
◦
◦
◦
◦
EXISTS R: TRUE se R <> {}
s IN R: TRUE se s  R
s > ALL R: TRUE se s > t, t  R
s > ANY R: TRUE se s > t, t  R
O que esta consulta retorna?
Select p1.maker
From Product p1
Where p1.type = ‘printer’ AND EXISTS (
Select *
From Product p2
Where p2.model = p1.model AND
p2.maker <> p1.maker );
E esta?
Select l.model
From Laptop l
Where l.price < ANY (
Select p.price
From PC p);
Sub-consultas Relacionadas

Consultas que obrigam a avaliação de
consultas aninhadas diversas vezes
Select model
From Laptop l
Where price <= ANY
(Select price
From PC
Where l.hd >= hd);
Sub-consultas em Cláusulas
From
Select distinct p1.maker
From Product p1,
( Select *
From Printer
Where color = ‘true’ ) p2
Where p1.model = p2.model;
Expressões de Junção SQL
(Joins)

Sejam R e S relações (tabelas)
◦
◦
◦
◦
R cross join S; (produto cartesiano)
R join S on CONDIÇÃO; (junção theta)
R natural join S; (junção natural)
R natural {full | left | right} outer join (outer
join)
Cláusula ORDER BY

Ordena as tuplas resultantes de uma
consulta
◦ asc: ordem ascendente (padrão)
◦ desc: ordem descendente

Ordenação pode ser especificada em
vários atributos
◦ Ordenação referente ao primeiro atributo é
prioritária.
◦ Se houver valores repetidos, então é
utilizada a ordenação referente ao segundo
atributo, e assim por diante
Exemplo


Liste os dados das vinícolas e suas
regiões.
Ordene o resultado pela região da
vinícola em ordem ascendente.
SELECT *
FROM vinícola, região
WHERE vinícola.região_id =
região.região_id
ORDER BY nome_região asc
Agregação – Operadores


SUM, AVG, MIN, MAX e COUNT
Tipicamente utilizados com expressões
escalares com uma coluna numérica
Select AVG (price)
From Laptop;

Observações:
◦ Exceção é o COUNT (*), que conta o número de
tuplas de uma relação
◦ DISTINCT: não considera valores duplicados
◦ ALL: inclui valores duplicados

Características
◦ recebem uma coleção de valores como entrada;
◦ retornam um único valor.
Funções de Agregação
vinho (vinho_id, nome_vinho, tipo_vinho, preço,
vinícola_id)
vinho_id
nome_vinho tipo_vinho
preço
vinícola_id
10
Sta Carolina
Merlot
35,00
1
09
Sta Carolina
Carménere
36,00
1
05
Sta Helena
Cabernet
Sauvignon
50,00
2
15
Sta Helena
Cabernet
Blanc
53,00
2
27
Casillero del
Diablo
Cabernet
Ssuvignon
90,00
3
48
Casillero del
Diablo
Carménere
98,00
3
13
Reservado
Carménere
60,00
3
12
Reservado
Cabernet
Sauvignon
62,00
3
Exemplos
Quantos vinhos existem na relação
vinho?
 Quantos tipos de vinho diferentes
existem na relação vinho?
 Qual a média dos preços?
 Qual a soma dos preços?
 Qual o preço mais baixo?
 Qual o preço mais alto?

Agrupamento - Cláusula GROUP
BY

Funcionalidade:
◦ permite aplicar uma função de agregação
não somente a um conjunto de tuplas,
mas também a um grupo de um conjunto
de tuplas;

Grupo de um conjunto de tuplas:
◦ conjunto de tuplas que possuem o
mesmo valor para os atributos de
agrupamento;
Exemplo

Qual o preço mais alto e a média dos
preços por tipo de vinho?
SELECT tipo_vinho, MAX (preço), AVG
(preço)
FROM vinho
GROUP BY tipo_vinho
Exemplo
Select type, COUNT(DISTINCT maker)
From Product
Group By type;
Agrupamento
Para a consulta anterior:
Select type, COUNT(DISTINCT maker)
From Product
Group By type;


Como reformulá-la para retornar
produtos diferentes de PC?
Agrupamento
Select type, COUNT(DISTINCT maker)
From Product
Where type <> ‘PC’
Group By type;
Agrupamento
E para retornar apenas produtos com
número >= 3 fabricantes?
Cláusula HAVING

Funcionalidade:
◦ especificar uma condição de seleção para
grupos;

Resposta:
◦ recupera os valores para as funções
somente para aqueles grupos que
satisfazem à condição imposta na
cláusula HAVING;
Exemplo

Qual o preço mais alto e a média dos
preços por tipo de vinho, para médias
de preços superiores a R$200,00
SELECT tipo_vinho, MAX (preço), AVG
(preço)
FROM vinho
GROUP BY tipo_vinho
HAVING AVG (preço) > 200
Exemplo
Select type, COUNT(DISTINCT maker)
From Product
Group By type
HAVING COUNT(DISTINCT maker) >=
3;
Atualização em
Bancos de Dados

Inserção, Remoção e Alteração
Inserção:
INSERT INTO R (A1,...,An) VALUES (v1,...,vn);

Onde:
R: Relação
Ak: Atributos
vk: valores
INSERT INTO R VALUES (v1,...,vn);
 Usado quando há valores vk para todos os
atributos de R
◦ Ordem dos atributos precisa ser mantida
INSERT
INSERT INTO nome_tabela
SELECT ...
FROM ...
WHERE ... ;

Tuplas resultantes da cláusula
SELECT serão inseridas na tabela
nome_tabela
Atualização em
Bancos de Dados
Remoção
DELETE FROM R WHERE <condição>;
 Atualização
UPDATE R SET <atribuições> WHERE
<condição>;
 Exemplo:
UPDATE Laptop
SET price = price * 1.1
WHERE speed >= 600;

DELETE



Remove tuplas inteiras
Opera apenas em uma relação
Tuplas de mais de uma relação a serem
removidas:
◦ um comando DELETE para cada relação
* A remoção de uma tupla de uma relação
pode ser propagada para tuplas em
outras relações devido às restrições de
integridade referencial.
Exemplo
DELETE FROM vinícola
WHERE vinícola_id = 10;
◦ remove a tupla referente a vinícola_id =
10;
◦ tabela vinho (i.e., se CASCADE foi
especificada na cláusula ON DELETE p/
vinícola_id desta tabela)
DELETE FROM região
◦ remove todos os dados da tabela região
UPDATE

Opera apenas em uma relação
* A atualização da chave primária pode
ser propagada para tuplas em outras
relações devido às restrições de
integridade referencial
Exemplos

Alterar os anos de produção de vinhos
de 2005 para 2003
UPDATE vinho
SET ano_vinho = 2003
WHERE ano_vinho = 2005;

Suponha o atributo adicional preço na
tabela vinho. Aumentar os preços dos
vinhos em 10%.
UPDATE vinho SET preço = preço * 1.10;
Exemplo
UPDATE vinícola
SET vinícola_id = 10
WHERE vinícola_id = 2;

altera o valor de vinícola_id = 10 para
vinícola_id = 2
◦ tabela vinícola
◦ tabela vinho (i.e., se a opção CASCADE
foi especificada na cláusula ON UPDATE
do campo vinícola_id desta tabela)
Índices
São criados baseados em 1 ou + campos
 São estruturas de dados que tornam mais
eficientes as consultas sobre esse atributos
CREATE INDEX velocIndex ON PC(speed);
DROP INDEX velocIndex;
 2 fatores a se considerar:

◦ Tornam eficientes as consultas que utilizam este
atributos
◦ Tornam mais custosas as operações de
inserção, remoção e atualização
Visões
São relações abstratas (virtuais)
 CREATE TABLE cria relações que existem
fisicamente, enquanto que CREATE VIEW
cria visões, as quais não existem
fisicamente e tipicamente expressam o
resultado de um consulta
 Diferentemente do resultado das consultas,
visões podem ser consultadas como
tabelas (como se existissem fisicamente)

Exemplo de Definição e Uso de
Visão
CREATE VIEW Barganha(modelo, ram,
hd, preço) AS
SELECT model, ram, hd, price
FROM Laptop
WHERE price < 1300;
SELECT Min(preco)
FROM Barganha;
Modificação de Visões (Visões
Atualizáveis)
Nem sempre são possíveis
 A operação que mais restringe é a inclusão:

◦ Esta não pode infringir a integridade do banco
(os atributos não citados na inclusão precisam
poder admitir NULL ou valores padrão)
 Por exemplo, se o campo speed da relação Laptop não
admitisse NULL
◦ Uma tupla inserida numa visão precisa ser
inserida na tabela base e constar na visão
resultante
 No exemplo citado, não podemos inserir um laptop com
preço >= 1300
Modificação de Visões (Visões
Atualizáveis)
Remoções e atualizações numa visão
são traduzidas para operações
equivalentes na tabela base:
DELETE FROM Barganha
WHERE ram < 512;

DELETE FROM Laptop
WHERE ram < 512 AND price < 1300;
Modificação de Visões (Visões
Atualizáveis)
O comando DROP TABLE remove a
tabela base e inutiliza (e
eventualmente também remove) as
visões baseadas nesta tabela
 DROP VIEW remove apenas a visão,
ou seja, não remove as tuplas da
tabela base

Restrições (Constraints)
Uma forma de definição de elementos
ativos em Bancos de Dados
 Utilizados para garantir integridade do
sistema (tanto na visão do modelo
relacional quanto na de regras de
negócio)
 Um exemplos de restrições são as
chaves primárias e estrangeiras

Chave Primária
Exemplo:
CREATE TABLE PC (
model INTEGER PRIMARY KEY,
speed INTEGER,
... ); ou

CREATE TABLE PC (
model INTEGER,
speed INTEGER,
PRIMARY KEY (model), ...);
Campo UNIQUE
Além da chave primária, com o modificador
UNIQUE podemos garantir também que
outros campos tenham valores distintos
 Diferentemente de chave primária, um
campo UNIQUE permite valores NULL
CREATE TABLE Printer (
model INTEGER PRIMARY KEY,
color BOOLEAN,
type VARCHAR(50) UNIQUE, ...);

Chaves Estrangeiras

Possibilitam a associação entre tabelas
CREATE TABLE Aluno (
matr INTEGER,
nome VARCHAR (100) NOT NULL,
cr FLOAT,
codCurso INTEGER,
PRIMARY KEY (matr),
FOREIGN KEY (codCurso) REFERENCES
Curso(cod);
Manutenção da Integridade
Referencial

Na realização de modificações sobre
tuplas que são referenciadas em
outras tabelas (chaves estrangeiras),
as seguintes ações podem ser
definidas:
◦ Rejeição das modificações (operação
padrão em BDs)
◦ Modificações em cascata (altera também
as referências)
◦ Modificações gerando NULL (no caso de
remoções, é atribuído NULL à referência)
Sintaxe de Ações sobre Chaves
Estrangeiras
CREATE TABLE Aluno (
matr INTEGER,
nome VARCHAR (100) NOT NULL,
cr FLOAT,
codCurso INTEGER,
PRIMARY KEY (matr),
FOREIGN KEY (codCurso) REFERENCES
Curso(cod) ON (DELETE | UPDATE) (CASCADE |
SET NULL | REJECT) *;
* Sintaxe de expressões regulares: () encapsula
termos e | é um OU de termos
Asserções (Assertions)
Uma asserção é uma expressão em
SQL de valor booleano que precisa
ser verdadeira sempre
 Formato:
CREATE ASSERTION <nome> CHECK
<condição>;
DROP ASSERTION <nome>;
 Qualquer modificação que invalide
uma asserção será rejeitada

Asserções
Exemplo
CREATE ASSERTION crIncorreto
CHECK (
NOT EXISTS (
SELECT *
FROM Aluno a
WHERE a.cr > 0 AND NOT EXISTS (
SELECT *
FROM Historico h
Where a.mat = h.mat );
Gatilhos (Triggers)


Um gatilho é uma série de ações que são
associadas a eventos num BD, como inserções,
atualizações e remoções
Regras ECA (Evento – Condição – Ação)
CREATE TRIGGER Atualizar
AFTER INSERT ON Historico
REFERENCING NEW ROW AS NovaTupla
FOR EACH ROW BEGIN
UPDATE Aluno a
SET cr = (SELECT AVG(nota) FROM Historico
WHERE a.mat = NovaTupla.mat)
WHERE a.mat = NovaTupla.mat;
...
END;
Gatilhos

Opções:
◦
◦
◦
◦
◦
◦
◦
◦
◦
◦
AFTER / BEFORE / INSTEAD OF
INSERT / DELETE / UPDATE
WHEN (condição para disparo do gatilho)
BEGIN .. END; (+ de 1 expressão SQL)
OLD/NEW ROW AS (Atualização)
NEW ROW AS (Inserção)
OLD ROW AS (Remoção)
FOR EACH ROW / STATEMENT
OLD TABLE AS
NEW TABLE AS
Programação
com Banco de Dados

2 alternativas:
◦ Codificação utilizando uma biblioteca de
acesso ao banco de dados
 Exemplo: C, C++, ...
◦ Utilizar os recursos existentes na
linguagem (se for o caso) para acesso ao
banco de dados
 Java, PHP, ...
Procedimentos e
Funções Armazenados (Stored
Procedures)





São módulos (procedimentos ou funções) précompilados e armazenados no SGBD
O termo padrão em SQL é PSM (Persistent Stored
Modules)
Permitem o encapsulamento de definições do
esquema de um BD e melhoram o desempenho
Dispondo de recursos de linguagem de
programação (variáveis, condicionais, repetições,
etc), estes módulos podem realizar diversas
operações para uma única chamada
Estes procedimentos podem conter parâmetros
com tipos de SQL e modos de entrada (IN), saída
(OUT) e entrada juntamente com saída (INOUT)
Stored Procedures
Exemplo
CREATE PROCEDURE Bonifica (
IN n FLOAT,
IN m VARCHAR (20)
)
IF n <= 1 (
UPDATE Aluno
SET nota = nota + n
WHERE mat = m; );
Stored Procedures
Situações Úteis
Se um BD precisa ser chamado em vários
aplicativos, estes módulos podem ser
armazenados no servidor
 Do contrário, teríamos instruções SQL repetidas
entre estes aplicativos
 Observe os diagramas abaixo sem e com stored
procedures e imagine a modificação do esquema
da tabela Aluno

Transações


São uma unidade lógica de trabalho
Necessárias quando se deseja que
operações sejam executadas como uma
única, de forma indivisível
◦ Por exemplo, uma operação de transferência
bancária pode ser traduzida como uma operação
de débito e outra de crédito
Transações se justificam pelo fato de um
SGBD ser multiusuário e multitarefa
 Ou seja, vários processos pode estar
executando sobre a mesma base de dados
e inconsistências podem ocorrer

Transações
Outra situação que justifica o uso de
transações é na ocorrência de falhas
 O SGBD garante que, dada uma transação
com n operações, ou as n operações são
executadas ou nenhuma delas
 O estado consistente existente antes da
execução de uma transação deve existir
após a execução desta
 Com isso, numa falha (disco, quebra no
sistema, exceção detectada pela
transação, etc), o SGBD deve ser capaz de
se recuperar da situação errônea

Transações –
Pseudo-código
BEGIN TRANSACTION;
UPDATE ACC 123 { Saldo := Saldo - $100 };
IF ocorrer_algum_erro GO TO UNDO; END
IF;
UPDATE ACC 456 { Saldo := Saldo + $100 };
IF ocorrer_algum_erro GO TO UNDO; END
IF;
COMMIT; GO TO FINISH;
UNDO: ROLLBACK;
Transações – Pontos
Importantes








COMMIT/ROLLBACK implícito
Tratamento de mensagens
Log de recuperação
Atomicidade de instruções
A execução de um programa é uma
seqüência de transações
Transações aninhadas
Corretude
Múltiplas associações
Transações
Transações

Tipos de transações
◦ Read-only
◦ Writable

Propriedades de transações (ACID)
◦ Atomicidade: todas operações ou nenhuma
◦ Correção: somente geram estados válidos
◦ Isolamento: atualizações percebidas entre
diferentes transações somente após o commit
◦ Durabilidade: Atualizações depois do commit
persistem após possível queda do sistema
Transações

Recuperação do sistema
◦ Buffers de BDs
◦ BDs físicos
◦ Checkpoints
Consultas vistas
anteriormente
select th.nome, tm.nome
from TabHomem as th, TabMulher as tm
where th.mulher = tm.id;
Retornar os nomes dos casais
Consultas vistas
anteriormente
select distinct tm.cidade
from TabHomem as th, TabMulher as tm
where th.mulher = tm.id AND
tm.nome like ‘%Brunet%’
order by tm.cidade desc;
Retornar os nomes das cidades em ordem
decrescente que possuem casais cuja mulher
tem Brunet no nome
Consultas Complexas
Teste de Campos Nulos
select nome
from TabHomem as t
where t.mulher is NULL;
Retornar os nomes dos homens que
não são casados
Consultas Complexas
Teste de Pertinência
select tm.nome, tm.tel
from TabMulher as tm
where tm.cidade in (‘Petropolis’,
‘Teresopolis’, ‘Friburgo’);
Retornar os nomes e telefones das
mulheres que moram na região serrrana
Consultas Complexas
Consultas Aninhadas
select nome
from TabHomem
where nome in (
select th.nome
from TabHomem as th, TabMulher as tm
where th.mulher = tm.id AND
th.cidade = tm.cidade );
Retornar os nomes dos homens que são
casados e moram na mesma cidade que a
sua mulher
Consultas Complexas
Consultas Aninhadas
select t.nome, t.tel
from TabHomem as t
where (t.nome, t.tel) in (
select th.nome, th.tel
from TabHomem as th, TabMulher as tm
where th.mulher = tm.id AND
th.cidade = tm.cidade );
Retornar os nomes e telefones dos homens
que são casados e moram na mesma cidade
que a sua mulher
Consultas Complexas
Teste de Existência
select th.nome, th.tel
from TabHomem as th
where exists (
select *
from TabMulher as tm
where th.cidade = tm.cidade );
Retornar os nomes e telefones dos homens
moram na mesma cidade que alguma mulher
Consultas Complexas
Teste de Existência
select th.nome, th.tel
from TabHomem as th
where th.mulher is NULL AND
not exists (
select *
from TabMulher as tm
where th.cidade = tm.cidade );
Retornar os nomes e telefones dos homens
que são solteiros e moram numa cidade que
não tem mulheres
Consultas Complexas
Comparações Avançadas
select tm.nome, tm.tel
from TabMulher as tm
where tm.salario > ALL (
select th.salario
from TabHomem as th );
Retornar os nomes e telefones das
mulheres que possuem salários maiores
que todos os homens (mulheres
independentes)
Consultas Complexas
Variações de Pertinência
select tm.nome, tm.tel
from TabMulher as tm
where not exists (
( select th.id
from TabHomem as th
where th.cidade = tm.cidade )
except
( select th.id
from TabHomem as th
where th.mulher is not Null ) );
Retornar os nomes e telefones das mulheres que
moram numa cidade que não possua homens solteiros
Consultas Complexas
Variações de Consultas Aninhadas
select count(*)
from TabMulher as tm
where tm.salario >
( select avg(th.salario)
from TabHomem as th );
Retornar a quantidade mulheres que
possuem salário maior que a média
masculina
Consultas Complexas
Agrupamento
select tm.cidade, count(*)
from TabMulher as tm
group by tm.cidade;
Retornar a cidade e a respectiva
quantidade de mulheres
Consultas Complexas
Variações com Agrupamento
select tm.cidade, count(*)
from TabMulher as tm
where tm.salario >
( select avg(th.salario)
from TabHomem as th )
group by tm.cidade;
Retornar a cidade e a quantidade das
mulheres que possuem salário maior que a
média masculina
Junção de Tabelas
select tm.nome, tm.tel
from (TabMulher tm join TabHomem th on
id=mulher)
where tm.cidade=‘Petrópolis’;
Retornar nome e telefone das mulheres
casadas que moram em Petrópolis
Junção de Tabelas
Natural Join
select tm.nome, tm.tel
from TabMulher tm natural join
(TabHomem as th (idh, nome, tel, end,
id))
where tm.cidade=‘Petrópolis’;
Retornar nome e telefone das mulheres
casadas que moram em Petrópolis
(renomeia a tabela TabHomem para que
a junção natural possa ser executada)
Junção de Tabelas
Inner Join
select tm.nome, tm.tel
from TabMulher as tm, TabHomem as th
where tm.id=th.mulher;
Retornar nome e telefone das mulheres
casadas (Somente retorna a lista das
casadas)
Junção de Tabelas
Outer Join
select tm.nome, tm.tel
from TabMulher as tm left outer join
TabHomem as th on tm.id=th.mulher;
Retornar nome e telefone das mulheres
casadas (Forçar retorno da lista de todas
as mulheres)
Exercícios
Retornar uma tabela que contenha o
nome do professor, ano e a quantidade
de disciplinas ministradas neste ano.
 Retornar uma tabela que contenha o
nome do professor, ano, quantidade de
alunos que cursaram as disciplinas e a
quantidade de disciplinas ministradas
neste ano.

Download