Curso de Programação C#

William Ivanski

Lista de Exercícios Módulo III Capítulo 3 (Respostas)


COMPRAS: Baixe o banco de dados compras.db para resolver os exercícios de 1 a 12. As respostas serão consultas SQL, e não o retorno das consultas em si.

1) Encontre o nome das pessoas que compraram produtos eletrônicos.

select c.comprador
from compra c
inner join produto p
        on p.pnome = c.produto
where p.categoria = 'eletronicos'

2) Encontre o nome das pessoas que compraram produtos japoneses.

select c.comprador
from companhia co
inner join produto p
        on p.fabricante = co.cnome
inner join compra c
        on c.produto = p.pnome
where co.pais = 'Japao'

3) Encontre o nome das pessoas que compraram produtos japoneses e vivem em Curitiba.

select c.comprador
from companhia co
inner join produto p
        on p.fabricante = co.cnome
inner join compra c
        on c.produto = p.pnome
inner join pessoa pe
        on pe.nomepess = c.comprador
where co.pais = 'Japao'
  and pe.cidade = 'Curitiba'

4) Encontre o nome das pessoas que compraram E venderam alguma coisa.

select c.comprador
from compra c
inner join compra v
        on c.comprador = v.vendedor

5) Encontre o nome das pessoas que compraram produtos de "Pedro" ou produtos fabricados por uma companhia com valor de ação maior que $50.

--versão inicial
select x.comprador
from compra x
where x.vendedor = 'Pedro'
union
select x.comprador
from companhia c
inner join produto p
        on p.fabricante = c.cnome
inner join compra x
        on x.produto = p.pnome
where c.valoracao > 50

-- versão otimizada
select x.comprador
from companhia c
inner join produto p
        on p.fabricante = c.cnome
inner join compra x
        on x.produto = p.pnome
where c.valoracao > 50
   or x.vendedor = 'Pedro'

6) Encontre o nome das pessoas que compraram produtos japoneses, mas que não compraram produtos brasileiros.

select x.comprador
from companhia c
inner join produto p
        on p.fabricante = c.cnome
inner join compra x
        on x.produto = p.pnome
where c.pais = 'Japao'
except
select x.comprador
from companhia c
inner join produto p
        on p.fabricante = c.cnome
inner join compra x
        on x.produto = p.pnome
where c.pais = 'Brasil'

7) Encontre o nome das pessoas que compraram produtos japoneses e brasileiros.

select b.comprador
from (
    select x.comprador
    from companhia c
    inner join produto p
            on p.fabricante = c.cnome
    inner join compra x
            on x.produto = p.pnome
    where c.pais = 'Japao'
) j
inner join (
    select x.comprador
    from companhia c
    inner join produto p
            on p.fabricante = c.cnome
    inner join compra x
            on x.produto = p.pnome
    where c.pais = 'Brasil'
) b
on b.comprador = j.comprador

8) Encontre o nome e a cidade onde moram as pessoas que são as únicas moradoras desta cidade cadastradas no sistema.

-- versão inicial
select t.*
from pessoa t
where t.cidade in (
    select cidade
    from (
        select p.cidade,
               count(*) as num_moradores
        from pessoa p
        group by p.cidade
        having count(*) = 1
    ) x
)

-- versão otimizada
select t.nomepess
from pessoa t
inner join (
    select p.cidade,
           count(*) as num_moradores
    from pessoa p
    group by p.cidade
    having count(*) = 1
) x
on x.cidade = t.cidade

9) Encontre o nome das pessoas que tenham outros moradores da mesma cidade cadastrados no sistema.

select t.nomepess
from pessoa t
inner join (
    select p.cidade,
           count(*) as num_moradores
    from pessoa p
    group by p.cidade
    having count(*) > 1
) x
on x.cidade = t.cidade

10) Para cada vendedor, escreva seu nome e a soma das vendas realizadas.

select c.vendedor,
       sum(p.preco) as total_vendas
from compra c
inner join produto p
        on p.pnome = c.produto
group by c.vendedor

11) Para cada comprador, escreva seu nome e a média de compras realizadas por categoria de produto.

select c.comprador,
       p.categoria,
       avg(p.preco) as media_compras
from compra c
inner join produto p
        on p.pnome = c.produto
group by c.comprador,
         p.categoria

12) Para cada categoria de produto, obter seu nome, sua média de preços, maior e menor preço.

select p.categoria,
       avg(p.preco) as media,
       max(p.preco) as maior,
       min(p.preco) as menor
from produto p
group by p.categoria

ESCOLA: Baixe o banco de dados escola.db para resolver os exercícios de 13 a 24. As respostas serão consultas SQL, e não o retorno das consultas em si.

13) Encontre o nome de todos os alunos do segundo ano que estão matriculados em uma disciplina ministrada pela professora "Ivana S.".

select a.nomealu
from professor p
inner join disciplina d
        on d.idprof = p.idprof
inner join matricula m
        on m.nomedisc = d.nome
inner join aluno a
        on a.numalu = m.numalu
where p.nomeprof = 'Ivana Silva'

14) Encontre a idade do aluno mais velho que seja do curso de "História" ou que esteja matriculado em uma disciplina ministrada por "Ivana S.".

select max(idade)
from (
select a.idade
from aluno a
where a.curso = 'Historia'
union
select a.idade
from professor p
inner join disciplina d
        on d.idprof = p.idprof
inner join matricula m
        on m.nomedisc = d.nome
inner join aluno a
        on a.numalu = m.numalu
where p.nomeprof = 'Ivana Silva'
)

15) Encontre o nome das disciplinas que estejam alocadas na sala "R128" ou que tenham mais de 5 alunos matriculados.

16) Encontre o nome dos alunos matriculados em disciplinas que tenham horários que coincidem.

17) Encontre o nome dos professores que lecionam em todas as salas utilizadas por alguma disciplina.

18) Encontre o nome dos professores cuja soma total de alunos matriculados em suas disciplinas seja menor que 5.

19) Para alunos de cada ano (independente do curso), escreva o ano e a média de idade dos alunos daquele ano.

20) Para alunos de cada, exceto do ano 2, escreva o ano e a média de idade dos alunos daquele ano.

21) Para cada professor que leciona disciplinas somente na sala "R128", escreva o nome do professor e a quantidade de disciplinas que ele leciona.

22) Encontre o nome dos alunos matriculados na quantidade máxima de disciplinas. Ou seja, se algum aluno está matriculado em 5 disciplinas e não existe nenhum outro que esteja matriculado em mais de 5 disciplinas, a consulta deve retornar todos os alunos matriculados em 5 disciplinas.

23) Encontre o nome dos alunos que não estão matriculados em nenhuma disciplina.

24) Para cada idade de aluno, encontre o ano em que se encontra a maioria dos alunos naquela idade. Por exemplo, se a maioria dos alunos com 18 anos está no segundo ano, a consulta deve retornar (18,2).