A álgebra relacional é uma teoria matemática que forma a base dos bancos de dados relacionais. Foi introduzida por Dr. E.F. Codd (1923-2003) enquanto trabalhava na IBM. É uma coleção de operações que são realizadas em um ou mais relações (tabelas) para obter outra relação sem alterar a original.
Algumas das operações mais comuns são:
seleção;
projeção;
união;
intersecção;
diferença; e
produto cartesiano.
Basicamente, SQL é uma maneira de implementar a álgebra relacional. Cada operação na álgebra relacional tem uma contraparte direta em SQL.
SELEÇÃO em álgebra relacional é implementado como WHERE em SQL.
PROJEÇÃO em álgebra relacional é implementado como a lista de colunas que você escolhe após a palavra SELECT em SQL.
UNIÃO é representado pelo UNION.
DIFERENÇA em álgebra relacional é implementado como EXCEPT em SQL.
PRODUTO CARTESIANO é implementado como um JOIN sem condição ou CROSS JOIN em SQL.
Plataforma online para treinar algebra relacional https://dbis-uibk.github.io/relax/calc/local/uibk/local/0
Na algebra relacional toda ação gera uma relação(inclusive renomear ou atribuir algo)
filtrando linhas
σ id_vendedor_vendas = 1 (Vendas)
sigma cidade = 'Rio de Janeiro' (Clientes)
filtrando colunas
π nome, anos_exp (Vendedores)
pi qtd_estoque, nome_livro (Livros)
filtrando linhas e colunas
π nome, email (σ cidade = 'Rio de Janeiro' (Clientes))
cruza todas as informações entre as tabelas
Livros x Clientes
todas possibilidades de livros com todas possibilidades de clientes, operação custosa
pi Livros.nome_livro, Clientes.nome (Livros x Clientes)
não quero cruzamento, quero que cada linha venha apenas com a informação selecionada
pi Vendedores.nome,Vendas.id_pedido,Vendas.id_vendedor_vendas,Vendedores.id_vendedor (sigma id_vendedor_vendas = id_vendedor (Vendas x Vendedores))
opção: toda vez que fazemos uma junção temos um produto cartesiano + filtro especifico. Isso é um join.
pi Vendedores.nome,Vendas.id_pedido,Vendas.id_vendedor_vendas,Vendedores.id_vendedor (Vendas ⨝ id_vendedor_vendas = id_vendedor Vendedores)
Fará relação entre duas tabelas onde os atributos são iguais em ambas, nesse caso é id_livro(oque tem em uma e tem em outra)
pi id_pedido, id_livro, nome_livro (Vendas ⨝ Livros)
Mantém as tuplas da relação da esquerda, mesmo se eu não encontrar na relação do lado direito ou mantém as tuplas da relação a direita, mesmo se eu não encontrar na relação do lado esquerdo
Existe alguma venda feita por um vendedor não cadastrado?
Vendas ⟕ Vendedores
sigma id_vendedor_vendas = null (pi nome,id_vendedor,id_vendedor_vendas (Vendas ⟕ id_vendedor_vendas = id_vendedor Vendedores))
Quais vendedores não realizaram venda alguma?
sigma id_vendedor_vendas = null (pi nome,id_vendedor,id_vendedor_vendas (Vendas ⟖ id_vendedor_vendas = id_vendedor Vendedores))
Livros mais vendidos ou recomendados
11 livros que são, ou mais vendidos ou mais recomendados, sem duplicar.
pi id_livro (LivroMaisVendidos) ∪ pi id_livro (LivrosRecomendados)
Existem livros que são mais vendidos e também mais recomendados?
pi id_livro (LivroMaisVendidos) ∩ pi id_livro (LivrosRecomendados)
Diferença entre união, junção e interseção Na junção precisamos ter uma conexão(PK, FK) entre as tabelas que são consultadas E nas operações de conjunto(união e interseção) não é necessária uma conexão entre as duas tabelas
Quais livros estão no cadastro, mas não foram vendidos?
pi id_livro (Livros) - pi id_livro (Vendas)
Quais são os vendedores que não realizaram vendas?
pi id_vendedor (Vendedores) - pi id_vendedor_vendas (Vendas)
Pessoas candidatas para trabalhar com a Camila Santos
Renomeando tabela ρ(rho)
ρ V1 Vendedores x Vendedores
com ^(and)
sigma v1.anos_exp < v2.anos_exp ∧ v1.nome = 'Camila Santos' (rho v1 Vendedores x rho v2 Vendedores)
Renomeando colunas ρ(rho) e ←(nome que quero <- nome antigo)
rho nome_do_vendedor ← nome (Vendedores)
Na algebra relacional toda ação gera uma relação
livros_especiais = pi id_livro (LivroMaisVendidos) ∩ pi id_livro (LivrosRecomendados)
livros_especiais ⨝ Livros
group: Clube do Livro
Livros = {
id_livro, nome_livro, autor, preco, qtd_estoque
1, 'Percy Jackson e o Ladrao de Raios', 'Rick Riordan', 41.2, 11
2, 'Sangue de Lobo', 'Rosana Rios', 50.9, 2
3, 'Resident Evil Caliban Cove', 'S.D Perry', 18, 5
4, 'O Simbolo Perdido', 'Dan Brown', 60, 9
5, 'Sombras e Ossos', 'Leigh Bardugo', 28.9, 7
6, 'Pegasus e o Fogo do Olimpo', 'Kate O Hearn', 24.9, 8
7, 'Gossip Girl Nao me Esqueca', 'Cecily Von', 26.9, 4
8, 'Cidade das Almas Perdidas', 'Cassandra Clare', 34.45, 12
9, 'A Chama de Ember', 'Colleen Houck', 39.46, 1
10, 'A Maldicao do Tigre', 'Colleen Houck', 60, 6
11, 'O Senhor dos Anéis', 'J.R.R. Tolkien', 29.99, 10
12, 'Harry Potter', 'J.K. Rowling', 24.99, 15
13, 'Cem Anos de Solidão', 'Gabriel García Márquez', 19.99, 8
14, 'Dom Quixote', 'Miguel de Cervantes', 22.99, 12
15, 'A Revolução dos Bichos', 'George Orwell', 17.99, 20
16, 'Orgulho e Preconceito', 'Jane Austen', 18.99, 5
17, 'Crime e Castigo', 'Fyodor Dostoevsky', 21.99, 7
18, '1984', 'George Orwell', 20.99, 9
19, 'Ulisses', 'James Joyce', 25.99, 3
20, 'O Grande Gatsby', 'F. Scott Fitzgerald', 16.99, 11
}
Vendedores = {
id_vendedor, nome, anos_exp
1, 'Lucas Silva', 5
2, 'Camila Santos', 3
3, 'Gabriel Almeida', 7
4, 'Larissa Souza', 2
5, 'Rafael Lima', 0
6, 'Júlia Rocha', 0
}
Clientes = {
id_cliente, nome, cidade, email
1, 'João Silva', 'São Paulo', '[email protected]'
2, 'Maria Santos', 'Rio de Janeiro', '[email protected]'
3, 'Pedro Almeida', 'Belo Horizonte', '[email protected]'
4, 'Ana Souza', 'Salvador', '[email protected]'
5, 'Carlos Lima', 'Brasília', '[email protected]'
6, 'Fernanda Rocha', 'Recife', '[email protected]'
7, 'André Oliveira', 'Fortaleza', '[email protected]'
8, 'Juliana Costa', 'Manaus', '[email protected]'
9, 'Luiz Fernandes', 'Curitiba', '[email protected]'
10, 'Laura Santos', 'Porto Alegre', '[email protected]'
11, 'Paulo Rodrigues', 'Belém', '[email protected]'
12, 'Carolina Menezes', 'Rio de Janeiro', '[email protected]'
13, 'André Santos', 'Goiânia', '[email protected]'
14, 'Isabella Oliveira', 'Vitória', '[email protected]'
15, 'Marcelo Costa', 'São Luís', '[email protected]'
16, 'Beatriz Andrade', 'Natal', '[email protected]'
17, 'Rafael Fernandes', 'Campinas', '[email protected]'
18, 'Laura Mendes', 'Rio de Janeiro', '[email protected]'
19, 'Alexandre Lima', 'Cuiabá', '[email protected]'
20, 'Vanessa Santos', 'Aracaju', '[email protected]'
}
Vendas = {
id_pedido, id_vendedor_vendas, id_livro, qtd_vendida
1, 3, 7, 2
2, 1, 2, 5
3, 2, 4, 3
4, 4, 8, 1
5, 3, 6, 2
6, 1, 6, 4
7, 2, 3, 1
8, 4, 10, 3
9, 3, 9, 2
10, 1, 10, 1
11, 2, 12, 2
12, 4, 15, 3
13, 3, 18, 1
14, 1, 13, 4
15, 3, 17, 2
16, 2, 20, 1
17, 1, 11, 3
18, 4, 14, 2
19, 3, 19, 1
20, 2, 16, 5
21, 1, 3, 2
22, 4, 7, 3
23, 3, 10, 1
24, 1, 9, 4
25, 3, 6, 2
}
LivroMaisVendidos = {
id_livro, ano, mais_vendidos
3, 2020, 120
7, 2021, 95
9, 2019, 80
12, 2022, 150
14, 2018, 110
16, 2021, 135
18, 2020, 100
19, 2021, 90
20, 2019, 75
6, 2022, 130
}
LivrosRecomendados = {
id_livro, fonte_recomendacao, nota_media
3, 'Book Reviews', 4.2
7, 'Literary Gazette', 3.8
9, 'Readers Digest', 4.5
12, 'BestBooks Magazine', 4.1
14, 'Bookworm Reviews', 4.4
16, 'ReadItAll Blog', 4
18, 'Literary Gazette', 4.6
19, 'Book Reviews', 3.9
20, 'Readers Digest', 4.3
1, 'BestBooks Magazine', 4.5
}