Bancos de Dados
Mestrado em Engenharia de Computação
área de concentração Geomática
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
1
Cálculo Relacional, QUEL e QBE...
• Cálculo Relacional: é uma outra Linguagem Formal de Consultas
para criar novas relações e recuperar informações de bancos de
dados relacionais.
• QUEL e QBE são linguagens mais próximas do Cálculo
Relacional do que o SQL.
• Principal diferença entre o Cálculo Relacional e a Álgebra
Relacional:
–
–
–
–
No CR especifica-se uma consulta através de uma expressão declarativa.
Na AR, através de uma sequência de operações.
CR é uma linguagem declarativa ou não procedural
AR é procedural
• O poder de expressão das duas linguagens é idêntico.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
2
Cálculo Relacional, QUEL e QBE...
• Uma Linguagem de Consultas Relacional L é dita Relationally
Complete se pudermos expressar em L qualquer consulta que
possa ser expressa no Cálculo Relacional.
• Relationally Complete tornou-se um padrão de comparação para
para aquilatar o poder de expressão de Linguagens de Consulta
de Alto Nível.
• A maioria das Linguagens de Consulta Relacionais são
Relacionalmente Completas, mas têm maior poder de expressão
que o CR ou a AR, por incluírem operações adicionais como:
Funções Agregadas, Grupamento e Ordenação.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
3
Cálculo Relacional, QUEL e QBE...
• O CR é baseado no chamado Cálculo de Predicados (CP)
• Adaptações do CP de 1a ordem como linguagem de consulta para
BDs relacionais:
– Tuple Relational Calculus
– Domain Relational Calculus
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
4
Tuple Relational Calculus...
• Baseia-se na especificação de um número de tuples variables.
• Cada tuple variable usualmente assume valores sobre uma Relação
da base de dados, significando que a variável pode tomar como seu
valor qualquer tupla em particular da relação.
• Uma query simples é da forma:
{t | COND(t)}
onde: t é uma tupla
COND(t) é uma expressão condicional envolvendo t.
• O resultado da consulta é o conjunto de todas as tuplas que
satisfazem COND(t).
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
5
f
Tuple Relational Calculus...
• Exemplo: Recupere todas as tuplas de empregados com salário
maior que $50,000.00
{t | EMPLOYEE(t) and t.SALARY > 50000}
Relação que define o
domínio da variável de tupla t
Expressão condicional
envolvendo t.
• {t.FNAME, t.LNAME | EMPLOYEE(t) and t.SALARY>50000}
SELECT T.FNAME, T.LNAME
FROM
EMPLOYEE T
WHERE T.SALARY > 50000
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
6
Tuple Relational Calculus...
É preciso especificar as seguintes informações em uma expressão
do Tuple Relational Calculus:
 Para cada variável de tupla t, a relação R onde t assume seus
valores (range relation R) de t (~ cláusula FROM do SQL).
Este valor é especificado por uma condição da forma R(t).
 Uma condição para selecionar uma combinação particular de
tuplas (~ cláusula WHERE do SQL).
 Um conjunto de atributos a ser recuperado (requested attributes)
(~ cláusula SELECT do SQL).
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
7
Tuple Relational Calculus...
• QUERY 0: Recupere a data de nascimento e endereço do
empregado cujo nome é `John B. Smith`.
{t.BDATE, t. ADDRESS | EMPLOYEE(t) and t.FNAME=`John`
and t.MINIT=`Smith`and t.LNAME=`Smith`}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
8
Tuple Relational Calculus...
Especificação Formal:
• Uma expressão do Tuple Relational Calculus é, em geral, da
forma:
{t1.A1, t2.A2, ..., tn.An | COND(t1, t2, ...,tn, tn+1, tn+2, ..., tn+m)}
onde:
- t1, t2, ...,tn, tn+1, tn+2, ..., tn+m são variáveis-tupla.
- cada Ai é um atributo da relação na qual ti assume valores
(ranges) e COND é uma condição ou fórmula do Tuple
Relational Calculus.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
9
Tuple Relational Calculus...
• Uma fórmula é constituída por átomos do cálculo de predicados,
podendo ser:
 Um átomo da forma R(ti), onde R é o nome de uma relação e ti é
uma variável-tupla.
Este átomo identifica o conjunto de valores que podem ser
assumidos pela variável-tupla t, como sendo as tuplas da relação
cujo nome é R.
 Um átomo da forma ti.A op tj.B
onde op é um dos operadores de comparação no conjunto {=, ,
, , , }, ti e tj são variáveis-tupla, A (B) é um atributo da
relação na qual ti (tj) pode assumir valores.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
10
Tuple Relational Calculus...
 Um átomo da forma ti.A op c ou c op tj.B
onde op é um dos operadores de comparação no conjunto {=, , ,
, , }, ti e tj são variáveis-tupla, A (B) é um atributo da relação
na qual ti (tj) pode assumir valores e c é um valor constante.
 Cada um dos átomos precedentes é avaliado como TRUE ou
FALSE para uma combinação de tuplas específica (valor verdade
do átomo).
Para átomos do tipo , se à variável-tupla é atribuído uma tupla
que é membro da relação especificada R, o átomo é TRUE, em
caso contrário, FALSE.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
11
Tuple Relational Calculus...
• Uma fórmula (condição) é constituída por um ou mais átomos
conectados pelos operadores lógicos and, or e not e é definida
recursivamente, como segue:
 Todo átomo é uma fórmula.
 Se F1 e F2 são fórmulas, então (F1 and F2) , (F1 or F2), not (F1) e
not (F2) são também fórmulas.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
12
Tuple Relational Calculus...
Os valores verdades destas quatro fórmulas são derivados das
fórmulas componentes como segue:
 (F1 and F2) é TRUE se ambos F1 and F2 são TRUE; em caso
contrário é FALSE.
 (F1 or F2) é FALSE se ambos F1 and F2 são FALSE; em caso
contrário é TRUE.
 not (F1) É TRUE se F1 é FALSE; é FALSE se F1 é TRUE.
 not (F2) É TRUE se F2 é FALSE; é FALSE se F2 é TRUE.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
13
Tuple Relational Calculus...
• Dois operadores adicionais chamados quantificadores podem
aparecer nas fórmulas:
– o quantificador universal ()
– o quantificador existencial ()
• Conceito (informal) de variáveis livres (free) e ligadas (bound).
Uma variável-tupla t é ligada (bound) se ela é quantificada, isto é,
se aparece em uma cláusula ( t) ou ( t); em caso contrário ela é
livre (free).
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
14
Tuple Relational Calculus...
Uma variável-tupla em uma fórmula é dita livre (free) ou ligada
(bound) de acordo com as seguintes regras:
 Uma ocorrência de uma variável-tupla t em uma fórmula F, que é
um átomo, é livre (free) em F.
 Uma ocorrência de uma variável-tupla t é livre (free) ou ligada
(bound) em uma fórmula constituída por conectivos lógicos
- (F1 and F2) , (F1 or F2), not (F1) e not (F2) - dependendo se ela é
livre ou ligada em F1 ou F2 (se ela ocorre em uma das fórmulas) .
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
15
Tuple Relational Calculus...
• Observe que em uma fórmula F = (F1 and F2) ou F = (F1 or F2),
uma variável-tupla t pode ser livre em F1 e ligada em F2 ou viceversa. Neste caso uma ocorrência da variável-tupla é ligada e a
outra é livre em F.
 Todas as ocorrências livres (free) de uma variável-tupla t em F são
ligadas (bound) em uma fórmula F’ do tipo F’= ( t) (F) ou
( t) (F).
A variável-tupla é ligada (bound) ao quantificador especificado em
F’.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
16
Tuple Relational Calculus...
• Exemplo: F1: d.DNAME = `Research`
F2: ( t) (d.DNUMBER = t.DNO)
d é livre em F1 e F2 enquanto t é ligada ao quantificador
existencial em F2.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
17
Tuple Relational Calculus...
• Uma fórmula (condição) ... é definida recursivamente, como
segue:
 Se F é uma fórmula, então ( t) (F) é também uma fórmula, onde
t é uma variável-tupla.
( t) (F) é TRUE se a fórmula F é avaliada como TRUE para
alguma (pelo menos uma) tupla atribuída a ocorrências livres de t
em F; em caso contrário ( t) (F) é FALSE.
 Se F é uma fórmula, então ( t) (F) é também uma fórmula, onde
t é uma variável-tupla.
( t) (F) é TRUE se a fórmula F é avaliada como TRUE para
todas as tuplas (no universo) atribuídas a ocorrências livres de t
em F; em caso contrário ( t) (F) é FALSE.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
18
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
19
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
20
Tuple Relational Calculus...
• QUERY Q1: Recupere o nome e o endereço de todos os
empregados que trabalham para o departamento `Research`.
{t.FNAME, t.LNAME, t.ADDRESS | EMPLOYEE(t) and
(( d) DEPARTMENT(d) and d.DNAME = `Research` and
d.DNUMBER = t.DNO))}
• Atenção: As únicas variáveis-tuplas livres (free) em expressões do
Cálculo Relacional devem ser aquelas que aparecem no lado
esquerdo da barra “|”.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
21
Tuple Relational Calculus...
• QUERY Q2: Para todos os projetos localizados em `Statford` liste
o no do projeto, o depto que o controla e o último nome, data do
nascimento e endereço do gerente do depto controlador.
{p.PNUMBER, p.DNUM, m.LNAME, m.BDATE, m.ADDRESS |
PROJECT(p) and EMPLOYEE(m) and
p.PLOCATION
= `Statford` and (( d) DEPARTMENT(d) and p.DNUM =
d.DNUMBER and d.MGRSSN = m.SSN))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
22
Tuple Relational Calculus...
• QUERY Q8: Para cada empregado recupere o seu primeiro e
último nome, além do primeiro e último nome do(a) seu(ua)
supervisor(a) imediato(a).
{e.FNAME, e.LNAME, s.FNAME, s.LNAME | EMPLOYEE(e)
and EMPLOYEE(s) and e.SUPERSSN = s.SSN}
• QUERY Q3’: Encontre o nome de cada empregado que trabalhe
em algum projeto controlado pelo depto no 5
{e.LNAME, e.FNAME | EMPLOYEE(e) and (( x) ( w)
(PROJECT(x) and WORKS_ON(w) and x.DNUM = 5 and
w.ESSN = e.SSN and x.PNUMBER = w.PNO))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
23
Tuple Relational Calculus...
• QUERY Q4: Faça uma lista de nos de projetos que envolvam um
empregado cujo último nome seja `Smith`, ou como um simples
trabalhador ou como gerente do depto que controla o projeto.
{p.PNUMBER, | PROJECT(p) and ((( e) ( w) (EMPLOYEE(e)
and WORKS_ON(w) and w.PNO = p.NUMBER and e.LNAME
= `Smith` and e.SSN = w.ESSN))
or
(( m) ( d) (EMPLOYEE(m) and DEPARTMENT(d) and
p.DNUM = d. DNUMBER and d.MGRSSN = m.SSN and
m.LNAME = `Smith`)))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
24
Tuple Relational Calculus...
• Transformações dos Quantificadores Existencial e Universal
 ( x) (P(x)) = (¬x) (not (P(x)))
 ( x) (P(x)) = not ( x) (not (P(x)))
 ( x) (P(x) and Q(X)) = (¬x) (not (P(x)) or not Q(x)))
 ( x) (P(x) or Q(X)) = (¬x) (not (P(x)) and not Q(x)))
 ( x) (P(x) or Q(x)) = not ( x) (not (P(x)) and not (Q(x)))
 ( x) (P(x) and Q(x)) = not ( x) (not (P(x)) or not (Q(x)))
Regras: i) transforme um quantificador no outro, precedendo-o
por not; ii) and e or substituem-se reciprocamente; iii) P(x) é
transformado em not (P(x)) e not (P(x)) em P(x).
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
25
Tuple Relational Calculus...
• ( x) (P(x))  (x) (P(x))
• (¬ x) (P(x))  not ( x) (P(x))
Todavia, a implicação abaixo NÃO É VERDADEIRA:
• not ( x) (P(x))  (¬ x) (P(x))
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
26
Tuple Relational Calculus...
• Regras para uso correto do Quantificador Universal
• QUERY Q3: Recupere os nomes dos empregados que trabalham
em todos os projetos controlados pelo depto no 5.
{e.LNAME, e.FNAME | EMPLOYEE(e) and ( x)
(not(PROJECT(x)) or (not (x.DNUM = 5) or
(( w) (WORKS_ON(w) and w.ESSN = e.SSN and
x.PNUMBER = w.PNO)))))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
27
Tuple Relational Calculus...
• Pode-se subdividir a QUERY Q3 da seguinte forma:
{e.LNAME, e.FNAME | EMPLOYEE(e) and F’}
F’ = ( x) (not (PROJECT(x)) or F1)
F1 = (not (x.DNUM = 5) or F2)
F2 = ( w) (WORKS_ON(w) and w.ESSN = e.SSN and
x.PNUMBER = w.PNO)
Dica: excluir do quantificador universal todas as tuplas em que
não estamos interessados.
If A então B é equivalente a: not A or B
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
28
Tuple Relational Calculus...
• Não desejamos selecionar tuplas da relação PROJECT que não sejam de
interesse. Queremos apenas aquelas controladas pelo depto 5...
Para a fórmula ( x) (F) ser verdadeira, deve-se ter a fórmula F verdadeira para
todas as tuplas no universo que podem ser atribuídas a x.
If PROJECT(x) então x.DNUM=5 ...
(not (PROJECT(x) or F1)
(not x.DNUM = 5) or F2)
F2: o empregado está presente em todas as tuplas da relação PROJECT que
ainda não foram excluídas.
(w) (WORKS_ON(w) and w.ESSN = e.SSN and x.PNUMBER = w.PNO)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
29
Tuple Relational Calculus...
• Forma alternativa de se escrever a QUERY Q3A, transformandose o quantificador universal em existencial:
{e.LNAME, e.FNAME | EMPLOYEE(e) and
(not ( x) (PROJECT(X) and (x.DNUM = 5) and
not (w) (WORKS_ON(w) and w.ESSN = e.SSN and
x.PNUMBER = w.PNO))))}
• QUERY Q6: Encontre o nome de todos os empregados que não
possuem dependentes.
{e.LNAME, e.FNAME | EMPLOYEE(e) and
(not ( d) (DEPENDENT(d) and (e.SSN = d.ESSN)))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
30
Tuple Relational Calculus...
• QUERY Q6A: usando as regras de transformação..
{e.LNAME, e.FNAME | EMPLOYEE(e) and
(( d) (not (DEPENDENT(d)) or not (e.SSN = d.ESSN)))}
.
• QUERY Q7: Liste os nomes dos gerentes que tenham pelo menos
um dependente.
{e.LNAME, e.FNAME | EMPLOYEE(e) and (( d) ( p)
(DEPARTMENT(d) and DEPENDENT(p) and
(e.SSN = d.MGRSSN) and (p.ESSN = e.SSN))))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
31
A Linguagem QUEL...
• QUEL é uma DDL e DML originalmente desenvolvida para o
SGBD relacional INGRES (Interactive Graphics and Retrieval
System.
• Desenvolvido como um projeto de pesquisa na década de 70 na
Universidade da Califórnia em Berkeley.
• Comercialmente disponível desde 1980.
• Pode ser usada como uma linguagem de consultas interativa ou
ser embutida em linguagens de programação,
• funcionalidade similar às primeiras versões do SQL.
• Possui funções agregadas e de grupamento
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
32
A Linguagem QUEL...
• O comando CREATE e tipos de dados
CREATE EMPLOYEE
UERJ - Agosto 2000
(FNAME
MINIT
LNAME
SSN
BDATE
ADDRESS
SEX
SALARY
SUPERSSN
DNO
© Oscar Luiz Monteiro de Farias
= TEXT(15),
= C1,
= TEXT(15),
= C9,
= DATE,
= TEXT(30),
= C1,
= MONEY,
= C9,
= I4);
33
A Linguagem QUEL...
• O comando INDEX: utilizado para especificar um índice (só de
10 nível) em uma relação.
• Um índice de múltiplos níveis pode ser criado especificando-se
uma B-TREE sobre um índice já existente.
MODIFY
INDEX ON
MODIFY
INDEX ON
MODIFY
EMPLOYEE
TO BTREE UNIQUE ON SSN;
EMPLOYEE IS NAME_INDEX (LNAME, FNAME);
DEPARTMENT TO HASH UNIQUE ON DNAME;
DEPARTMENT IS DNO_INDEX (DNO);
DNO_INDEX TO CBTREE UNIQUE ON DNO;
DESTROY
DNO_INDEX, NAME_INDEX;
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
34
Visão geral de consultas em QUEL
• As consultas do tipo select-project-join são similar ao Tuple
Relational Calculus
• A cláusula RETRIEVE especifica os atributos a serem
recuperados
• Todos os atributos devem ser explicitamente qualificados ou pelo
nome da relação ou por uma variável-tupla declarada para
assumir valores na relação.
• Variáveis-tuplas são declaradas com o comando RANGE
• A cláusula WHERE especifica as condições de seleção das tuplas
e de JOIN
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
35
Consultas em QUEL...
• QUERY Q0: Recupere a data de nascimento e endereço do
empregado cujo nome é `John B. Smith`.
RETRIEVE (EMPLOYEE.BDATE, EMPLOYEE.ADDRESS)
WHERE
EMPLOYEE.FNAME=`John` AND EMPLOYEE.MINIT=`B`
AND EMPLOYEE.LNAME=`SMith`
• Especificação de variáveis-tuplas com RANGE
RANGE OF
UERJ - Agosto 2000
E,S IS EMPLOYEE,
D IS DEPARTMENT,
P IS PROJECT,
W IS WORK_ON,
DEP IS DEPENDENT,
DL IS DEPT_LOCATIONS
© Oscar Luiz Monteiro de Farias
36
Consultas em QUEL...
• QUERY Q1: Recupere o nome e o endereço de todos os
empregados que trabalham para o departamento `Research`.
RETRIEVE (E.FNAME, E.LNAME, E.ADDRESS)
WHERE
D.DNAME=`Research` AND D.DNUMBER = E.DNO
• QUERY Q2: Para todos os projetos localizados em `Statford` liste
o no do projeto, o depto que o controla e o último nome, data do
nascimento e endereço do gerente do depto controlador.
RETRIEVE (P.PNUMBER, P.DNUM, E.LNAME, E.BDATE, E.ADDRESS)
WHERE
P.DNUM=D.DNUMBER AND D.MGRSSN=E.SSN
AND P.PLOCATION=`STATFORD`
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
37
Consultas em QUEL...
• QUERY Q8: Para cada empregado recupere o seu primeiro e
último nome, além do primeiro e último nome do(a) seu(ua)
supervisor(a) imediato(a).
RETRIEVE (E.FNAME, E.LNAME, S.FNAME, S.LNAME)
WHERE
E.SUPERSSN = S.SSN
• Para recuperar todos os atributos das tuplas selecionadas, usa-se a
keyword ALL
• QUERY Q1D: Para cada empregado do depto `Research` recupere
todos os seus atributos, juntamente com os do depto.
RETRIEVE (E.ALL, D.ALL)
WHERE
D.DNAME=`Research` AND E.DNO = D.DNUMBER
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
38
Consultas em QUEL...
• Para se eliminar tuplas duplicatas no resultado da consulta, usa-se a
keyword UNIQUE.
• QUERY Q11: Liste todos os salários dos empregados, mantendo os
valores duplicados.
RETRIEVE (E.SALARY)
• QUERY Q11A: Liste todos os salários dos empregados, eliminando
valores duplicados.
RETRIEVE UNIQUE
UERJ - Agosto 2000
(E.SALARY)
© Oscar Luiz Monteiro de Farias
39
Consultas em QUEL...
• QUERY Q3’: Recupere os nomes dos empregados que trabalhem
em algum projeto que seja controlado pelo depto 5.
RETRIEVE UNIQUE (E.FNAME, E.LNAME)
WHERE
P.DNUM=5 AND P.PNUMBER=W.PNO AND
W.ESSN=E.SSN
• Em QUEL qualquer variável RANGE aparecendo na cláusula
WHERE e que não apareça na cláusula RETRIEVE é
implicitamente quantificado pelo quantificador existencial (tuplas
P e W no exemplo acima).
• Para consultas que envolvam quantificadores universais, ou a
negação de quantificadores existenciais, deve-se usar as funções
COUNT ou ANY.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
40
Consultas em QUEL...
• Funções buit-in de QUEL: COUNT, SUM, MIN, MAX, AVG
• As funções buit-in COUNTU, SUMU e AVG eliminam as tuplas
duplicatas antes da aplicação de COUNT, SUM e AVG.
• Todas as funções QUEL podem ser usadas ou na cláusula
RETRIEVE ou na cláusula WHERE.
• Sempre que uma função é usada na cláusula RETRIEVE deve-se
fornecer um nome de atributo independente, o qual aparecerá como
o nome de uma coluna no resultado da consulta.
• QUERY Q15: Recupere a soma dos salários de todos empregados,
os salários máximo, mínimo e médio.
RETRIEVE (SUMSAL=SUM(E.SALARY), MAXSAL=MAX(E.SALARY),
MINSAL=MIN(E.SALARY), AVGSAL=AVG(E.SALARY))
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
41
Consultas em QUEL...
• QUERY Q17: Recupere o no total de empregados na empresa.
RETRIEVE (TOTAL_EMPS = COUNT (E.SSN))
• QUERY Q18: Recupere o no de empregados no depto `Research`.
RETRIEVE (RESEARCH_EMPS = COUNT (E.SSN WHERE
E.DNO=D.DNUMBER AND D.DNAME = `Research`))
• Em QUEL o qualificador BY pode ser utilizado dentro da
especificação de cada função, para determinar um particular
agrupamento de tuplas. Por isso, diferentes grupamentos podem
ser usados na mesma consulta.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
42
Consultas em QUEL...
• Cada função pode ter seus próprios atributos de grupamento, suas
próprias condições WHERE e grupamentos podem ser usados ou
na cláusula RETRIEVE ou na cláusula WHERE.
• QUERY Q20: Para cada depto, recupere o no do depto, o no de
empregados no depto e o seu salário médio.
RETRIEVE (E.DNO, NO_OF_EMPS = COUNT (E.SSN BY E.DNO),
AVG_SAL = AVG (E.SALARY BY E.DNO))
• QUERY Q21: Para cada projeto recupere o no do projeto, o nome
do projeto e o no de empregados que trabalham no projeto.
RETRIEVE (W.PNO, P.PNAME, NO_OF_EMPS = COUNT (W.ESSN
BY W.PNO, P.PNAME WHERE W.PNO = P.PNUMBER))
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
43
Consultas em QUEL...
• QUERY Q22: Para cada projeto no qual trabalham mais de dois
empregados, recupere o no do projeto, o nome do projeto e o no de
empregados que trabalham no projeto.
RETRIEVE (W.PNO, NO_OF_EMPS = COUNT (W.ESSN BY W.PNO))
WHERE
COUNT (W.ESSN BY W.PNO) > 2
• A keyword ANY é usada para especificar o quantificador existencial
• ANY é aplicada a uma subquery. Se o resultado incluir pelo menos
uma tupla, ANY retorna “1”; em caso contrário retorna “0”.
• ANY é similar à função EXISTS (retorna TRUE ou FALSE) do
SQL.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
44
Consultas em QUEL...
• QUERY Q12: Recupere o nome de cada empregado que tenha
um dependente com o mesmo first name e sexo do empregado.
RETRIEVE (E.FNAME, E.LNAME)
WHERE ANY (DEP.DEPENDENT_NAME BY E.SSN
WHERE E.SSN = DEP.ESSN AND
E.FNAME = DEP_DEPENDENT_NAME AND
E.SEX = DEP.SEX) =1
• QUERY 6: Recupere os nomes de todos os empregados que não
tenham dependentes.
RETRIEVE (E.FNAME, E.LNAME)
WHERE ANY (DEP.DEPENDENT_NAME BY E.SSN
WHERE E.SSN = DEP.ESSN) = 0
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
45
Consultas em QUEL...
• QUERY 3: Recupere o SSN de cada empregado que trabalhe em todos os
projetos controlados pelo depto de no 5.
RETRIEVE (E.SSN)
WHERE
ANY (P.PNUMBER
WHERE (P.DNUM = 5)
AND
ANY (W.PNO BY E.SSN
WHERE E.SSN = W.E.SSN AND
P.PNUMBER = W.PNO) = 0) = 0)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
46
Consultas em QUEL...
• Na comparação de strings em QUEL, “*” substitui qualquer
seqüência arbitrária de caracteres e “?” substitui um único caracter
arbitrário.
• QUERY Q25: Recupere todos os empregados com endereço em ‘Houston, TX’
RETRIEVE (E.LNAME, E.FNAME)
WHERE
E.ADDRESS = ‘*Houston, TX’)
• QUEL permite o uso dos operadores aritméticos padrões “+”, “-”,
“*”e “/”.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
47
Consultas em QUEL...
• Em QUEL é possível recuperar-se o resultado de uma consulta diretamente
para uma relação.
QUERY Q27: Mostre os salários que resultariam, se a todos os trabalhadores
que trabalham no projeto ‘ProductX’ fosse dado um aumento de 10%.
Exemplo: Para armazenar o resultado de Q27 em uma relação denominada
PRODUCTX_RAISES, a qual inclui o salário corrente em cada tupla, mas
uma coluna chamada PROJ cujo valor é ‘ProductX’ para todas as tuplas,
teríamos:
RETRIEVE INTO PRODUCTX_RAISES (PROJ = ‘ProductX’, E.FNAME,
E.LNAME, CURRENT_SALARY = E.SALARY,
PROPOSED_SALARY = E.SALARY * 1.1)
WHERE E.SSN = W.ESSN AND W.PNO = P.PNUMBER AND
P.PNAME=‘ProductX’
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
48
Consultas em QUEL...
• QUEL possui uma cláusula SORT BY semelhante à cláusula
ORDER BY do SQL.
• QUEL possui facilidades para definir VISÕES sobre um banco
de dados e mecanismos para embutir o QUEL em uma linguagem
de programação (EQUEL).
• Em QUEL os comandos utilizados para alterar um banco de
dados são: APPEND, DELETE e REPLACE.
• Exemplo: Adicionar uma nova tupla na relação EMPLOYEE.
APPEND TO EMPLOYEE (FNAME=‘Richard’, MINIT=‘K’,
LNAME=‘Marini’, SSN=‘653298653’, BDATE=‘30-DEC-52’,
ADDRESS=‘98 Oak Forest, Katy, TX’, SEX=‘M’,
SALARY=37000, SUPERSSN=‘987654321’, DNO=4)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
49
Consultas em QUEL...
• O comando APPEND permite a inserção de múltiplas tuplas em uma relação,
como resultado de uma seleção de tuplas efetuadas em outra consulta.
• DELETE é usado para remover tuplas
DELETE EMPLOUEE
WHERE E.LNAME = ‘Brown’
----DELETE EMPLOYEE
WHERE E.DNO=D.DNUMBER AND D.NAME = ‘Research’
• REPLACE é usado para modificar os valores dos atributos
REPLACE PROJECT (PLOCATION = ‘Belaire’, DNUM = 5)
WHERE P.PNUMBER = 10
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
50
QUEL x SQL...
 Tanto QUEL quanto SQL são fundamentadas em variações do Tuple
Relational Calculus (QUEL é mais próxima do TRC).
 Em SQL o aninhamento de blocos SELECT ... FROM ... WHERE pode ser
repetido em um número de níveis arbitrario; Em QUEL o aninhamento está
restrito a apenas um nível.
 Tanto QUEL quanto SQL usam implicitamente quantificadores existenciais.
Ambas expressam a quantificação universal em termos da quantificação
existencial equivalente.
 Em QUEL a cláusula para grupamento BY ... WHERE pode ocorrer qualquer
número de vezes em cláusulas RETRIEVE ou WHERE, permitindo
diferentes grupos em uma mesma consulta.
 Em SQL somente um grupamento simples por consulta é permitido, via a
cláusula GROUP ... BY ... HAVING. Assim o aninhamento de consultas é
necessário para se obter diferentes grupamentos.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
51
QUEL x SQL
• SQL provê algumas operações explícitas da AR sobre conjuntos,
como o operador UNION.
• Em QUEL, operadores similares não estão disponíveis e deve-se
usar condições de seleção e de join mais complexas.
• QUEL permite a especificação de arquivos temporários para
receber o resultado de uma consulta em um único comando; em
SQL deve-se utilizar um comando CREATE TABLE.
• O operador ANY retorna, em QUEL, um valor inteiro “0” ou “1”.
EM SQL o operador EXISTS retorna um valor “TRUE” ou
“FALSE”.
• SQL evoluiu muito e tornou-se um padrão “de fato” para SGBDs
relacionais
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
52
Domain Relational Calculus (DRC)...
• Trata-se de outro tipo de linguagem de consulta a Bancos de
Dados Relacionais baseada no Cálculo de Predicados.
• Há uma linguagem de consulta comercial - Query by Example
(QBE) - que está de algum modo relacionada ao DRC.
• Historicamente, todavia, a especificação formal do DRC é
posterior ao surgimento da QBE.
• O DRC difere do TRC quanto ao tipo de variáveis utilizadas em
suas fórmulas.
• No TRC as variáveis assumem valores sobre as tuplas, enquanto
no DRC, elas assumem valores sobre os domínios dos atributos.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
53
Domain Relational Calculus (DRC)...
• Para formar uma relação de grau “n” como resultado de uma
consulta, deve-se ter “n” desssas variáveis de domínio (domain
variables).
• Uma expressão do DRC é da forma:
{x1, x2, ..., xn | COND (x1, x2, ..., xn, xn+1, xn+2, ..., xn+m}
onde x1, x2, ..., xn, xn+1, xn+2, ..., xn+m são variáveis de domínio
que assumem valores sobre domínios (de atributos) e COND é
uma condição ou fórmula do DRC.
• Uma fórmula é constituída por átomos, ligeiramente diferentes
daqueles do TRC.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
54
Domain Relational Calculus (DRC)...
Átomos no DRC podem ser:
 Um átomo da forma R(x1, x2, ..., xj), onde R é o nome de uma
relação de grau j, e cada xi , 1  i  j é uma variável de domínio.
A semântica deste átomo diz que uma lista de valores < x1, x2, ...,
xn> deve ser uma tupla na relação de nome R, em que xi é o valor
do i-ésimo atributo da tupla. Para fins de abreviação, despreza-se
as vírgulas e escreve-se uma expressão do DRC como:
{x1x2...xn | R (x1x2, x3) and ...}, ao invés de
{x1, x2, ..., xn | R (x1, x2, x3) and ...}
 Um átomo da forma xi op xj, onde op é um dos operadores de
comparação no conjunto {=, ,, , , }, xi e xj são variáveis de
domínio.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
55
Domain Relational Calculus (DRC)...
• Um átomo da forma xi op c ou c op xj, onde op é um dos operadores
de comparação no conjunto {=, ,, , , }, xi e xj são variáveis de
domínio e c é um valor constante.
• Como no TRC, os átomos são avaliados como TRUE ou FALSE
para um conjunto específico de valores, chamados os valoresverdade dos átomos.
• Em , se as variáveis de domínio assumem valores
correspondentes a uma tupla pertencente à relação R, então o átomo
é TRUE.
• Nos casos  e , se as variáveis de domínio assumem valores que
satisfazem a condição (de comparação) então o átomo é TRUE.
• Fórmulas são feitas de átomos, variáveis e quantificadores (~TRC).
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
56
Queries em DRC...
• QUERYQ0: Recupere a data de nascimento e endereço do
empregado cujo nome é `John B. Smith`.
{uv | ( q) ( r) ( s)
(EMPLOYEE(qrstuvwxyz) and q=‘John’, and r=‘B’ and s=‘Smith’)}
• QUERY Q0A: alternativa à query Q0:
{uv | EMPLOYEE(John’, ‘B’, ‘Smith’, tuvwxyz)}
• QUERY Q1: Recupere o nome e o endereço de todos os
empregados que trabalham no departamento ‘Research’.
{qsv | ( z) (EMPLOYEE(qrstuvwxyz) and ( l) ( m)
(DEPARTMENT(lmno) and t=‘Research’ and m=z))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
57
Queries em DRC...
• QUERY Q2: Para todo projeto localizado em ‘Stafford’, liste o no
do projeto, o no do dpto que o controla, o último nome do gerente,
a data de seu nascimento e o seu endereço.
{jksuv | ( j) (PROJECT(hijk) and ( t) (EMPLOYEE(qrstuvwxyz) and
( m) ( n) (DEPARTMENT(lmno) and k= m and n=t and j=‘Stafford’)))}
• QUERY 6: Recupere o nome de todos os empregados que não tenham
dependentes.
{qs | ( t) (EMPLOYEE(qrstuvwxyz) and (not ( l)(DEPENDENT(lmnop)
and t=l)))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
58
Queries em DRC
• QUERY 6A: Query Q6, usando o quantificador universal.
{qs | ( t) (EMPLOYEE(qrstuvwxyz) and (( l) (not (DEPENDENT(lmnop)
or not (t=l))))}
• QUERY 7: Liste os nomes dos gerentes que tenham pelo menos um dependente.
{sq | ( t) (EMPLOYEE(qrstuvwxyz) and ( j) (DEPARTMENT(hijk) and
l)(DEPENDENT(lmnop) and t=j and l=t)))))}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
(
59
Visão Geral da Linguagem QBE...
• Linguagem de consultas para BDs relacionais desenvolvida pela
IBM.
• Parte da Query Management Facility (QMF), opção de interface
do DB2.
• A consulta é formulada através do preenchimento, pelo usuário,
de uma série de templates.
• Constantes e variáveis são colocadas nas colunas dos templates
para construir um exemplo relacionado à consulta ou a
atualização.
• QBE é relacionado ao DRC e demonstra-se que é relacionalmente
completo.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
60
Visão Geral da Linguagem QBE...
• Constantes são introduzidas nos templates da mesma forma
como se escrevem.
• Os valores exemplos são antecedidos por “_”. Representam
variáveis de domínio livres.
• Não há necessidade de se especificar valores exemplos para as
colunas cujos atributos não temos interesse em recuperar.
• Os valores exemplos são completamente arbitrários e pode-se
especificar qualquer valores para eles.
• O prefixo “P. “ indica que um valor particular é para ser
recuperado.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
61
Visão Geral da Linguagem QBE...
• QUERYQ0: Recupere a data de nascimento e endereço do
empregado cujo nome é `John B. Smith`.
{uv | ( q) ( r) ( s)
(EMPLOYEE(qrstuvwxyz) and q=‘John’, and r=‘B’ and s=‘Smith’)}
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
62
Visão Geral da Linguagem QBE...
• Cada coluna de um template pode ser pensada como uma variável
de domínio implícita.
• Na consulta QBE, a coluna com “P.” no template corresponde a
variáveis especificadas à esquerda da “|” no DRC.
• As colunas com valores constantes correspondem a variáveis de
domínio com condições de seleção de igualdade.
• A condição EMPLOYEE(qrstuvwxyz) e os quantificadores existenciais
estão implícitos, porque o template correspondente a relação EMPLOYEE está
sendo utilizado.
• Os operadores de comparação devem ser explicitados no template.
• Para condições mais complexas o usuário pode utilizar um condition box (IBM)
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
63
Visão Geral da Linguagem QBE...
• QUERY Q0A: Liste os SSNs dos empregados que trabalham mais
de 20 horas semanais no projeto de no “1”.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
64
Visão Geral da Linguagem QBE...
• QUERY Q0B: Liste os SSNs dos empregados que trabalham mais
de 20 horas semanais ou no projeto de no “1”, ou no projeto de no
“2”.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
65
Visão Geral da Linguagem QBE...
• Todas as condições especificadas na mesma linha são conectadas
pelo operador lógico and.
• As condições especificadas em linhas distintas são conectadas
pelo operador lógico or.
UERJ - Agosto 2000
© Oscar Luiz Monteiro de Farias
66
Download

cap_07_bancos_de_dados_mestrado_uerj_oscar_2000_01