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