Eu fiz os exercícios e o curso adaptando para o PostgreSQL, por isso pode estar um pouco diferente para quem estava usando SQLite Online.
-- 1) Traga todos os dados da cliente Maria Silva.select * from clientes where nome = 'Maria Silva';
-- 2) Busque o ID do pedido e o ID do cliente dos pedidos onde o status esteja como entregue.
select
p.id as idpedido,
p.idcliente,
p.status
from pedidos p
join clientes c on c.id = p.idcliente
where status = 'Entregue';
-- 3) Retorne todos os produtos onde o preço seja maior que 10 e menor que 15.
select * from produtos
where preco between 10.01 and 14.99;
-- 4) Busque o nome e cargo dos colaboradores que foram contratados entre 2022-01-01 e 2022-06-30.
select * from colaboradores
where datacontratacao between '2022-01-01' and '2022-06-30';
-- 5) Recupere o nome do cliente que fez o primeiro pedido.
select
c.nome
from pedidos p
join clientes c on c.id = p.idcliente
order by datahorapedido asc
limit 1;
-- 6) Liste os produtos que nunca foram pedidos.
select
p.nome as produto,
coalesce(sum(i.quantidade), 0) as total_pedidos
from itenspedidos i
right join produtos p on p.id = text(i.idproduto)
group by p.nome
having sum(i.quantidade) is null;
-- 7) Liste os nomes dos clientes que fizeram pedidos entre 2023-01-01 e 2023-12-31.
select
p.idcliente,
c.nome as nome_cliente
from pedidos p
join clientes c on c.id = p.idcliente
where date(datahorapedido) between '2023-01-01' and '2023-12-31'
group by p.idcliente, c.nome;
-- 8) Recupere os nomes dos produtos que estão em menos de 15 pedidos.
select
p.nome as produtos,
case
when sum(i.quantidade) is null then 0
else sum(i.quantidade)
end as total_pedidos
from itenspedidos i
right join produtos p on p.id = text(i.idproduto)
group by p.nome
having sum(i.quantidade) < 15 or sum(i.quantidade) is null;
-- 9) Liste os produtos e o ID do pedido que foram realizados pelo cliente "Pedro Alves" ou pela cliente "Ana Rodrigues".
select
c.nome as nome_cliente,
ip.idpedido,
pr.nome as produto
from itenspedidos ip
join produtos pr on text(ip.idproduto) = pr.id
join pedidos pe on pe.id = ip.idpedido
join clientes c on c.id = pe.idcliente
where c.nome in ('Pedro Alves', 'Ana Rodrigues')
order by c.nome;
-- 10) Recupere o nome e o ID do cliente que mais comprou(valor) no Serenatto.
select
*
from (
select
c.nome,
sum(ip.quantidade * ip.precounitario) as valor_total
from itenspedidos ip
join pedidos pe on pe.id = ip.idpedido
join clientes c on c.id = pe.idcliente
group by c.nome
)
order by valor_total desc
limit 1;
-- Optei por criar uma subquery para fazer a ordenação e limitação separado e não ter que passar o método de agregação no ORDER BY. Isso não é uma boa prática pois nem todo SQL comporta essa leitura.