Buscar

SQL

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 66 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 66 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 66 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Structured Query Language 
SQL 
Banco de Dados I
2
Introdução
• Padrão adotado por todos o fabricantes 
de SGBD para gerenciamento da 
estrutura e dos dados em um banco de 
dados
• Versão atual – 1999
• 2 partes principais
– DDL: Data Definition Language
– DML: Data Manipulation Language
3
Data Definition Language (DDL)
• Usada para manipular as estruturas do banco 
de dados
– Tabelas
– Visões
– Usuários
• Comandos
– CREATE (criação)
– ALTER (alteração)
– DROP (exclusão)
4
CREATE TABLE
CREATE TABLE nome_tabela (
 Campo1 tipo [null|not null],
 Campo2 tipo [null|not null],
 ... ... ...
 CampoN tipo [null|not null],
 [CONSTRAINT nome_restrição]PRIMARY KEY (campo1[,campo2]),
 [[CONSTRAINT nome_restrição] FOREIGN KEY on (campo(s))
 REFERENCES tabela_ref
 ON DELETE cascade|set null|restrict
 ON UPDATE cascade|set null|restrict]) 
5
CREATE TABLE
• O que está entre colchetes [ ] indica que é 
opcional
• Dicas
– sempre definir a chave primária (primary key) na 
criação da tabela
• Usar Constraint nome_chave, mesmo que não precise
– definir as chaves estrangeiras (foreign key) no 
comando ALTER TABLE.
6
CREATE TABLE
CREATE TABLE hospedagem.hotel (
 codigo varchar(7), 
 nome varchar(30) NOT NULL,
 estrelas integer, 
 cidade varchar(3),
 CONSTRAINT hotel_pk PRIMARY KEY(codigo))
esquema
Exercícios
• Criar as seguintes tabelas
– cidade
• codcidade – varchar(3)
• nomecidade – varchar(50)
• Chave primária codcidade
– quarto
• codhotel – varchar(7)
• numero – integer
• valor_diaria – numeric(7,2)
• Chave primária – (codhotel, numero)
7
8
ALTER TABLE
/* adiciona/exclui coluna à tabela */
ALTER TABLE nome_tabela ADD nomeCampo tipo;
ALTER TABLE nome_tabela DROP COLUMN nomeCampo;
/* adiciona restrição (chave estrangeira ou primária) */
ALTER TABLE nome_tabela ADD CONSTRAINT nome_restricao
 FOREIGN KEY ON campo(s) REFERENCES tabela_ref
ON DELETE CASCADE|RESTRICT|SET NULL
ON UPDATE CASCADE|RESTRICT|SET NULL;
ALTER TABLE nome_tabela ADD CONSTRAINT nome_restricao
 PRIMARY KEY campo;
/*exclui restrição*/
ALTER TABLE nome_tabela DROP CONSTRAINT nome_restricao
9
ALTER TABLE
• Uma coluna é sempre inserida ao final da tabela 
(última coluna)
• Existe o comando MODIFY, mas ainda não é 
padrão SQL.
– Se quiser alterar uma coluna, deve-se fazer um 
DROP COLUMN e depois um ADD
• CUIDADO ao excluir uma constraint, 
especialmente se for primary key
– Isto é feito, em geral, se a chave primária de uma 
tabela era simples e deve passar a ser composta
10
ALTER TABLE
ALTER TABLE hospedagem.hotel ADD
CONSTRAINT hotel_fk_cidade FOREIGN KEY (cidade) 
 REFERENCES hospedagem.cidade
on delete restrict
on update cascade
Exercícios
• Adicionar chave estrangeira na tabela quarto
– Campo codhotel, referenciando a tabela hotel
11
12
DROP TABLE
DROP TABLE nome_tabela
13
Data Manipulation Language (DML)
• Usada para manipular os dados do banco 
propriamente ditos
• Comandos
– INSERT (inserir)
– UPDATE (atualizar)
– DELETE (excluir)
– SELECT (consultar)
14
INSERT
INSERT INTO nome_tabela (campo1, campo2, ... , campoN) 
VALUES (valCampo1, ‘valCampo2’, ... , valCampoN); 
15
INSERT
• Os campos da tabela não precisam ser informados, mas se não forem 
informados
– devem ser dados valores a todos eles
– a ordem devem ser a mesma dos campos da tabela
• Quando os campos forem especificados
– Deve haver 1 valor para cada campo
– Os valores devem ser especificados na mesma ordem que foram os campos
• Quanto aos valores
– Se for numérico, não precisa de aspas ‘ ’
– Se não for numérico, deve vir entre aspas ‘’
• A campos que são chave estrangeira somente podem ser atribuidos valores 
existentes nos campos referenciados.
16
INSERT
INSERT INTO hospedagem.cidade (codcidade, nomecidade)
VALUES (‘GMD’, ‘Gramado’);
INSERT INTO hospedagem.hotel
VALUES (‘HTL004’,‘Serra Azul’, 5, ‘GMD’);
INSERT INTO hospedagem.hotel (cidade, codigo, estrelas, 
nome) 
VALUES (‘GMD’, ‘HTL003’, 4, ‘Serrano’);
 
17
DELETE
DELETE FROM nome_tabela [WHERE (condição)]
• Alguns bancos de dados requerem um * antes do FROM
• Na cláusula where pode-se colocar desde uma condição 
simples até condições que envolvam mais de uma 
tabela
18
DELETE
DELETE FROM hospedagem.hotel 
WHERE (nome = ‘Continental’)
DELETE FROM hospedagem.reserva 
WHERE ((data < ‘2011-11-25’) AND(hotel = ‘HTL005’))
DELETE FROM hospedagem.reserva 
WHERE ((codcli = ‘CLI003’) OR (diarias >= 4))
19
UPDATE
UPDATE nome_tabela 
SET campo1=novoVal1, campo2 = ‘novoVal2’, ... , campoN = 
novoValN 
WHERE (condição). 
20
UPDATE
• No SET, não precisam constar todos os 
campos. Apenas aqueles que devem ter seus 
valores atualizados.
• No WHERE, a condição é um teste booleano. 
Serão alterados todos os registros que 
satisfizerem à condição, desde que não violem 
regras de integridade.
• No WHERE podem aparecer junções de 
tabelas, caso a atualização envolva mais de 
uma tabela.
21
UPDATE
UPDATE hospedagem.hospede
SET nome = ‘Paula’, email = ‘paulasoares@hotmail.com’
WHERE codcliente = ‘CLI006’
Exercícios
• Criar uma nova cidade, chamada Novo Hamburgo
• Criar 2 hotéis na cidade de Novo Hamburgo, sendo 1 
deles com 3 estrelas e outro com 4 estrelas.
• Criar 2 quartos no hotel 4 estrelas, com diárias de R$ 
100,00.
• Atualizar as diárias dos quartos do hotel 4 estrelas para 
R$ 200,00.
• Excluir o hotel 3 estrelas.
22
23
SELECT
SELECT campo1, campo2, … , campoN
FROM tabela1[, tabela2, … , tabelaN]
[WHERE (condição)]
[GROUP BY função_de_agrupamento
[HAVING (condição_grupo)]]
[ORDER BY campo_de_ordenação]
24
SELECT
• No caso de usarmos múltiplas tabelas, não se 
pode esquecer da condição de junção na 
clausula WHERE.
• No caso de múltiplas tabelas, se um 
determinado campo aparecer em ambas, deve 
ser colocado nome_tabela.nome_campo.
• No ORDER BY somente podem ser colocados 
campos que constem no SELECT.
– Alguns SGBD permitem que o campo não conste no 
SELECT, mas não é padrão SQL. 
25
SELECT
• Caso queira selecionar-se todos os 
campos de uma tabela, pode-se usar 
SELECT * FROM tabela ao invés de 
especificar todos os campos.
• O ordem de cada parte do comando deve 
ser seguida, a menos que alguma delas 
não seja usada.
26
SELECT
• Obter todos os dados da tabela cidade
SELECT * FROM hospedagem.cidade
• Obter o nome e o email de cada hóspede
SELECT nome, email
FROM hospedagem.hospede
• Obter o nome e o número de estrelas de cada hotel ordenando os 
resultados por este último
Select nome, estrelas
From hospedagem.hotel
Order by estrelas
– Para ordenar do maior para o menor, coloca-se, ao final, DESC
– Para ordenar do menor para o maior, coloca-se, ao final, ASC. Esta é a 
opção default, que será usada se nada for especificado.
27
FUNÇÕES NO SELECT
• Ao invés de especificar campos, podem 
ser especificadas algumas funções no 
SELECT  SELECT funcao(campo), e o 
resto fica igual
– Somente pode ser especificado 1 campo por 
função
– Se é especificada uma função, ela é a única 
coisa que aparece no SELECT
28
FUNÇÕES NO SELECT
• Count (*): retorna o número de registros que satisfazem a consulta
• Max(campo): retorna o maior valor do campo especificado, para os 
registros que satisfazem a consulta.
• Min(campo): retorna o menor valor do campo especificado, para os 
registros que satisfazem a consulta.
• AVG(campo): retorna a média dos valores do campo especificado, 
para os registros que satisfazem a consulta.
• SUM(campo): retorna a soma dos valores do campo especificado, 
para os registros que satisfazem aconsulta.
• Distinct(campo): retorna os valores do campo especificado para os 
registros que satisfazem a consulta, sem repetição
29
FUNÇÕES NO SELECT
• Obter o maior valor de diária
SELECT max(valor_diaria)
FROM hospedagem.quarto
• Obter a soma do número de diárias reservadas
SELECT sum(diarias)
FROM hospedagem.reserva
• Obter o nome do(s) hotel(is) com mais estrelas
– NÃO dá para fazer ainda… esperar consultas aninhadas
30
SELECT – uso do WHERE
• A cláusula WHERE serve para
– Filtrar algumas linhas do resultado, impondo 
condições (testes booleanos)
– Efetuar a junção das tabelas, quando a consulta 
envolver duas ou mais tabelas
• TODAS as tabelas devem estar, de alguma forma, 
relacionadas
• Se não for feita a junção no where, ocorre o produto 
cartesiano.
– Quando houver mais de uma condição / junção no 
where, devem ser usados os conectivos lógicos AND 
ou OR
31
SELECT – uso do WHERE
• Obter o nome dos hotéis com ao menos 4 estrelas
• Obter o código do hotel e o número do quarto com 
reservas de mais de 2 diárias na data de 2011-11-15
SELECT nome
FROM hospedagem.hotel
WHERE (estrelas > 3)
SELECT hotel, quarto
FROM hospedagem.reserva
WHERE (data = `2011-11-15`) AND 
(diarias > 2)
32
SELECT – uso do WHERE
• Obter o nome dos hotéis de gramado (GMD) e Bento Gonçalves (BGS)
• Quando a comparação é com strings, é possível fazer “aproximações”
– Like quer dizer que não precisa ser 100% igual
– % indica que pode ser qualquer coisa
• No exemplo, deseja-se o nome dos hóspedes que tem email do gmail.
SELECT nome
FROM hospedagem.hotel
WHERE cidade = ‘GMD’ or cidade=‘BGS’
SELECT nome
FROM hospedagem.hospede
WHERE email like ‘%gmail%’
33
SELECT – uso do WHERE
• Quando mais de uma tabela deve ser consultada, ou 
uma única tabela deve ser consultada mais de uma vez, 
é necessário fazer a junção das tabelas
• A junção de tabelas SEMPRE é feita da seguinte forma:
– Sejam t1 e t2 duas tabelas
– A chave primária de t1 é cprim
– t2 possui um campo cestr que é uma chave estrangeira para a 
(chave primária da) tabela t1.
– Neste caso, deve-se testar a igualdade t2.cestr = t1.cprim (ou vice-
versa, a ordem não importa)
34
SELECT – uso do WHERE
• Obter o nome de cada cidade, bem como o nome cada 
hotel dela e quantas estrelas tem.
– O nome da codade está na tabela cidade
– O nome ddo hotel e o número de estrelas estão na tabela hotel
– 2 tabelas, JUNÇÃO!
– A tabela hotel possui chave estrangeira para a tabela cidade, ou 
vice-versa? SIM, hotel.cidade  cidade.codcidade (chave primaria)
SELECT ci.nomecidade, ht.nome, ht.estrelas
FROM hospedagem.cidade as ci, hospedagem.hotel as ht
WHERE ci.codcidade = ht.cidade
35
SELECT – uso do WHERE
• Outra estilo para a mesma consulta
SELECT ci.nomecidade, ht.nome, ht.estrelas
FROM hospedagem.cidade as ci JOIN 
 hospedagem.hotel as ht ON 
 ci.codcidade = ht.cidade
36
SELECT – uso do WHERE
• Se, nas 2 tabelas, houver campos com o 
mesmo nome, deve-se colocar tabela.campo 
para evitar ambiguidades
• É possível renomear (criar aliases) para as 
tabelas, usando ‘as’. Exemplo, hotel as ht
37
SELECT – uso do WHERE
• Se funciona para 2 tabelas, funciona para 
3
– Para cada reserva, obter sua data, o número 
do quarto, o nome do hotel reservado e o 
valor da diária
SELECT ht.nome, qt.numero, qt.valor_diaria, rs.data
FROM hospedagem.hotel ht, hospedagem.quarto qt, 
 hospedagem.reserva rs
WHERE (ht.codigo = qt.codhotel) AND 
 (qt.codhotel = rs.hotel) AND 
 (qt.numero = rs.quarto) 
38
SELECT – uso do WHERE
• É possível combinar os dois tipos de 
WHERE (condição e junção)
– Obter as datas em que há reserva de hotel 
para o hóspede Rafael e o número de diárias 
reservadas
SELECT rs.data, rs.diarias
FROM hospedagem.reserva rs, hospedagem.hospede hs
WHERE hs.nome = (‘Rafael’) AND 
(rs.codcliente = hs.codcliente)
39
Exercícios
Usando o banco de dados (esquema) filmes, faça as seguintes 
consultas
1.Obter o nome, ano de nascimento e nacionalidade de cada ator.
2.Obter o título dos filmes feitos após 2005.
3.Obter a soma da bilheteria dos filmes de 2008
4.Obter o nome de cada ator juntamente com o nome dos 
personagens que ele interpretou.
5.Obter o título dos filmes do gênero Policial 
6.Obter o nome dos personagens protagonistas interpretados por 
atores que tenham nascido antes de 1970. 
7.Obter o nome dos filmes em que o ator George Clooney atuou.
40
SELECT – Consultas aninhadas
• Quando as colunas a serem mostradas como resultado 
de uma consulta provém de uma tabela, mas a condição 
de seleção vem de outra, o mais natural é usar 
consultas aninhadas
– Obter as datas em que há reserva de hotel para o hóspede 
Rafael e o número de diárias reservadas
SELECT rs.data, rs.diarias
FROM hospedagem.reserva rs
WHERE rs.codcliente IN (
SELECT hs.codcliente
FROM hospedagem.hospede hs
WHERE hs.nome = (‘Rafael’))
41
SELECT – Consultas aninhadas
• Também se usam quando queremos exibir uma 
coluna resultante de consulta que utiliza uma 
função SQL, mas que não é a coluna usada na 
função
– Obter o nome do hotel com mais estrela
SELECT codigo, nome
FROM hospedagem.hotel
WHERE estrelas = (
SELECT max(estrelas)
FROM hospedagem.hotel)
42
SELECT – Consultas aninhadas
• Ou ainda quando se deve usar 
quantificadores universal ou existencial
– Obter o nome dos hóspedes com ao menos 1 
reserva com mais de 2 diárias
SELECT hs.nome
FROM hospedagem.hospede hs
WHERE EXISTS (
SELECT *
FROM hospedagem.reserva rs 
WHERE (rs.codcliente = hs.codcliente) AND 
(rs.diarias > 2))
43
SELECT – Consultas aninhadas
– Obter o nome dos hotéis que não tem 
nenhuma reserva para o dia 2011-11-15
SELECT ht.codigo, ht.nome
FROM hospedagem.hotel ht
WHERE NOT EXISTS (
SELECT *
FROM hospedagem.reserva rs, hospedagem.quarto qt
WHERE((ht.codigo = qt.codhotel) AND 
 (qt.codhotel = rs.hotel) AND 
 (qt.numero = rs.quarto) AND
(rs.data = '2011-11-15')))
44
SELECT – Consultas aninhadas
• Pode-se combinar um quantificador existencial (EXISTS) 
ou universal (NOT EXISTS) com outras condições no 
where
– Obter o nome dos hoteis da cidade de ‘Gramado’ que não 
tiveram o ‘Lucas’ como hóspede
SELECT ht.nome
FROM hospedagem.hotel ht, hospedagem.cidade ci
WHERE (ht.cidade = ci.codcidade) AND (ci.nomecidade = 'Gramado') AND 
 
 NOT EXISTS (
SELECT *
FROM hospedagem.reserva rs, hospedagem.quarto qt, 
 hospedagem.hospede hs
WHERE (hs.nome = 'Lucas')AND(rs.codcliente = hs.codcliente)AND
 (ht.codigo = qt.codhotel)AND(qt.codhotel = rs.hotel)AND 
 (qt.numero = rs.quarto))
45
SELECT - Junção
• Opções de junção
– tabela1 [INNER] JOIN tabela2 ON condição
• Chamado de junção interna
• Equivale ao WHERE como visto anteriormente
– tabela1 FULL [OUTER] JOIN tabela2 ON condição
– tabela1 LEFT [OUTER] JOIN tabela2 ON condição
– tabela1 RIGHT [OUTER] JOIN tabela2 on condição
46
SELECT – Junção externa
• Pode acontecer de, quando formos consultar mais de 
uma tabela, queremos que os registros de uma (ou de 
ambas) sejam retornados mesmo se não tiverem 
respectivos na outra tabela
– Obter o nome de cada hotel e, caso ele tenha quartos 
reservados para a data de 2011-11-15, mostrar também quais 
são os quartos reservados e o número de diárias reservadas.
• Nestes casos, deve-se executar a operação de junção 
externa (Outer-join).
– Mantém todos os registros de uma das tabela do join, e associa 
os campos dos respectivos registros da tabela da direita, se 
hoverem. Se não houver, coloca null para estes campos.
47
SELECT – Junção externa
• Existem 3 tipos de outer join
– Esquerda: Mantém todos os registros da tabela a 
esquerdae coloca somente aqueles relacionados da 
tabela da direita.
– Direita: Mantém todos os registros da tabela a direita 
e coloca somente aqueles relacionados da tabela da 
esquerda.
– Completo: Mantém os registros de ambas as tabelas. 
Se eles forem relacionados, junta. Se não, coloca 
NULL nos respectivos campos.
48
Junção externa – Sintaxe
• Padrão SQL/2
• No Oracle
• No SQL Server
SELECT campos
FROM
 TABELA1
 LEFT | RIGHT | FULL JOIN
 TABELA 2
 ON TABELA1.Campo = Tabela2.Campo
SELECT campos
FROM TABELA1, TABELA2
WHERE TABELA1.Campo = TABELA2.Campo(+)
SELECT campos
FROM TABELA1, TABELA2
WHERE TABELA1.Campo *= TABELA2.Campo
49
Junção externa
• Equi-junção
– Quando a comparação for por igualdade, 
pode-se substituir o ON por USING
• Natural join
– Quando os campos de junção (chave 
estrangeira e primárias) de ambas as tabelas 
tiverem o mesmo nome, pode-se usar 
NATURAL left|right|full JOIN 
50
Junção externa – Exemplo
• Obter o nome de cada cidade e caso ela tenha 
algum hotel com 5 estrelas, mostrar também o 
nome do hotel.
SELECT ci.nomecidade, ht.nome
FROM hospedagem.cidade ci LEFT JOIN hospedagem.hotel ht 
ON ht.cidade = ci.codcidade AND 
ht.estrelas = 5
51
Junção externa – Exemplo
• Obter o nome de cada hotel e seus quartos. Caso o 
quarto tenha alguma reserva, mostrar a data da reserva, 
o número de diárias e o nome do hóspede.
SELECT ht.nome, qt.numero, rs.data, rs.diarias, hs.nome
FROM (hospedagem.hotel ht JOIN hospedagem.quarto qt ON 
ht.codigo = qt.codhotel) 
LEFT JOIN 
(hospedagem.reserva rs JOIN hospedagem.hospede hs 
ON rs.codcliente = hs.codcliente) 
ON (rs.quarto,rs.hotel) = (qt.numero,qt.codhotel)
52
SELECT – GROUP BY e HAVING
• Quando deseja-se agrupar os resultados, 
pode-se usar funções de grupo
– GROUP BY: Cria os agrupamentos, pelo 
campo escolhido
– HAVING: Filtra os grupos. É como se fosse o 
WHERE para o GROUP BY. Sempre deve 
ser feito com uma função de agrupamento
53
SELECT – Group By
• Mostrar, para cada cidade, quantos hotéis 
ela tem
 SELECT ci.nomecidade, count(*)
FROM hospedagem.hotel ht, hospedagem.cidade ci
WHERE ht.cidade = ci.codcidade
GROUP BY ci.nomecidade
54
SELECT – Group By
• Listar o numero de diárias reservadas que 
cada hotel possui
 SELECT ht.nome, sum(rs.diarias)
FROM hospedagem.hotel ht JOIN hospedagem.quarto qt ON
 ht.codigo = qt.codhotel JOIN hospedagem.reserva rs ON 
 rs.hotel = qt.codhotel AND rs.quarto = qt.numero
GROUP BY ht.nome
55
SELECT – Group By e Having
• Obter o numero de reservas de cada 
hotel, mas somente para aqueles hotéis 
com mais de 2 reservas
SELECT ht.nome, count(*)
FROM hospedagem.hotel ht JOIN hospedagem.quarto qt ON 
 ht.codigo = qt.codhotel JOIN hospedagem.reserva rs ON 
 rs.hotel = qt.codhotel AND rs.quarto = qt.numero
GROUP BY ht.nome
HAVING count(*) > 2
56
SELECT – Group By e Having
• Obter o numero de reservas dos hotéis da 
cidade de Banto Gonçalves, mas somente para 
aqueles hotéis com mais de 2 reservas
SELECT ht.nome, count(*)
FROM hospedagem.hotel ht, hospedagem.quarto qt, 
hospedagem.reserva rs, hospedagem.cidade ci 
WHERE ht.codigo = qt.codhotel AND 
rs.hotel = qt.codhotel AND 
rs.quarto = qt.numero AND 
ht.cidade = ci.codcidade AND 
ci.nomecidade = 'Bento Gonçalves'
GROUP BY ht.nome
HAVING count(*) > 2
57
Exercícios
Esquema: viagem
58
Exercícios
1. Obter o nome de cada cidade cadastrada
2. Obter o número do passaporte e idade da passageira chamada 
Debora
3. Obter o nome completo, o numero do passaporte e a idade dos 
passageiros que tiverem ‘Paulo’ no nome
4. Obter o nome de cada cidade associado com o nome do seu país
5. Obter uma listagem completa das viagens feitas pela passageira 
‘Renata’
6. Obter, para cada viagem da passageira Carolina, o nome da 
cidade de origem e o nome da cidade de destino, juntamente 
com o país de origem e o país de destino
7. Obter o nome das cidades cadastradas que pertencem ao país 
‘Brasil’  resolver com consultas aninhadas
59
Exercícios
8. Obter o nome do(s) passageiro(s) que fez a(s) viagen(s) que dá 
mais milhas
9. Obter o nome do(s) passageiro(s) que não efetuaram nenhuma 
viagem em setembro (mês 9)
10. Obter o nome dos passageiros com pelo menos uma viagem nos 
meses de agosto ou setembro
11. Obter o nome de cada passageiro bem como a cidade de origem 
e a cidade de destino de cada viagem que ele fez em março. Se 
ele não tiver viajado neste mês, deve aparecer na lista igual, mas 
sem as viagens
12. Obter o número de viagens feitas por cada passageiro
13. Obter o total de milhas voadas pela passageira ‘Renata’
14. Obter o total de milhas voadas por cada passageiro, se o número 
de viagens for maior que 3.
Subqueries avançadas
• Obter a média de reservas por dia entre 
todos os hotéis
60
SELECT avg(count(*))
FROM hospedagem.reserva
GROUP BY data
???
Subqueries avançadas
• Obter a média de reservas por dia entre 
todos os hotéis
– Deve-se utilizar subqueries, para poder 
aplicar uma função sobre um campo de uma 
tabela
61
SELECT avg(reservas)
FROM (
SELECT count(*) as reservas
FROM hospedagem.reserva
GROUP BY data) as reservas_por_dia;
Subqueries avançadas
• Obter o nome do hotel que tem mais diárias reservadas, 
mostrando o número de diárias
62
SELECT ht.nome, sum(diarias)
FROM hospedagem.hotel ht, hospedagem.quarto qt, hospedagem.reserva rs
WHERE (qt.codhotel = ht.codigo) AND
 ((qt.codhotel,qt.numero)=(rs.hotel,rs.quarto))
GROUP BY ht.nome
HAVING sum(diarias) = (
 SELECT max(diarias_total)
 FROM
 (SELECT ht.nome, sum(diarias) as diarias_total
 FROM hospedagem.hotel ht, hospedagem.quarto qt,
 hospedagem.reserva rs
 WHERE (qt.codhotel = ht.codigo) AND ((qt.codhotel,qt.numero) = 
 (rs.hotel,rs.quarto))
 GROUP BY ht.nome) as diarias_hotel)
Union
• Usado quando queremos “juntar” (unir) os 
registros de 2 tabelas / consultas A e B
– Não com junção, pois não é associar registros
– Tabelas/consultas A e B devem ter o mesmo número 
de colunas selecionadas
– Tipo da i-ésima coluna da tabela/consulta A deve ser 
o mesmo tipo da i-ésima coluna da tabela/consulta B
– Nomes não precisam ser os mesmos  costuma 
prevalecer o nome da primeira consulta/tabela
63
Union – exemplo
codcurso titulo horas data_inicio dia
ce01 XML 24 15-12-2011 2N
ce02 Java básico 30 20-02-2012 4N
ce03 Jquery 16 10-08-2012 7M
ce04 Oracle 28 05-11-2012 3N
coddisc nome horas
d01 BD I 60
d02 BD II 60
d03 Padrões Web 30
64
coddisc codturma dia_semana
d01 A 4N
d01 B 6N
d01 C 7M
d02 A 2N
d03 A 5V
Tabela curso_extensao
Tabela disciplina
Tabela turma
FK
Union – Exemplo
• Obter o nome, carga horária e dia da semana de cada 
aula, seja ela curso de extensão ou disciplina
65
SELECT e.titulo as nome, e.horas, e.dia as dia_da_semana
FROM curso_extensao as e
UNION
SELECT d.nome, d.horas, t.dia_semana
FROM disciplina as d, turma as t
WHERE d.coddisc = t.coddisc 
Union – Exemplo
• Obter o nome, carga horária e dia da semana de cada 
aula, seja ela curso de extensão ou disciplina. Se for 
curso de extensão, apresentar ainda a data de início.
66
SELECT e.titulo as nome, e.horas, e.dia as dia_da_semana, 
e.data_inicio
FROM curso_extensao as e
UNION
SELECT d.nome, d.horas, t.dia_semana, NULL
FROM disciplina as d, turma as t
WHERE d.coddisc = t.coddisc 
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24
	Slide 25
	Slide26
	Slide 27
	Slide 28
	Slide 29
	Slide 30
	Slide 31
	Slide 32
	Slide 33
	Slide 34
	Slide 35
	Slide 36
	Slide 37
	Slide 38
	Slide 39
	Slide 40
	Slide 41
	Slide 42
	Slide 43
	Slide 44
	Slide 45
	Slide 46
	Slide 47
	Slide 48
	Slide 49
	Slide 50
	Slide 51
	Slide 52
	Slide 53
	Slide 54
	Slide 55
	Slide 56
	Slide 57
	Slide 58
	Slide 59
	Slide 60
	Slide 61
	Slide 62
	Slide 63
	Slide 64
	Slide 65
	Slide 66

Outros materiais