Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Exemplos ilustrativos
1
Consulta Básica SQL
SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
❖ relation-list Uma lista de relações (possivelmente com uma
range-variable depois de cada nome).
❖ target-list Uma lista de atributos das relações em relation-list
❖ qualification Comparações (entre atributos e/ou constantes)
combinadas usando AND, OR e NOT.
❖ DISTINCT é uma palavra chave opcional indicando que a
resposta não deve contem duplicações. Duplicações não são
eliminadas por default ! (porque ?)
2
Exemplos de Avaliação Conceitual
SELECT S.sname
FROM Sailors S, Reserves R
WHERE S.sid=R.sid AND R.bid=103
3
Que sailors reservaram pelo menos 1 barco?
SELECT S.sid
FROM Sailors S, Reserves R
WHERE S.sid=R.sid
Expressões e Strings
4
Achar sid’s de sailors que reservaram um barco vermelho
ou um verde.
❖ UNION: Pode ser usado SELECT S.sid
para computar a união de FROM Sailors S, Boats B, Reserves R
dois conjuntos de tuplas WHERE S.sid=R.sid AND R.bid=B.bid
compatíveis (que são eles AND (B.color=‘red’ OR B.color=‘green’)
5
Consultas Aninhadas
Ache nomes de marinheiros que reservaram barco # 103
SELECT S.sname
FROM Sailors S
WHERE S.sid IN (SELECT R.sid
FROM Reserves R
WHERE R.bid=103)
6
Ainda sobre operadores de conjuntos
SELECT *
FROM Sailors S
WHERE S.rating > ANY (SELECT S2.rating
FROM Sailors S2
WHERE S2.sname=‘Horatio’)
Database Management Systems, R. Ramakrishnan
13
(tradução, autorizada, de Anna & Mario Nascimento)
7
Divisão em SQL
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))
Divisão em SQL
❖ Sem EXCEPT:
SELECT S.sname
(2) FROM Sailors S
WHERE NOT EXISTS (SELECT B.bid
FROM Boats B
WHERE NOT EXISTS (SELECT R.bid
FROM Reserves R
Sailors S such that ...
WHERE R.bid=B.bid
there is no boat B without ... AND R.sid=S.sid))
8
Operadores de Agregação
COUNT ( [DISTINCT] A)
❖ Extensão significante da álgebra SUM ( [DISTINCT] A)
relacional. AVG ( [DISTINCT] A)
MAX (A)
SELECT COUNT (*) MIN (A)
SELECT S.sname
FROM Sailors S single column
FROM Sailors S
SELECT AVG (S.age) WHERE S.rating= (SELECT MAX(S2.rating)
FROM Sailors S FROM Sailors S2)
WHERE S.rating=10
9
GROUP BY e HAVING
10
Avaliação Conceitual
11
Para cada barco vermelho, qual o o número de
reservas para este barco
12
Encontre as taxas para as quais a idade média a
menor sobre todas as taxas.
❖ Operadores de agregação não podem ser
aninhados. ERRADO:
SELECT S.rating
FROM Sailors S
WHERE S.age = (SELECT MIN (AVG (S2.age)) FROM Sailors S2)
❖ Solução correta (in 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)
Database Management Systems, R. Ramakrishnan
25
(tradução, autorizada, de Anna & Mario Nascimento)
Valores Nulos
❖ Os valores no campo de uma tupla são algumas vezes
desconhecidos ou não aplicaveis inapplicable
– SQL tem um valor nulo especial para estas situações.
❖ A presença de null complica muitos resultados. P.ex.:
– Operadores especiais para verificar se o valor é ou não nulo.
– rating>8 é verdadeiro ou falso quando rating é igual a nulo?
(Precisamos uma lógica de 3-valores).
– O significado das construção tem ser definido
cuidadosamente. (e.g., condição WHERE elimina linhas que
não são avaliadas como verdade.)
– Novos operadores (em particular, para outer joins)
possíveis/necessários
Database Management Systems, R. Ramakrishnan
26
(tradução, autorizada, de Anna & Mario Nascimento)
13
SQL Embutido
Cursores
❖ Podem ser declarados sobre uma relação ou consulta
❖ Pode-se abrir um cursor, e (repetidamente) capturar
tuplas, movendo o cursor.
– Pode usar uma clásula especial, chamada ORDER BY, em
consultas que são acessadas por cursor, para controlar a
ordem na qual as tuplas são retornadas.
◆ Campos em ORDER BY tem que aparecer também na condição
SELECT.
– A condição ORDER BY, que ordena a resposta tuplas, é
permitidas somente no contexto de um cursor.
❖ Pode-se também modificar/deletar tupla apontada
por um cursor.
Database Management Systems, R. Ramakrishnan
28
(tradução, autorizada, de Anna & Mario Nascimento)
14
Cursor com nomes de marinheiros que reservaram
um barco vermelho, em ordem alfabética .
15
Resumo
❖ Mais natural que antes, procedimentos de consulta de
linguagens.
❖ Relacionalmente completa; e significantemente mais
expressiva do que algebra relacional.
❖ Mesmo consultas que podem ser expressadas em AR podem
frequentemente ser expressadas mais naturalmente em SQL.
❖ Vários caminhos alternativos para escrever uma consulta;
otimizador deve procurar pelo plano de avaliação mais
eficiente.
– na prática, usuários precisam estar atentos como as consultas
podem ser otimizadas e avaliadas para melhores resultados.
16