Você está na página 1de 66

Centro de Ciências Exatas e Tecnologia

Cursos de Informática

SQL Básico – Parte 4

Álgebra Relacional, Operadores de Conjuntos


e Operadores de Junções

Prof. Daniel Luis Notari

Maio - 2020
Introdução
• Álgebra Relacional
– Preocupa-se com a ordem que as operações
devem ser executadas

• Preocupação com a performance e otimização

• SQL
– Preocupa-se apenas especifica qual o resultado
desejado através de uma consulta declarativa,
deixando a otimização com o SGBD
Álgebra Relacional
●É uma linguagem de consulta formal onde o usuário dá
as instruções que representam operações na base de
dados para calcular o resultado.
● As operações são:
● seleção, projeção, união, intersecção, junção natural, produto
cartesiano e diferença.
●O resultado de qualquer operação entre relações,
também chamadas de tabelas, é uma nova relação.
●Dessa forma, pode-se realizar outras operações com o
resultado de uma operação de álgebra relacional.
Exercícios
Esquema Relacional:

Ambulatórios(nroa, andar, capacidade)


Médicos(codm, CPF, nome, idade, cidade,
especialidade, #nroa)
Pacientes(codp, CPF, nome, idade, cidade, doença)
Consultas(#codm, #codp, data, hora)
Funcionários(codf, CPF, nome, idade, cidade, salário)
Banco de Dados Ambulatórios
Ambulatorios Médicos

Pacientes Consultas

Funcionarios
Projeção
●A operação de projeção, representada pelo
operador π, é unária e filtra as colunas desejadas
na relação resultante.
● Sintaxe:
π coluna (tabela)

●No caso de mais


de uma coluna,
deve-se separá-las
por vírgula.
Projeção (SQL)
● Selecionar o nome e o cpf dos médicos
● Álgebra:
● π nome, cpf (medicos)
● SQL :
select nome, cpf
from medicos
Seleção
●A operação de seleção, representada pelo
operador σ, obtém linhas de acordo com um
critério informado.
●Esta operação é classificada como unária, pois
se aplica a apenas uma relação.
●Seu resultado será uma tabela com todos os
registros que satisfizerem à condição declarada.
● Sintaxe:
σ condição (tabela)
Seleção
● Operadores de Comparação:
>, <, =, <=, >=, <> (diferente)
● Operadores lógicos:
e, ou e não (and, or, not)
Seleção (SQL)
● Selecionar o nome e o cpf dos
médicos que moram em Florianópolis
● Álgebra:
● π nome, cpf ϭ cidade = 'Florianopolis' (medicos)
● SQL :
select nome, cpf
from medicos
where cidade = 'Florianopolis'
Exercícios - Seleção
1) buscar os dados dos pacientes que estão com
sarampo
2) buscar os dados dos médicos ortopedistas com
mais de 55 anos
3) buscar os dados de todas as consultas, exceto
aquelas marcadas para os médicos com código
46 e 79
4) buscar os dados dos ambulatórios do quarto
andar. Estes ambulatórios devem ter capacidade
igual a 50 ou número superior a 10
Produto Cartesiano
●O produto cartesiano é representado pelo
operador ×.
●É uma operação cujo resultado contém uma
combinação de todas as tuplas entre as duas
relações de entrada.
●É utilizado quando se deseja cruzar dados de
duas relações diferentes.
● Sintaxe:
tabela1 × tabela2
Produto Cartesiano
Produto Cartesiano (SQL)
●Cruzar as informações de ambulatórios e
médicos
● Algebra:
● π * (ambulatorios X medicos)
● Grau (Ambulatorios) = 3
● Grau (Medicos) = 7
● Grau (Resultado) = 10
● SQL :
select *
from ambulatorios, medicos
Produto Cartesiano (SQL)

Para cada linha de ambulatório, combina-a com cada linha de médico


Exercícios – Produto Cartesiano
1) buscar o nome dos médicos que têm consulta
marcada e as datas das suas consultas
2) buscar o número e a capacidade dos ambulatórios do
quinto andar e o nome dos médicos ortopedistas que
atendem neles
3) buscar, para as consultas marcadas para o período da
manhã (7hs-12hs) do dia 25/09/06, o nome do médico, o
nome do paciente e a data da consulta
4) buscar o nome e o salário dos funcionários de
Florianópolis e Palhoça que estão internados como
pacientes e têm consulta marcada com psiquiatras
Operações Binárias
● União, Intersecção e Diferença
●Para realizar essas operações, as duas relações
precisam ser compatíveis.
●Devem possuir o mesmo número de colunas e
os domínios das respectivas colunas devem ser
os mesmos:
União
●A operação de união, representada pelo operador ∪, é
binária.
● A relação resultante contém todos os elementos
pertencentes às relações originais sem duplicidade de
linhas.
●Para realizar essa operação, as duas relações
precisam ser compatíveis.
● Sintaxe:
● tabela1 ∪ tabela2
União (SQL)
●Listar o nome e cpf de todos os médicos e de
todos os pacientes
● Álgebra:
● C1 = π nome, cpf (medicos)
● C2 = π nome, cpf (pacientes)
● Resultado = C1 U C2
● Grau (C1) = 2
● Grau (C2) = 2
● Grau (C1) = Grau (C2)
● Consulta pode ser executada
União (SQL)
●Listar o nome e cpf de todos os médicos e de
todos os pacientes
● SQL
(select nome, cpf
from medicos
union
select nome, cpf
from pacientes)
order by cpf ● E se invertermos a consulta?
União (SQL)
●Listar o nome e cpf de todos os médicos e de
todos os pacientes
● SQL
(select nome, cpf
from medicos
union Algebra:

select nome, cpf ● C1 = π nome, cpf (medicos)


● C2 = π nome, cpf (pacientes)
from pacientes) ● Resultado = C1 U C2

order by cpf
Intersecção

● A intersecção, representada pelo operador ∩,


deve ser aplicada a duas relações compatíveis.

● A fim de obter uma relação resultante com os


registros em comum.

● Sintaxe:

tabela1 ∩ tabela2
Intersecção (SQL)
●Listar o nome e cpf de todos os médicos que
não são pacientes
● Álgebra:
● C1 = π nome, cpf (medicos)
● C2 = π nome, cpf (pacientes)
● Resultado = C1 ∩ C2
● Grau (C1) = 2
● Grau (C2) = 2
● Grau (C1) = Grau (C2)
● Consulta pode ser executada
Intersecção (SQL)
●Listar o nome e cpf de todos os médicos que
são pacientes
● Resposta: consulta vazia
● insert into pacientes values (100,10,
● SQL
'daniel', 56, 'Florianopolis', 'rinite alergica');
(select nome, cpf ● Execute novamente a consulta

● Resultado:

from medicos
intersect
select nome, cpf
from pacientes)
order by cpf ● E se invertermos a consulta?
Intersecção (SQL)
●Listar o nome e cpf de todos os médicos que são
pacientes
● SQL
(select nome, cpf
from pacientes
intersect ●Algebra:
●C1 = π nome, cpf (medicos)

select nome, cpf ●C2 = π nome, cpf (pacientes)

●Resultado = C1 ∩ C2

from medicos)
order by cpf
Diferença

● A operação de diferença, representada pelo


operador −, é aplicada a duas relações
compatíveis.

● E resulta nas linhas presentes na primeira e


ausentes na segunda.

● Sintaxe:

tabela1 − tabela2
Diferença (SQL)
●Listar o nome e cpf de todos os médicos que
não são pacientes
● Álgebra:
● C1 = π nome, cpf (medicos)
● C2 = π nome, cpf (pacientes)
● Resultado = C1 - C2
● Grau (C1) = 2
● Grau (C2) = 2
● Grau (C1) = Grau (C2)
● Consulta pode ser executada
Diferença (SQL)
●Listar o nome e cpf de todos os médicos que
não são pacientes
● SQL
(select nome, cpf
from medicos
except
select nome, cpf
from pacientes)
order by cpf
Diferença (SQL)
●Listar o nome e cpf de todos os médicos que
não são pacientes
● SQL
(select nome, cpf
from medicos
Algebra:
except

●C1 = π nome, cpf (medicos)

●C2 = π nome, cpf (pacientes)

select nome, cpf ●Resultado = C1 - C2

from pacientes)
order by cpf
Diferença (SQL)
● E se invertermos a consulta?????
●Listar o nome e cpf de todos os pacientes que
não são medicos
● SQL
(select nome, cpf
from pacientes
except
Em alguns SGBD,
select nome, cpf Use o comando minus
Para esta operação
from medicos)
Exercícios – União, intersecção e
diferença
1) buscar o nome e CPF dos médicos e dos pacientes
cadastrados no hospital
2) buscar o nome, CPF e idade dos médicos, pacientes e
funcionários que residem em Florianópolis
3) buscar o nome e CPF dos funcionários que recebem salários
abaixo de R$ 500,00 e não estão internados como pacientes
4) buscar o número dos ambulatórios onde nenhum médico dá
atendimento
5) buscar o nome e CPF dos funcionários de Florianópolis que
estão internados como pacientes
6) buscar o nome e CPF dos médicos pediatras que não atendem
nos ambulatórios 101 e 102, e estão internados como pacientes
Junção Natural
● A junção natural é representada pelo operador ⋈.
●Consiste na operação de seleção aplicada ao
produto cartesiano.
●Retorna linhas com o mesmo valor para colunas
de nomes iguais.
● Sintaxe:
tabela1 ⋈ tabela2
Junção Natural
Junção Natural (SQL)
●Liste o nome e o cpf de todos os médicos que
também são pacientes
● Álgebra:
● π nome, cpf (medicos ∞pacientes)
● SQL
select nome, cpf
from medicos natural join pacientes
Junção Natural (SQL)
●Ao executar a consulta, o SGBD faz a
comparação interna de todas as colunas iguais,
neste caso, cpf, nome, idade, cidade.
3 ●Algebra: π nome, cpf (medicos ∞pacientes)

1
1
3

2
Junção Natural (SQL)
●Quando as tabelas da junção natural possuírem
apenas as colunas com chave primária e
estrangeira escritas de forma igual pode-se usar
esta junção sem ser necessário especificar o
critério de junção.
●Listar todos os ambulatórios em que os médicos
realizam atendimento
● Álgebra:
● π nome, cpf, nroa (medicos ∞ambulatorios)
● SQL: select nome, cpf, nroa
Exercícios – junção natural
1) buscar o número e a capacidade dos ambulatórios do
quinto andar e o nome dos médicos que atendem neles
2) buscar o nome e o salário dos funcionários de
Florianópolis e Palhoça que estão internados como
pacientes e têm consulta marcada em 20/10/2006
3) buscar o número e o andar dos ambulatórios onde
nenhum médico dá atendimento
4) buscar o número dos ambulatórios que estão no
mesmo andar do ambulatório 101 e possuem
capacidade superior à capacidade dele
Junção Interna
● A diferença desta para a junção natural é
● Que definimos explicitamente o predicado da
junção.
●Normalmente usada para cruzar dados de uma
tabela relacionada usando a PK e FK das tabelas.
● Notação: R1 ɵ X R2
● Exemplo:
Junção Interna (SQL)
●Liste o nome e o cpf de todos os médicos que
também são pacientes
● Álgebra:
● π nome, cpf (medicos ∞Ɵ pacientes)
Ɵ = medicos.cpf = pacientes.cpf and medicos.nome =
pacientes.nome and medicos.idade = pacientes.idade and
medicos.cidade = pacientes.cidade

● SQL
select m.nome, m.cpf
from medicos as m inner join pacientes as p on m.cpf = p.cpf and
m.nome = p.nome and m.idade = p.idade and m.cidade = p.cidade
Junção Interna (SQL)
● Consulta igual a consulta com natural join?
● Álgebra:
● π nome, cpf (medicos ∞Ɵ pacientes)

Ɵ = medicos.cpf = pacientes.cpf and medicos.nome = pacientes.nome


and medicos.idade = pacientes.idade and medicos.cidade = pacientes.cidade
3

1
1
3

2
Junção Interna (SQL)
●Listar todos os ambulatórios em que os médicos
realizam atendimento
● Álgebra:
● π nome, cpf, nroa (medicos ∞ Ɵ ambulatorios)
Ɵ = medicos.nroa = ambulatorios.nroa

SQL:
select nome, cpf, m.nroa
from medicos as m inner join
ambulatorios as a
Exercícios – junção interna
1) buscar o número e a capacidade dos ambulatórios do
quinto andar e o nome dos médicos que atendem neles
2) buscar o nome e o salário dos funcionários de
Florianópolis e Palhoça que estão internados como
pacientes e têm consulta marcada em 20/10/2006
3) buscar o número e o andar dos ambulatórios onde
nenhum médico dá atendimento
4) buscar o número dos ambulatórios que estão no
mesmo andar do ambulatório 101 e possuem
capacidade superior à capacidade dele
Junção Externa
● Junção na qual
●as linhas de uma ou ambas as relações que não
são combinadas são mesmo assim preservadas no
resultado
● Tipos:
●junção externa à esquerda: linhas da relação à
esquerda são preservadas
●junção externa à direita: linhas da relação à direita são
preservadas
●junção externa completa: linhas de ambas as relações
são preservadas
Junção Externa

R1 esquerda ƟX R2,
Ɵ = R1.x = R2.x

R1 completo ƟX R2,
Ɵ = R1.x = R2.x

R1 direita ƟX R2,
Ɵ = R1.x = R2.x
Junção Externa (SQL)
●Liste o nome e o cpf de todos os médicos que
possuem doenças e os médicos que não possuem
doenças também
● Álgebra:
● π nome, cpf, doenca (medicos ]∞Ɵ pacientes)
– Ɵ = medicos.cpf = pacientes.cpf
● SQL
select m.cpf, m.nome, p.doenca
from medicos as m left outer join
Junção Externa (SQL)
●Liste o nome e o cpf de todos os médicos que
possuem doenças e os médicos que não possuem
doenças também
● SQL
select m.cpf, m.nome, p.doenca
from medicos as m left outer join
pacientes as p on m.cpf = p.cpf
● Álgebra:
π nome, cpf, doenca (medicos ]∞Ɵ pacientes)
Ɵ = medicos.cpf = pacientes.cpf
Junção Externa (SQL)
●Liste o nome e o cpf de todos os médicos que
possuem doenças e as demais doenças
● Álgebra:
π nome, cpf, doenca (medicos ∞Ɵ[ pacientes)

– Ɵ = pacientes.cpf = medicos.cpf
● SQL
select m.cpf, m.nome, p.doenca
from medicos as m right outer
join pacientes as p
Junção Externa (SQL)
●Liste o nome e o cpf de todos os médicos que
possuem doenças e as demais doenças
● SQL
select m.cpf, m.nome, p.doenca
from medicos as m right outer join
pacientes as p on m.cpf = p.cpf
● Álgebra:
π nome, cpf, doenca (medicos ∞Ɵ[ pacientes)
Ɵ = pacientes.cpf = medicos.cpf
Junção Externa (SQL)
●Liste o nome e o cpf de todos os médicos que
possuem doenças, os médicos que não possuem
doenças também e as demais doenças também
● Álgebra:
● π nome, cpf, doenca (medicos ]∞Ɵ[ pacientes)
–Ɵ = pacientes.cpf = medicos.cpf
● SQL
select m.cpf, m.nome, p.doenca
from medicos as m full outer join
Junção Externa (SQL)
●Liste o nome e o cpf de todos os médicos que
possuem doenças, os médicos que não possuem
doenças também e as demais doenças também
π nome, cpf, doenca (medicos ]∞Ɵ[ pacientes)
Ɵ = pacientes.cpf = medicos.cpf
Exercícios – junção externa
1) buscar os dados de todos os médicos e, para
aqueles que têm consultas marcadas, mostrar os
dados de suas consultas
2) buscar os números de todos os ambulatórios e,
para aqueles ambulatórios nos quais médicos dão
atendimento, exibir o código e o nome dos
médicos associados
3) mostrar em uma relação o CPF e nome de
todos os pacientes e de todos os médicos,
apresentando estes dados de forma relacionada
para aqueles que possuem consultas marcadas
Divisão
● Considera duas relações
● dividendo (grau m + n)
● divisor (grau n)
● Grau “n”
● atributos de mesmo nome em ambas as relações
● Quociente
● grau “m”
●atributos da relação dividendo cujos valores
associam-se com todos os valores da relação divisor
Divisão
Divisão (SQL)
●Consultar todos os pacientes que foram
antendidos pelo mesmo médico
● Álgebra
● Dividendo: Consultas(codm, codp)
● Divisor: Paciente (codp)
● Resultado: Consultas(codm)
● Consulta em álgebra
● π codm (Consultas ÷ Paciente )
Consultas (codm, codp) Pacientes (codp)
select distinct c.codm
Divisão (SQL) from consultas as c
where not exists
● Consultar todos (select p.codp
from pacientes as p
os pacientes where not exists
que foram antendidos (select c1.codp
from consultas as c1
pelo mesmo médico where p.codp <> c1.codp
and c.codp <> c1.codp
● SQL and c.codm = c1.codm))
Divisão (SQL)
●Consultar todos os pacientes que foram
antendidos pelo mesmo médico
● Inserir os valores abaixo para obter um resultado

INSERT INTO consultas(codm, codp, data, hora) VALUES (1, 1, '19-08-2014', '8:00');
INSERT INTO consultas(codm, codp, data, hora) VALUES (1, 2, '18-08-2014', '8:15');
INSERT INTO consultas(codm, codp, data, hora) VALUES (1, 3, '17-08-2014', '8:30');
INSERT INTO consultas(codm, codp, data, hora) VALUES (1, 4, '16-08-2014', '8:45');
INSERT INTO consultas(codm, codp, data, hora) VALUES (1, 5, '15-08-2014', '9:00');
INSERT INTO consultas(codm, codp, data, hora) VALUES (1, 100, '14-08-2014', '9:15');
Divisão (SQL)
●Consultar todos os pacientes que foram
atendidos pelo mesmo médico
●Resultado: O médico de código 1 possui
consulta com todos os pacientes
Divisão (SQL)
Consultar todos os pacientes
● que foram
antendidos pelo mesmo médico
Exercícios - Divisão
1) buscar o código dos pacientes que têm
consultas marcadas com todos os médicos
2) buscar o nome e o CPF dos médicos que têm
consultas marcadas com todos os pacientes
3) buscar o nome e o CPF dos pacientes que têm
consultas marcadas com todos os médicos
ortopedistas que atendem nos ambulatórios do
primeiro andar
4) todos os médicos ortopedistas dão atendimento
no mesmo ambulatório? Em caso afirmativo,
Boa escrita de Consultas
Boa escrita de Consultas
● Uso de subconsultas
Exercícios – Otimização de
consultas
1) buscar o número dos ambulatórios com
capacidade superior à capacidade do ambulatório
de número 100
2) buscar o nome e o CPF dos funcionários que
recebem salários iguais ou inferiores ao salário do
funcionário com CPF 1001
3) buscar pares de nomes de médicos diferentes
que têm consultas marcadas nas mesmas datas
Exercícios
● Use a base de dados de livros
Esquema:
Autor (codigo, nome)
Livros (codigo, titulo)
Edicao (#codigoLivro, numero, ano)
LivroAutor (#codigoLivro, #codigoautor)
●Responda as próximas consultas em álgebra
relacional e escreva a consulta SQL equivalente
Exercícios
1. Fazer um produto cartesiano entre livros e livroautor.
Gere o plano de execução da consulta e explique-o.
2. Listar o nome dos autores com mais de quatro
edições publicadas em ordem crescente de número
de edições
3. Listar os títulos de livros em que o autor possui mais
de uma publicação de livro
4. Listar o numero de publicações por ano ordenado do
menor para o maior
5. Listar o nome dos autores que não publicaram
nenhum livro
Exercícios
6. Listar o titulo do livro que possui mais de um autor
7. Listar o titulo do livro mais antigo
8. Listar o titulo do livro mais novo
9. Listar o nome do autor do livro mais antigo
10. Listar o nome do autor do livro mais novo
11. Criar exemplos de consultas usando união,
intersecção, diferença e divisão.
12. Criar exemplos de consultas usando natural join e
outer join
Exercício
● Exemplo de criar uma tabela temporária
select codigo, titulo, autor, edicao, ano, codigo /10 as quantidade,
codigo * 0.33 as preco into teste1
from livrosTemp
where codigo < 1000
Proponha um modelo dimensional para a base de dados

de livros, definindo ao menos três métricas


● Crie a nova base de dados a partir de tabelas temporárias
Crie algumas consultas para mostrar os valores das

métricas

Você também pode gostar