.:: ELC119 - Fundamentos de Bancos de Dados ::.

Aluno: Lucas Antunes Tambara
Matrícula: 2710246
E-mail: ltambara@inf.ufsm.br
Disciplina: Fundamentos de Bancos de Dados (ELC119)
Semestre: 2/2008

.:: Consultas com sub-consultas em SQL ::.

Enunciados: link.

Resolução:


-Encontrar nomes de cervejas que nenhuma pessoa bebe.
SELECT cerveja.nome FROM cerveja WHERE NOT EXISTS (SELECT bebe.cerveja FROM bebe WHERE cerveja.nome = bebe.cerveja);

-Encontrar pessoas que bebem cerveja mas não freqüentam bares.
SELECT bebe.pessoa FROM bebe WHERE NOT EXISTS (SELECT frequenta.pessoa FROM frequenta WHERE bebe.pessoa = frequenta.pessoa);

-Encontrar cervejas vendidas abaixo do preço médio.
SELECT v1.cerveja FROM vende AS v1 , (SELECT AVG(preco) AS media FROM vende) AS v2 WHERE v1.preco < v2.media

-Obter, para cada bar, o total de pessoas (clientes) que o freqüentam.
SELECT bar, COUNT(pessoa) FROM frequenta GROUP BY bar;

-Encontrar bares que vendem pelo menos uma cerveja que 'Fulano' bebe.
SELECT vende.bar FROM (bebe JOIN vende ON bebe.cerveja = vende.cerveja) WHERE bebe.pessoa='Fulano';

-Encontrar as cervejas vendidas pelo mais baixo preço.
SELECT v1.cerveja FROM vende AS v1, (SELECT MIN(preco) AS minimo FROM vende) AS v2 WHERE v1.preco = v2.minimo;

-Encontrar nomes de fabricantes de cada cerveja que 'Fulano' bebe.
SELECT cerveja.fabricante FROM cerveja WHERE EXISTS (SELECT cerveja FROM bebe WHERE pessoa='Fulano' AND cerveja.nome = bebe.cerveja);

-Encontrar cervejas que são o único produto de seu fabricante.
SELECT c1.nome FROM cerveja AS c1, (SELECT fabricante, COUNT(fabricante) AS quantidade FROM cerveja GROUP BY fabricante) AS c2 WHERE c2.quantidade=1 AND c2.fabricante=c1.fabricante;

-Encontrar bares que sao frequentados por Fulano OU que vendem cerveja a menos de R$ 2,00.
(SELECT bar FROM frequenta WHERE pessoa = 'Fulano') UNION (SELECT bar FROM vende WHERE preco<2.00);

-Encontrar pessoas e cervejas tal que: a pessoa bebe a cerveja E a pessoa freqüenta um bar que vende a cerveja.
(SELECT * FROM bebe) INTERSECT (SELECT frequenta.pessoa, vende.cerveja FROM frequenta JOIN vende ON frequenta.bar = vende.bar);

-Encontrar cervejas do fabricante 'Ambev' que NÃO são vendidas no bar 'Bar BQ'.
(SELECT nome AS cerveja FROM cerveja) EXCEPT (SELECT cerveja FROM vende WHERE bar='Bar BQ');

-Por que a consulta abaixo provoca um erro? Como corrigi-lo?
SELECT pessoa FROM frequenta WHERE bar IN (SELECT * FROM vende);

-É preciso especificar uma coluna compatível com 'bar' na segunda seleção. Não se pode comparar uma coluna com uma tabela.
SELECT pessoa FROM frequenta WHERE bar IN (SELECT bar FROM vende);

-O que há de errado com a consulta abaixo?
(SELECT * FROM cerveja WHERE fabricante = 'Ambev') EXCEPT (SELECT * FROM vende WHERE bar='Bar BQ');

-As tabelas não são compatíveis.
Versão correta:
(SELECT nome AS cerveja FROM cerveja WHERE fabricante = 'Ambev') EXCEPT (SELECT cerveja FROM vende WHERE bar='Bar BQ');