Skip to content

Instantly share code, notes, and snippets.

@vinolivae
Last active February 8, 2024 22:20
Show Gist options
  • Save vinolivae/3c42c9dea51d2e3138b7e7fe3a7c21db to your computer and use it in GitHub Desktop.
Save vinolivae/3c42c9dea51d2e3138b7e7fe3a7c21db to your computer and use it in GitHub Desktop.

Algebra Relacional

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

Relação

Na algebra relacional toda ação gera uma relação(inclusive renomear ou atribuir algo)

Seleção

filtrando linhas

σ id_vendedor_vendas = 1 (Vendas)

sigma cidade = 'Rio de Janeiro' (Clientes)

Projeção

filtrando colunas

π nome, anos_exp (Vendedores)

pi qtd_estoque, nome_livro (Livros)

filtrando linhas e colunas

π nome, email (σ cidade = 'Rio de Janeiro' (Clientes))

Produto Cartesiano

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)

Junção

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)

Natural ⨝

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)

Esquerda ⟕ e Direita ⟖

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))

União ∪(uma coisa ou outra coisa)

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)

Interseção ∩(uma coisa em comum entre dois registros)

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

Diferença

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)

Renomeação

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)

Atribuição

Na algebra relacional toda ação gera uma relação

livros_especiais = pi id_livro (LivroMaisVendidos) ∩ pi id_livro (LivrosRecomendados)

livros_especiais ⨝ Livros

Base de dados utilizada

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', 'joao.silva@example.com'
2, 'Maria Santos', 'Rio de Janeiro', 'maria.santos@example.com'
3, 'Pedro Almeida', 'Belo Horizonte', 'pedro.almeida@example.com'
4, 'Ana Souza', 'Salvador', 'ana.souza@example.com'
5, 'Carlos Lima', 'Brasília', 'carlos.lima@example.com'
6, 'Fernanda Rocha', 'Recife', 'fernanda.rocha@example.com'
7, 'André Oliveira', 'Fortaleza', 'andre.oliveira@example.com'
8, 'Juliana Costa', 'Manaus', 'juliana.costa@example.com'
9, 'Luiz Fernandes', 'Curitiba', 'luiz.fernandes@example.com'
10, 'Laura Santos', 'Porto Alegre', 'laura.santos@example.com'
11, 'Paulo Rodrigues', 'Belém', 'paulo.rodrigues@example.com'
12, 'Carolina Menezes', 'Rio de Janeiro', 'carolina.menezes@example.com'
13, 'André Santos', 'Goiânia', 'andre.santos@example.com'
14, 'Isabella Oliveira', 'Vitória', 'isabella.oliveira@example.com'
15, 'Marcelo Costa', 'São Luís', 'marcelo.costa@example.com'
16, 'Beatriz Andrade', 'Natal', 'beatriz.andrade@example.com'
17, 'Rafael Fernandes', 'Campinas', 'rafael.fernandes@example.com'
18, 'Laura Mendes', 'Rio de Janeiro', 'laura.mendes@example.com'
19, 'Alexandre Lima', 'Cuiabá', 'alexandre.lima@example.com'
20, 'Vanessa Santos', 'Aracaju', 'vanessa.santos@example.com'
}

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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment