Você está na página 1de 36

SQL: Consultas, Programao, Gatilhos

Captulo 5

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Introduo

O que SQL ? Structured Query Language


Linguagem comercial de banco de dados mais utilizada no mercado.

Origem
Originalmente chamada de SEQUEL e desenvolvida pela IBM como parte do projeto Sistema R no incio dos anos 70.

Padro ANSI/ISO
SQL:1999. Nem todos os fabricantes implementam 100% SQL padro.

Objetivo
A linguagem SQL tem diversas partes: definio de dados, manipulao de dados, autorizao, integridade, controle de transaes... O foco deste captulo a manipulao dos dados = DML.

Tpicos a serem discutidos


2

Consultas bsicas e aninhadas, conjuntos de operadores, valores nulos, restries de integridade triggers . and J. Gehrke, McGrow-Hill, 2003. UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems e 3ed, R. Ramakrishnan

Instncias Exemplos

Utilizaremos estas instncias das relaes Marinheiros (Sailors), Barcos (Boats) e Reservas (Reserves) em nossos exemplos.
Marinheiros

Barcos

bid 101 102 103 104

bname Interlake Interlake Clipper Marine

color blue red green red

sid 22 29 31 32 58 64 71 74 85 95

sname Dustin Brutus Lubber Andy Rusty Horatio Zorba Horatio Art Bob

rating 7 1 8 8 10 7 10 9 3 3

age 45.0 33.0 55.5 25.5 35.0 35.0 16.0 35.0 25.5 63.5

Reservas

sid 22 22 22 22 31 31 31 64 64 74

bid 101 102 103 104 102 103 104 101 102 103

day 10/10/98 10/10/98 10/8/98 10/7/98 11/10/98 11/6/98 11/12/98 9/5/98 9/8/98 9/8/98

B1

S3

R2

Se a chave da relao de Reservas tivesse apenas os atributos sid e bid, o que seria diferente na semntica?
3

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Retornar ltimo slide

Consulta Bsica SQL


SELECT FROM WHERE

[DISTINCT]

select-list

from-list qualification

from-list: lista de nomes de relaes (possivelmente com um varivel tupla (apelido) depois de cada nome). select-list:lista de atributos das relaes que esto na lista de relaes. qualification: comparaes (Atrib op Const ou Atrib1 op Atrib2, onde op pode ser <, >, =, , ,) combinadas com AND, OR, e NOT. DISTINCT uma palavra chave opcional indicando que a resposta no deveria conter linhas duplicadas. Por padro, as linhas duplicadas no so eliminadas!
4

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Estratgia de Avaliao Conceitual

A semntica de uma consulta SQL definida pela seguinte estratgia de avaliao conceitual:

Compute o produto cartesiano da lista de relaes. Elimine as linhas resultantes que no atendem s condies de qualificao. Eliminar todos os atributos que no esto na lista de atributos.

Se DISTINCT especificado, eliminar as linhas duplicadas. Esta estratgia provavelmente o caminho menos eficiente de executar uma consulta! Um otimizador encontrar estratgias mais eficientes para obter as mesmas respostas.

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Exemplo da Avaliao Conceitual


SELECT FROM WHERE

S.sname Sailors S, Reserves R S.sid=R.sid AND R.bid=103

(sid) sname rating age 22 22 31 31 58 58 dustin dustin lubber lubber rusty rusty
S4

(sid) bid day 22 58 22 58 22 58


x

7 7 8 8 10 10

45.0 45.0 55.5 55.5 35.0 35.0

101 10/10/96 103 11/12/96 101 10/10/96 103 11/12/96 101 10/10/96 103 11/12/96
R3
6

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Uma nota sobre variveis tupla

Realmente necessrio apenas se a mesma relao aparecer mais de uma vez na clusula FROM. A consulta anterior pode ser escrita assim: S.sname Sailors S, Reserves R S.sid=R.sid AND bid=103 SELECT sname FROM Sailors, Reserves WHERE Sailors.sid=Reserves.sid AND bid=103
SELECT FROM WHERE
considerado um bom estilo, porm recomendase utilizar sempre variveis tupla para melhorar a legibilidade de suas consultas.

OU

O bid=103 no precisou de varivel tupla este atributo s existe na tabela de Reserves. Mas recomendado utilizar .
7

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre os marinheiros que reservaram pelo menos um barco.


SELECT S.sid FROM Sailors S, Reserves WHERE S.sid=R.sid

Adicionar DISTINCT a essa consulta faria alguma diferena? Qual o efeito de substituir S.sid por S.sname na clusula SELECT ? Adicionar DISTINCT a essa variao faria alguma diferena?

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Ver Instncias Exemplos

Expresses e Strings
SELECT S.age FROM Sailors S WHERE S.sname LIKE B_%B

SELECT S.sname, S.rating+1 AS rating FROM Sailors S, Reserves R1, Reserves R2 WHERE S.sid = R1.sid AND S.sid = R2.sid AND R1.day = R2.day AND R1.bid <> R2.bid

Mostra o uso de expresses aritmticas e combinao de string. Encontre as idades dos marinheiros cujos nomes comeam e terminam com B e contenham pelo menos trs caracteres. LIKE usado para comparaes de strings. _ pode ser qualquer caracter Ver Instncias Exemplos % pode ser 0 ou mais caracteres arbitrrios. AS e = so duas maneiras de nomear um campo em um resultado.
9

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre sids dos marinheiros que reservaram um barco vermelho ou um barco verde

UNION: Pode ser usado para calcular a unio de qualquer dois conjuntos de tuplas compatveis (que so elas mesmas o resultado das consultas SQL). Se substituir OR por AND na primeira verso, o que obtemos? O que obtemos se ns substituirmos UNION por EXCEPT?

SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND (B.color='red' OR B.color='green') SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='red' UNION SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='green'

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed,

Ver Instncias Exemplos R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

10

Encontre sids dos marinheiros que reservaram um barco vermelho e um barco verde

INTERSECT: Pode ser usado para calcular a interseo de qualquer dois conjuntos de tuplas compatveis. Includo no padro SQL/92, mas alguns sistemas no suportam. Compare a simetria do UNION com INTERSECT com as outras verses das mesmas consultas.

SELECT S.sid FROM Sailors S, Boats B1, Reserves R1, Boats B2, Reserves R2 WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND (B1.color='red' AND B2.color='green')
Campo chave!

SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='red' INTERSECT SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='green'

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003. Exemplos

Ver Instncias

11

Consultas Aninhadas
Encontre os nomes dos marinheiros que reservaram o barco #103
SELECT S.sname FROM Sailors S WHERE S.sid IN (SELECT R.sid FROM Reserves R WHERE R.bid=103)

Uma caracterstica muito poderosa do SQL: a clusula WHERE pode conter nela mesma uma consulta SQL! (De fato, clusulas FROM e HAVING tambm podem). Para encontrar marinheiros que no reservaram o barco #103, use NOT IN. Para entender a semntica da consulta aninhada, pense numa avaliao de laos aninhados. Para cada tupla de marinheiro, verifique a condio computando a sub-consulta.
12

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Consultas Aninhadas Correlacionadas


Consulta nomes de navegadores que reservaram o barco #103
SELECT S.sname FROM Sailors S WHERE EXISTS (SELECT * Ver Instncias Exemplos FROM Reserves R WHERE R.bid=103 AND S.sid=R.sid)

EXISTS outro operador de comparao, como IN. Se UNIQUE for usado e * for substitudo por R.bid, encontre os marinheiros com no mximo uma reserva do barco #103. (UNIQUE verifica as tuplas duplicadas; * significa todos os atributos. Porque temos que alterar * por R.bid?) Este exemplo mostra por que a sub-consulta deve ser recomputada para cada tupla de marinheiros.
13

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Mais operadores comparao-conjunto

Ns j vimos IN, EXISTS e UNIQUE. Podemos tambm utilizar NOT IN, NOT EXIST e NOT UNIQUE. Tambm esto disponveis: op ANY, op ALL, onde op pode ser >, <, =, , , Encontre os marinheiros cujo nvel melhor do que algum marinheiro chamado Horatio:
SELECT * FROM Sailors S WHERE S.rating > ANY (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=Horatio)

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Ver Instncias Exemplos

14

Reescrevendo consultas INSERSECT usando IN


Encontre sids dos marinheiros que reservaram ambos um barco vermelho e um verde:
SELECT S.sid FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color=red AND S.sid IN (SELECT S2.sid FROM Sailors S2, Boats B2, Reserves R2 WHERE S2.sid=R2.sid AND R2.bid=B2.bid AND B2.color=green)

De modo similar, consultas usando EXCEPT podem ser reescritas usando NOT IN. Para encontrar nomes (e no sids) dos marinheiros que reservaram barcos vermelhos e verdes, apenas substitua S.sid por S.sname na clusula SELECT. (Como fazer esta alterao numa consulta com INTERSECT?)
15

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Diviso em SQL
Encontre os marinheiros que reservaram todos os barcos.

(1)

Faremos de modo difcil, sem EXCEPT.

(2) SELECT S.sname

FROM Sailors S WHERE NOT EXISTS (SELECT B.bid Ver Instncias FROM Boats B Exemplos WHERE NOT EXISTS (SELECT R.bid Marinheiros tais que ... FROM Reserves R WHERE R.bid=B.bid no h barco sem... AND R.sid=S.sid)) uma reserva de marinheiro para barco
UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003. 16

SELECT S.sname FROM Sailors S WHERE NOT EXISTS ((SELECT B.bid FROM Boats B) EXCEPT (SELECT R.bid FROM Reserves R WHERE R.sid=S.sid))

Operadores Agregados

Extenso significativa da lgebra de relacional.

SELECT COUNT (*) FROM Sailors S SELECT COUNT (DISTINCT FROM Sailors S

COUNT (*) COUNT ( [DISTINCT] A) SUM ( [DISTINCT] A) AVG ( [DISTINCT] A) MAX (A) MIN (A)

S.sname)

Coluna simples SELECT AVG (S.age) FROM Sailors S WHERE S.rating=10

SELECT S.sname, S.age FROM Sailors S WHERE S.age= (SELECT MAX(S2.age) FROM Sailors S2)

SELECT AVG (DISTINCT S.age) FROM Sailors S WHERE S.rating=10

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003. Exemplos

Ver Instncias

17

Encontre o nome e a idade do marinheiro mais velho

A primeira consulta ilegal! (Ns veremos a razo mais tarde quando discutirmos sobre GROUP BY). A terceira consulta equivalente segunda, e permitida pelo padro SQL/92, mas no suportada por alguns sistemas.

SELECT S.sname, MAX FROM Sailors S

(S.age)

SELECT S.sname, S.age FROM Sailors S WHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2) SELECT S.sname, S.age FROM Sailors S WHERE (SELECT MAX (S2.age) FROM Sailors S2)

= S.age

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

18

Motivao para Agrupar

At agora, temos aplicados operadores de agregao para todas as tuplas (qualificadas). Algumas vezes, queremos aplic-los a vrios grupos de tuplas. Para cada nvel, encontre a idade do marinheiro mais jovem.

Em geral ns no sabemos quantos nveis existem, e quais os seus valores. Suponha que sabemos que valores dos nveis so de 1 a 10, podemos escrever 10 consultas como esta: For i = 1, 2, ... , 10: SELECT MIN (S.age) FROM Sailors S WHERE S.rating = i
19

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Consultas com GROUP BY e HAVING


SELECT [DISTINCT] select-list FROM from-list WHERE qualification GROUP BY grouping-list HAVING group-qualification

A lista de atributos contm: (i) nomes dos atributos e (ii) termos com operaes agregadas (ex: MIN(S.age)). A lista de atributos (i) deve ser um sub-conjunto da lista de grupos. Intuitivamente, cada tupla de resposta corresponde a um grupo, e estes atributos devem ter um nico valor por grupo. (Um grupo um conjunto de tuplas que tm o mesmo valor para todos os atributos na lista de grupos).

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

20

Avaliao Conceitual

O produto cartesiano da lista de relao calculado, as tuplas que falharam na qualificao so descartadas, os campos desnecessrios so excludos e as tuplas restantes so divididas em grupos por valor dos atributos definidos na lista de grupos. A qualificao do grupo ento aplicada para eliminar alguns grupos. Expresses na qualificao do grupo devem ter um nico valor por grupo! Para todos os efeitos, um atributo na qualificao do grupo que no argumento de um operador de agregao tambm aparece na lista de grupos. (SQL no explora semntica de chave primria aqui!) Uma tupla resposta gerada por grupo de qualificao.
21

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre a idade do marinheiro mais jovem com idade 18, para cada nvel com pelo menos 2 desses marinheiros Instncia de Marinheiro
S.rating, MIN (S.age) AS minage FROM Sailors S WHERE S.age >= 18 GROUP BY S.rating HAVING COUNT (*) > 1
SELECT

Relao resposta:

rating 3 7 8

minage 25.5 35.0 25.5

sid 22 29 31 32 58 64 71 74 85 95 96

sname rating age Dustin 7 45.0 Brutus 1 33.0 Lubber 8 55.5 Andy 8 25.5 Rusty 10 35.0 Horatio 7 35.0 Zorba 10 16.0 Horatio 9 35.0 Art 3 25.5 Bob 3 63.5 Frodo 3 25.5
22

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre a idade do marinheiro mais jovem com idade 18, para cada nvel com pelo menos 2 desses marinheiros
rating 7 1 8 8 10 7 10 9 3 3 3 age 45.0 33.0 55.5 25.5 35.0 35.0 16.0 35.0 25.5 63.5 25.5

rating 1 3 3 3 7 7 8 8 9 10

age 33.0 25.5 63.5 25.5 45.0 35.0 55.5 25.5 35.0 35.0

rating 3 7 8

minage 25.5 35.0 25.5

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

23

Encontre a idade do marinheiro mais jovem com idade 18, para cada nvel com pelo menos 2 marinheiros entre 18 e 60
HAVING COUNT (*) > 1 AND EVERY (S.age <=60)
rating 7 1 8 8 10 7 10 9 3 3 3 age 45.0 33.0 55.5 25.5 35.0 35.0 16.0 35.0 25.5 63.5 25.5

rating 1 3 3 3 7 7 8 8 9 10

age 33.0 25.5 63.5 25.5 45.0 35.0 55.5 25.5 35.0 35.0

rating minage 7 35.0 8 25.5

Se trocar EVERY por ANY, qual ser o resultado?


24

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre a idade do marinheiro mais jovem com idade 18, para cada nvel com pelo menos 2 marinheiros entre 18 e 60
S.rating, MIN (S.age) AS minage FROM Sailors S WHERE S.age >= 18 AND S.age <= 60 GROUP BY S.rating HAVING COUNT (*) > 1
SELECT

Instncia de Marinheiro
sid 22 29 31 32 58 64 71 74 85 95 96 sname rating age dustin 7 45.0 brutus 1 33.0 lubber 8 55.5 andy 8 25.5 rusty 10 35.0 horatio 7 35.0 zorba 10 16.0 horatio 9 35.0 art 3 25.5 bob 3 63.5 frodo 3 25.5
25

Relao resposta:

rating 3 7 8

minage 25.5 35.0 25.5

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Para cada barco vermelho, encontre o nmero de reservas para este barco
SELECT B.bid, COUNT(*) AS reservationcount FROM Sailors S, Boats B, Reserves R WHERE S.sid=R.sid AND R.bid=B.bid AND B.color='red' GROUP BY B.bid

Agrupando sobre uma juno de 3 relaes. O que obtemos removendo B.color=red da clusula WHERE e adicionando uma clusula HAVING com essa condio? E se retiramos a relao Marinheiros e a condio envolvendo S.sid?
26

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre a mdia de idade do marinheiro mais jovem com idade > 18, para cada nvel com pelo menos 2 marinheiros (de qualquer idade)
SELECT S.rating, AVG (S.age) as avgage FROM Sailors S WHERE S.age > 18 GROUP BY S.rating HAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating=S2.rating)

Mostra que a clusula HAVING tambm pode conter uma sub-consulta. Compare essa consulta com a que consideramos somente nveis com pelo menos 2 marinheiros maiores que 18 anos. O que acontece se a clusula HAVING for substituda por:
HAVING COUNT(*) > 1
27

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Encontre os nveis para qual a mdia de idade a mais baixa sobre todos os nveis

Operadores agregados no podem ser aninhados. ERRADO:

SELECT S.rating FROM Sailors S WHERE AVG(S.age) = (SELECT MIN (AVG (S2.age)) FROM Sailors S2)

Soluo correta (em SQL/92)


SELECT Temp.rating, Temp.avgage FROM (SELECT S.rating, AVG (S.age) AS avgage FROM Sailors S GROUP BY S.rating) AS Temp WHERE Temp.avgage = (SELECT MIN (Temp.avgage) FROM Temp)

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

28

Valores Nulos

s vezes os valores em uma tupla so desconhecidos (ex: um nvel no foi determinado) ou no aplicveis (ex: nome do cnjuge para uma pessoa solteira).
Para essas situaes o SQL tem o valor especial null.

A presena do null complica em vrias questes:


Operadores especiais precisam verificar se o valor ou no nulo. Nvel > 8 verdadeiro ou falso quando o nvel nulo? E as condies contendo os conectivos AND, OR, e NOT?

Precisamos ter lgica de 3 valores (verdadeiro, falso,desconhecido) O significado das construes deve ser definido cuidadosamente (ex: clusula WHERE elimina linhas que no so verdadeiras.) Novos operadores (em particular, outer joins ) so possveis/necessrios.
29

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Restries de Integridade (Reviso)

Uma RI descreve as condies que toda instncia vlida de uma relao deve satisfazer. Inserts/deletes/updates que violam as RIs so rejeitadas. Pode ser usado na semntica da aplicao (ex: sid a chave) ou prevenir inconsistncias (ex: sname tem que ser string, age deve ser < 200).

Tipos de RIs: restries de domnio, restries de chave primria, restries de chave estrangeira, restries gerais.

Restries de domnio: Valores de campo devem ser do tipo correto. Sempre obrigatrios.
30

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Restries gerais

teis quando so envolvidas mais RIs do que chaves Pode utilizar consulta para expressar uma restrio. Restries podem ser nomeadas.

CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( rating >= 1 AND rating <= 10 )

CREATE TABLE Reserves (sid INTEGER, bid INTEGER, day DATE, FOREIGN KEY (sid) REFERENCES Sailors
FOREIGN KEY (bid) REFERENCES Boats

CONSTRAINT noInterlakeRes CHECK (`Interlake <> ( SELECT B.bname FROM Boats B WHERE B.bid=Reserves.bid)))
31

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

Restries sobre Mltiplas Relaes

Inadequado e errado! Se Marinheiros est vazia, o nmero de tuplas de Barcos pode ser qualquer um! ASSERTION a soluo correta; no associado com umas das duas tabelas.

Nmero de barcos mais nmero de Marinheiros < 100.


CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 )

CREATE ASSERTION smallClub CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 )

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

32

Gatilhos (Triggers)

Gatilhos: procedimentos que so iniciados automaticamente se mudanas especificadas ocorrerem no banco de dados. 3 partes: Evento (ativa o gatilho). Condio (testa se os gatilhos deveriam ser executados). Ao (o que acontece se o gatilho for executado).

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

33

Gatilhos: Exemplo (SQL:1999)


CREATE TRIGGER youngSailorUpdate AFTER INSERT ON SAILORS REFERENCING NEW TABLE NewSailors FOR EACH STATEMENT INSERT INTO YoungSailors(sid, name, age, rating) SELECT sid, name, age, rating FROM NewSailors N WHERE N.age <= 18

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

34

Sumrio

SQL foi um fator importante para a rpida aceitao do modelo relacional; mais natural do que rpida, linguagens de consulta procedural. Relacionalmente completa. De fato, tem poder expressivo significativamente maior que a lgebra relacional. Consultas expressas em lgebra relacional podem ser expressas, de modo mais natural, em SQL. Existem vrias maneiras de se escrever uma consulta, o otimizador deve escolher o plano de avaliao mais eficiente. Na prtica, usurios devem estar atentos de como as consultas so otimizadas para um melhor resultado.

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

35

Sumrio (Continuao)

NULL para valores de campos desconhecidos trazem muitas complicaes. SQL permite especificao de ricas restries de integridade. Gatilhos respondem s alteraes realizadas no Banco de Dados.

UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.

36