Bases de Dados Álgebra Relacional ou Como manipular uma BD SQL P. Serendero, 2011-13 1
Álgebra Relacional Conjunto básico de operadores que tomam as relações como os seus operandos e devolvem uma relação como resultado (Date) O output das operações com tabelas é sempre outra tabela, que pela sua vez pode servir de input para outras operações nelas Esta é a propriedade de fecho ( closure ) dos sistemas relacionais. Operações sobre uma, duas ou mais relações, frequentemente especificadas com alguma restrição, para obter uma nova relação Esta propriedade faz o álgebra 'fechada': todos os objetos na álgebra relacional são relações. Não confundir com fecho nas DF 2
Álgebra Relacional SQL (Structured Query Language) linguagem para criar, modificar e extrair dados desde um sistema relacional de gestão de bases de dados. Ela implementa a álgebra relacional. NÃO É UMA LINGUAGEM DE PROGRAMAÇÃO!! A estrutura básica duma expressão SQL consiste de 3 cláusulas: SELECT: que corresponde a operação de projeção na álgebra relacional. Uma restrição para extrair colunas específicas de uma tabela num query FROM: Corresponde a operação do produto cartesiano na álgebra relacional. Faz a listagem das relações exploradas na avaliação duma expressão WHERE: Corresponde ao predicado de seleção da álgebra relacional. Consiste num predicado incluindo atributos das relações que aparecem na cláusula FROM. Actúa como um filtro 3
Operadores Unários Álgebra Relacional: operadores SELECT ( σ ) RESTRIÇÃO: selecciona um subconjunto de tuplas PROJECT( π) PROJEÇÃO: selecciona apenas colunas na projeção JOIN (theta) selecciona tuplas de conjuntos.semelhante ao Prod.Cart. DIVIDE Operadores sobre conjuntos (ligeiramente modificados para operar tabelas) UNIÃO ( ), INTERSECÇÃO ( ), DIFERENCIA (ou MENOS, ) PRODUTO CARTESIANO ( x ) Operadores Binários JOIN (INNER JOIN, OUTER JOIN), REUNIÃO, DIVISÃO mais RENAME (símbolo: ρ (ro)) FUNÇÕES AGREGADAS SUM, COUNT, AVG, MIN, MAX, 8 operadores originais de Codd 4
Algebra Relacional - Operadores Estos 8 operadores originais tem sido estendidos a muitos outros Qualquer outro operador pode ser definido para satisfazer a propriedade de fecho da AR.: relações como input e output Estes operadores são genéricos: se aplicam a todas as relações Todos eles são read-only. Eles leem mas não atualizam os seus operandos. Cliente join Factura where tipo-cliente = bom O tipo de dados do atributo tipo-cliente deve ser conhecido pelo sistema. O output produzido deve ser de um tipo bem definido com um nome de atributo bem definido. Neste contexto utilizamos o operador RENAME
Álgebra Relacional - Operadores Uma propriedade muito importante desta álgebra ser fechada, Significa que podemos escrever expressões relacionais aninhadas Isto é, expressões relacionais nas quais os operandos são eles próprios representados por outras expressões relacionais de complexidade arbitrária
Álgebra Relacional Restrição Extrai tuplos especificadas duma dada relação Projeção Extrair os atributos especificados numa relação dada Produção Dadas 2 relações, constrói uma R contendo todas as combinações possíveis de tuplos, uma de cada uma das relações originais União Constrói uma relação formada por todas as tuplos que aparecem em qualquer das duas relações especificadas Intersecção Constrói uma relação formada apenas pelas tuplos que aparecerem nas duas relações Diferencia Constrói uma relação formada por todas as tuplos da 1ª R que não aparecem na 2ª relação Reunião Dadas 2 relações constrói uma r com todas as combinações possíveis de tuplos, uma de cada relação, tal que os dois tuplos participantes satisfazerem alguma condição especificada Divisão Dada uma R1 binária e uma R2 unária, constrói uma R formada por todos os valores dum atributo da R1 que concordam no outro atributo com todos os valores da R2 7
produto (cartesiano) restrição projeção a x a x b y a y união intersecção diferencia c b b x y c x Reunião (natural) divisão c y a1 a2 a3 b1 b1 b2 b1 b2 b3 c1 c2 c3 a1 a2 a3 b1 b1 b2 c1 c1 c2 a a a b c x y z x y x z a Panorama geral dos 8 operadores originais (Date) 8
Operadores unários: SELECT A operação SELECT (sigma σ ) seleciona um subconjunto de tuplos baseado numa condição de seleção Esta restrição está representada na cláusula WHERE, que actua como filtro Só guarda as tuplos que satisfazem a condição de qualificação SELECT * FROM embarcação WHERE matricula = VNC-34 SELECT nome FROM embarcação WHERE boca > 2 AND boca < 3 9
Atenção: Operadores unários: SELECT Select na Álgebra relacional corresponde ao WHERE no SQL projeção na Álgebra relacional corresponde ao SELECT no SQL SELECT nome FROM embarcação WHERE matricula= AVG-175 O SGBD procede assim: 1. Vai ler desde o FROM, ou seja ler a tabela embarcação, 2. Aplica o operador σ para o WHERE. Esta é a selecção na álgebra relacional 3. Logo aplica o operador π no SELECT. Esta é a projeção na A.R. 10
Operadores unários: SELECT Em SQL a operação SELECT é muito poderosa: SELECT produto, preço * quantidade FROM itens (preço e quantidade devem ser de tipo numérico) SELECT random() SELECT 2 * 2.141516 SELECT COUNT(*) FROM Facturas; COUNT 259 11
Operadores unários: SELECT Um select com uma função na linguagem php em acção: //--------------------------------------------------------------------------- function verifica_existencia_utilizador($db, $novo_usuario) { $query = "SELECT * FROM utilizador WHERE usuario = '$novo_usuario' "; $resultado = pg_query($db, $query); $r = pg_fetch_array($resultado); if ($r['usuario'] == $novo_usuario) // ou if ($r) return 1; // else return 0; } //------------------------------------------------------------------------ // definir uma variável em Php: $nome-var = 45; or $nome-var = natacha ; 12
Operadores unários: SELECT Repare que este SELECT se expressa assim na álgebra relacional:) σ usuario = novo-usuario (utilizador) σ salario > 30,000 (EMPREGADO) O símbolo sigma (σ) expressa a operação SELECT Uma operação condicional booleana nos atributos da Relação: verdadeiro ou falso tuplos verdadeiros são selecionadas e aparecem na nova relação. tuplos falsos são filtrados e eliminados 13
Operadores unários: SELECT A operação SELECT produz uma R com o mesmo esquema (a mesma estrutura de atributos e os seus tipos) que a R original O número de tuplos como resultado do SELECT é menor ou igual ao número de tuplos na R original Pode-se indicar uma condição ou várias juntas σ <condition1>(σ < condition2> (R)) = σ <condition2> (σ < condition1> (R)) O SELECT é comutativo, as condições podem aparecer em qualquer ordem. As condições podem ser outros SELECT 14
Expressões no SELECT No SELECT podem-se utilizar expressões como elementos Ex. SELECT nome, hora/60 AS segundos FROM corredor; A condição WHERE pode fazer comparações aproximadas entre uma string e um padrão <atributo> LIKE <padrão> <atributo> NOT LIKE <padrão> padrão: uma string onde % significa 0 ou + caracteres iguais e onde significa apenas 1 char 15
Expressões no SELECT: LIKE SELECT nome FROM embarcações WHERE nome LIKE %azul% Nome Gaivota azul O azul da Ria 16
SELECT e clausula FROM A clausula FROM permite mais que uma tabela na sua lista r1 r2 nome L.Martins cidade Olhão M. Soares Faro P.Mendes Loulé nome salário L.Martins 22.000 M. Soares 33.000 P.Mendes 45.000 SELECT r1.nome, salário, cidade FROM r1, r2 WHERE r1. nome = r2. nome (repare a qualificação do atrib.) nome salário cidade L.Martins 22.000 Olhão M. Soares 33.000 Faro P.Mendes 45.000 Loulé 17
Operadores unários: PROJECT Indicado com a letra π (pi) PROJECT projeta a relação original, selecionando algumas colunas (atributos) e eliminando outras. Cria portanto uma partição (projeção) vertical (ver desenho anterior) Ex.: π numero, nome, boca (EMBARCAÇÃO) SQL: SELECT numero, nome, boca FROM EMBARCAÇÃO; Esta operação remove qualquer tuplo duplicada. A projeção matemática não permite duplicados. A operação deve produzir um conjunto de tuplos. Ainda SELECT * FROM EMBARCAÇÃO; = procurar todos os atributos 18
Operadores unários: PROJECT Cláusula FROM: deriva a relação desde 2 ou mais tabelas O número de novas tuplos é sempre igual ou menor que a R original Se existe uma chave nos atributos indicados na projeção, então o número de tuplos obtido nela é igual ao número de tuplos na R original PROJEÇÃO não é comutativa. A ordem dos elementos indicados será mantida na nova R 19
mysql> SELECT * FROM salarios; id total-horas preço-hora 1 30 50 2 40 50 R(salarios) 3 30 80 4 34 90 mysql> SELECT id, total_horas, (preço-hora/3) AS valor FROM salarios; id total-horas valor 1 30 50 2 40 50 3 30 80 4 34 90
Operadores unários: RENAME Podemos renomear os atributos ou os nomes das relações (tabelas). Expressada com a letra ρ (ro) Pode ser prático quando temos muitos queries. Serve para minimizar os caracteres a escrever Ex: calculando vendas totais para cada produto SELECT id_produto, p.nome, (sum (v.qtd) * p.preço) AS vendas FROM produtos p LEFT JOIN vendas v USING (id_produto) GROUP BY id_produto, p.nome, p.preço; Tabela produtos, cognomen é p Tabela vendas, congnome é v Na nova R estes são os nomes de cada coluna da tabela (o cabeçalho) GROUP BY? LEFT JOIN? 21
Operações sobre conjuntos UNIÃO ( ) INTERSECÇÃO ( ) T1 UNION T2 T1 INTERSECT T2 DIFERENCIA (ou MENOS, ) T1 MINUS T2 PRODUTO CARTESIANO ( x ) T1 TIMES T2 22
A num nome status cidade c-023 Sousa 20 Porto c-035 Santos 10 Faro B num nome status cidade c-023 Sousa 20 Porto c-012 Mendes 10 Olhão num nome status cidade A UNION B A INTERSECT B c-023 Sousa 20 Porto c-012 Mendes 10 Olhão C-035 Santos 10 Faro num nome status cidade c-023 Sousa 20 Porto Operadores devem ser do mesmo tipo A MINUS B num nome status cidade c-035 Santos 10 Faro B MINUS A num nome status cidade c-012 Mendes 10 Olhão
Operações sobre conjuntos: UNIÃO UNIÃO ( ) Unir as relações (A B) cria uma nova R que inclui todos os tuplos que estão seja em A, seja em B, ou seja em ambas duas A e B A e B devem ser compatíveis: - A e B devem ter o mesmo número de atributos e - Os pares correspondentes de atributos i (A.a i e B.a i ) devem ter o mesmo tipo Os tuplos repetidos são eliminados na nova R 24
UNIÃO em PostgreSQL Formato geral da cláusula união: select_statement UNION [ ALL DISTINCT ] select_statement O operador union computa o conjunto de tuplos devolvidos pelo select A R resultante elimina todos as tuplos duplicados de não ser que seja utilizado a opção ALL que impede isto acontecer CREATE VIEW tenistas AS SELECT * FROM tenistas_femeninas UNION ALL SELECT * FROM tenistas-masculinos Em geral: query1 UNION [ALL] query2; 25
UNIÃO: resolução em PostgreSQL 1. Se todos os inputs são do mesmo tipo, e este é conhecido, substituir por aquele tipo. Caso contrário, resolver qualquer tipo desconhecido com o tipo base: text normalmente 2. Se todos os tipos são desconhecidos, resolver como text Se não fazer, ignorar o input 3. Caso os tipos não conhecido não sejam da mesma categoria do tipo, a união falha 4. Escolher o primeiro tipo não conhecido que seja favorito numa categoria (ex. text é favorito na categoria strings) 5. Caso contrário, escolher um que permita todos os outros não conhecidos 6. Converter todos os inputs no tipo seleccionado. Se a conversão não é possível, a operação falhar 26
Exemplo: UNIÃO SELECT text a AS "texto" UNION SELECT b ; texto a b Neste caso, o tipo desconhecido do atributo b e resolvido como texto 27
Exemplo: UNIÃO SELECT 1 AS "real" UNION SELECT CAST( 2.2 AS REAL); real 1 2.2 Neste caso, real não pode ser convertido (cast) para integer, mas o contrário sim. Portanto a união resolve-se com o tipo real 28
Exemplo: UNIÃO Imagine as seguintes tabelas na sua BD representadas aqui como relações do modelo relacional: capitais (nome, população, altitude, pais, localização) não-capitais (nome, população, altitude, pais) Pretendemos fazer uma lista de todas as cidades, capitais ou não: CREATE VIEW cidades AS SELECT nome, população, altitude FROM capitais UNION SELECT nome, população, altitude FROM não-capitais; 29
(herança em PostgreSQL) Uma melhor alternativa para evitar problemas de actualizações seria: CREATE TABLE cidades (nome text, população real, altitude integer, pais text); CREATE TABLE capitais (localização text); INHERITS (cidades); A tabela capitais herda todos os atributos e tipos de cidades. Agora podemos interrogar assim: SELECT nome, altitude FROM cidades WHERE altitude > 20; (lista todas as cidades + capitais) 30
(herança em PostgreSQL) INHERITS (não é SQL 2008) e também podíamos interrogar: SELECT * FROM capitais (lista todas as capitais WHERE altitude > 20; (com todos os 5 campos) Cláusula opcional INHERITS especifica uma lista de tabelas das quais a nova tabela vai herdar automaticamente todas as suas colunas INHERITS cria uma relação persistente entre a nova tabela filha e a sua(s) mãe (mães) Se se modificar o esquema na mãe normalmente se propaga aos filhos. Também os dados por defeito são herdados. Uma lista na tabela mãe vai incluir os dados na tabela filha 31
Operações sobre conjuntos: Formato geral em SQL: INTERSECÇÃO ( ) Select_<declaração> INTERSECT [ ALL DISTINCT ] O operador INTERSECT computa o conjunto de intersecção das filas devolvidas pelos SELECT. Um tuplo está na intersecção de dois conjuntos de resultados se aparece em ambos os dois conjuntos de resultados Aqui o SELECT é qualquer SELECT mas não pode ter as claúsulas ORDER BY, LIMIT, FOR UPDATE, or FOR SHARE 32
Operações sobre conjuntos: INTERSECÇÃO ( ) CREATE VIEW tenistas AS SELECT * FROM campeões-tenis INTERSECT SELECT * FROM tenistas-masculinos A Relação resultante será neste caso a lista de todos os tenistas masculinos que se encontram também na lista de campeões de ténis CREATE VIEW: o query tenistas não é preciso repetir mais. Fica armazenado no esquema como uma outra tabela que podemos interrogar- (insert, update, delete proibidos por defeito) 33
Operações sobre conjuntos: INTERSECÇÃO ( ) R1: embarcação-motor R2: embarcação-vela código AVX-325 765-Fuseta 2100-TA nome D.Dias F. Santos S. Sousa código nome 432- Olhão M.Leite 765-Fuseta F. Santos 3243-TA T. Pires SQL: embarcação-motor INTERSECT embarcação-vela código 765-Fuseta nome F. Santos 34
Operações sobre conjuntos: DIFERENCIA (-) R1: embarcação-activa R2: embarcação-inactiva código nome código nome AVX-325 D.Dias AVX-325 D.Dias 765-Fuseta F. Santos 765-Fuseta F. Santos 2100-TA S. Sousa 3243-TA T. Pires embarcação-motor MINUS embarcação-vela SQL: embarcação-motor EXCEPT [ALL] embarcação-vela R3 código 2100-TA nome S. Sousa Diferencia: uma relação com estrutura igual as R originais e cujo corpo formado por todos os tuplos pertencentes a R1 mas não a R2 35
Álgebra relacional Para se poder calcular as operações união, intersecção ou diferencia (except)) de dois interrogações, as duas operações devem ser compatíveis com a operação união. Isto é, devem devolver o mesmo número de colunas e as colunas (atributos) correspondentes devem ter tipos de dados compatíveis 36
Operações sobre conjuntos: JUNÇÃO Equivale a produto cartesiano + seleção: Em SQL corresponde a JOIN.. Vários tipos diferentes R Ex.: R (natural) JOIN S S, a junção natural das relações R e S: o conjunto de todas as combinações de tuplos em R e S que são iguais no seu atributos com nome igual Se as tabelas tem n e m tuplos, a tabela resultante terá n*m tuplos FROM T1 CROSS JOIN T2 é equivalente a FROM T1, T2.. também é equivalente a FROM T1 INNER JOIN T2 ON TRUE (+ na 2ª parte) 37
Operações sobre conjuntos: divisão A mais dificil das operações. Utiliza 3 operadores: x, π, (produto cruzado, projecção, e diferença de conjuntos) para alem de se efectuar 6 operações O número de atributos em R1 é maior que R2 (divisor) A divisão encontra os valores dos atributos numa relação que estão pareados com TODOS os valores da otra relação Tal como a multiplicação é a divisão em aritmética, A divisão é ao produto cartesiano na álgebra relacional: O seu inverso If X, Y and Z (como união dos anteriores) então: X DIVIDEDBY Y PER Z 38
Operações sobre conjuntos: divisão J K Produto Cartesiano C A 2 6 Ex. SELECT 5 / 275; SELECT 5 DIV 2; ~ floor(); B 7 5 8 A B 2 7 2 5 2 8 6 7 6 5 6 8 Imagine que temos C = J x K (o produto cartesiano) A divisão é o oposto: C / J = K, C/K = J 39
Operações sobre conjuntos: divisão x k1 k2 k3 k4 k1 k3 k2 k3 k4 k1 k2 k3 R(A) R(B) R(A/B) y luis luis luis luis sofia sofia pedro pedro pedro linda linda linda / = conta k1 k2 k3 pessoa luis linda Divisão: uma pesquisa do tipo: Que pessoas tem conta nos bancos k1,k2 e k3? 40
Operações sobre conjuntos: divisão x k1 k2 k3 k4 k1 k3 k2 k3 k4 k1 k2 k3 A y luis luis luis luis sofia sofia pedro pedro pedro linda linda linda B A/B / = y k1 k2 k3 y luis linda R(A) = {conta, pessoa}; R(B) = {conta} Formalmente a divisão: A/B = { x Ǝ x,y A y B} A/B contem todos os tuplos x tais que para cada tuplo y em B, existe um tuplo xy em A 41
Álgebra Relacional Fim primeira parte 42