Captulo 5
UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003.
Introduo
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.
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
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.
[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.
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.
(sid) sname rating age 22 22 31 31 58 58 dustin dustin lubber lubber rusty rusty
S4
7 7 8 8 10 10
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.
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.
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.
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'
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.
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.
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.
14
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)
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
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)
SELECT S.sname, S.age FROM Sailors S WHERE S.age= (SELECT MAX(S2.age) FROM Sailors S2)
UNICAMP/IC/MO410/2003-4 - Slides do livro Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke, McGrow-Hill, 2003. Exemplos
Ver Instncias
17
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.
(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
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.
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
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
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
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
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
SELECT S.rating FROM Sailors S WHERE AVG(S.age) = (SELECT MIN (AVG (S2.age)) FROM Sailors S2)
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.
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.
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.
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.
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
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