@@ -1676,70 +1676,106 @@ INSERT INTO Order_Items (id_order, id_product, quantity, unit_value) VALUES (
16761676
16771677## 13. SQL Simple Queries
16781678
1679- -- 1. Listar todos os clientes que não têm canal de aquisição definido (NULL)
1680- SELECT id_cliente, nome, canal_aquisicao
1679+ 1 . List all clients with no acquisition channel defined (NULL)
1680+
1681+ ``` sql
1682+ SELECT id_cliente, nome, canal_aquisicao
16811683FROM Clientes
16821684WHERE canal_aquisicao IS NULL ;
1685+ ```
16831686
1684- -- 2. Listar os 10 clientes mais recentes (por ordem decrescente de data de criação)
1687+ 2 . List the 10 most recently created clients (descending by creation date)
1688+
1689+ ``` sql
16851690SELECT id_cliente, nome, data_criacao
16861691FROM Clientes
16871692ORDER BY data_criacao DESC
16881693LIMIT 10 ;
1694+ ```
16891695
1690- -- 3. Mostrar todos os produtos cujo nome contém "Gold"
1696+ 3 . Show all products whose name contains "Gold"
1697+
1698+ ``` sql
16911699SELECT id_produto, designacao
16921700FROM Produtos
16931701WHERE designacao LIKE ' %Gold%' ;
1702+ ```
16941703
1695- -- 4. Listar produtos do tipo cerveja com preço entre 2.5 e 4.0 EUR
1704+ 4 . List beer products priced between 2.5 and 4.0 EUR
1705+
1706+ ``` sql
16961707SELECT id_produto, designacao, preco_venda
16971708FROM Produtos
16981709WHERE tipo_de_produto = ' cerveja'
16991710 AND preco_venda BETWEEN 2 .5 AND 4 .0
17001711ORDER BY preco_venda ASC ;
1712+ ```
17011713
1702- -- 5. Quantidade de clientes por canal de aquisição (GROUP BY e COUNT)
1714+ 5 . Count of clients by acquisition channel
1715+
1716+ ``` sql
17031717SELECT canal_aquisicao, COUNT (* ) AS total_clientes
17041718FROM Clientes
17051719GROUP BY canal_aquisicao
17061720ORDER BY total_clientes DESC ;
1721+ ```
17071722
1708- -- 6. Listar clientes cujo nome começa por "A"
1723+ 6 . List clients whose name starts with "A"
1724+
1725+ ``` sql
17091726SELECT id_cliente, nome
17101727FROM Clientes
17111728WHERE nome LIKE ' A%' ;
1729+ ```
17121730
1713- -- 7. Mostrar fornecedores com email que termina em ".pt"
1731+ 7 . Show suppliers with email ending in ".pt"
1732+
1733+ ``` sql
17141734SELECT id_fornecedor, nome_empresa
17151735FROM Fornecedores
17161736WHERE email LIKE ' %.pt' ;
1737+ ```
17171738
1718- -- 8. Listar encomendas pendentes de pagamento (AND/OR e DESC)
1739+ 8 . List orders pending payment (descending order date)
1740+
1741+ ``` sql
17191742SELECT id_encomenda, id_fornecedor, estado_pagamento, data_encomenda
17201743FROM encomendas
17211744WHERE estado_pagamento = ' pendente'
17221745ORDER BY data_encomenda DESC ;
1746+ ```
1747+
1748+ 9 . Show clients subscribed to newsletter and who authorized GDPR
17231749
1724- -- 9. Mostrar clientes que recebem newsletter e autorizaram GDPR
1750+ ``` sql
17251751SELECT id_cliente, nome
17261752FROM Clientes
17271753WHERE newsletter = 1 AND autorizacao = 1 ;
1754+ ```
1755+
1756+ 10 . List products with stock below minimum level
17281757
1729- -- 10. Listar produtos com stock abaixo do mínimo
1758+ ``` sql
17301759SELECT id_produto, designacao, stock_atual, stock_minimo
17311760FROM Produtos
17321761WHERE stock_atual < stock_minimo;
1762+ ```
1763+
1764+ 11 . Distinct products of type "snacks"
17331765
1734- -- 11. Produtos distintos do tipo “snacks”
1766+ ``` sql
17351767SELECT DISTINCT designacao, tipo_de_produto
17361768FROM Produtos
17371769WHERE tipo_de_produto = ' snacks' ;
1770+ ```
1771+
1772+ 12 . Show employees whose phone does NOT start with "91"
17381773
1739- -- 12. Mostrar todos os funcionários cujo telemóvel NÃO começa por “91”
1774+ ``` sql
17401775SELECT id_funcionario, nome, nr_telemovel
17411776FROM Funcionarios
17421777WHERE NOT nr_telemovel LIKE ' 91%' ;
1778+ ```
17431779
17441780-- 13. Clientes cujo NIF está entre 100000000 e 200000000 (BETWEEN)
17451781SELECT id_cliente, nome, nif
@@ -1892,22 +1928,22 @@ WHERE estado_pagamento IS 'pendente';
18921928SELECT DISTINCT canal_aquisicao
18931929FROM Clientes;
18941930
1895- SELECT
1931+ SELECT
18961932 moeda, -- Tipo de moeda usada no pagamento
18971933 COUNT(* ) AS total_pagamentos -- Contagem de pagamentos por moeda
18981934FROM Pagamentos -- Origem dos dados
18991935GROUP BY moeda -- Agrupa por moeda
19001936HAVING COUNT(* ) < 5; -- Filtra apenas moedas com menos de 5 pagamentos
19011937
19021938-- Listar fornecedores cujo nome inclua a palavra "brew", sem diferenciar maiúsculas de minúsculas
1903- SELECT
1939+ SELECT
19041940 id_fornecedor, -- ID do fornecedor
19051941 nome_empresa -- Nome da empresa fornecedora
19061942FROM Fornecedores -- Origem dos fornecedores
19071943WHERE nome_empresa ILIKE '%brew%'; -- Pesquisa sem considerar maiúsculas/minúsculas
19081944
19091945-- Lista os clientes que fizeram mais do que 3 compras concluídas e quanto gastaram no total
1910- SELECT
1946+ SELECT
19111947 id_cliente, -- ID do cliente
19121948 COUNT(* ) AS total_compras, -- Nº total de compras
19131949 ROUND(SUM(valor), 2) AS total_gasto -- Soma do valor total gasto
@@ -1918,18 +1954,18 @@ HAVING COUNT(*) > 1 -- Apenas quem comprou mais de
19181954ORDER BY total_compras DESC; -- Ordenar por quem mais comprou
19191955
19201956-- Lista os produtos com preço de venda entre 5€ e 15€, ordenados do mais caro para o mais barato
1921- SELECT
1957+ SELECT
19221958 id_produto, -- ID do produto
19231959 designacao, -- Nome/designação do produto
19241960 preco_venda -- Preço de venda do produto
19251961FROM Produtos -- Origem: tabela de produtos
19261962WHERE preco_venda BETWEEN 2 AND 3 -- Apenas produtos cujo preço está entre 2 e 3 euros
19271963ORDER BY preco_venda DESC; -- Ordena do preço mais alto para o mais baixo
1928-
1964+
19291965## 14. SQL Advanced Queries
19301966
19311967-- Seleciona os 10 clientes com maior número de compras (visitas)
1932- SELECT
1968+ SELECT
19331969 c.id_cliente, -- ID do cliente
19341970 c.nome, -- Nome do cliente
19351971 COUNT(p.id_pagamento) AS frequencia_visitas -- Conta o nº total de pagamentos realizados
@@ -1943,63 +1979,63 @@ ORDER BY frequencia_visitas DESC -- Ordena dos clientes mais frequentes para
19431979LIMIT 10; -- Mostra apenas os 10 primeiros resultados
19441980
19451981-- Seleciona os 10 clientes que mais compram em média (em unidades de produto por compra)
1946- SELECT
1982+ SELECT
19471983 c.id_cliente, -- ID do cliente
19481984 c.nome, -- Nome do cliente
1949- ROUND(AVG(qtd_por_compra), 2) AS volume_medio_consumo -- Média de unidades por compra
1985+ ROUND(AVG(qtd_por_compra), 2) AS volume_medio_consumo -- Média de unidades por compra
19501986 -- (arredondado a 2 casas decimais)
19511987FROM (
19521988 -- Subconsulta para calcular a quantidade total de produtos por compra
1953- SELECT
1989+ SELECT
19541990 p.id_cliente, -- ID do cliente
1955- SUM(ip.quantidade) AS qtd_por_compra -- Soma da quantidade de produtos comprados
1991+ SUM(ip.quantidade) AS qtd_por_compra -- Soma da quantidade de produtos comprados
19561992 -- nessa compra
19571993 FROM Pagamentos p
1958- JOIN Itens_Pagamento ip
1994+ JOIN Itens_Pagamento ip
19591995 ON p.id_pagamento = ip.id_pagamento -- Liga pagamento com os seus itens
1960- GROUP BY p.id_pagamento, p.id_cliente -- Agrupa por compra para calcular total de unidades
1996+ GROUP BY p.id_pagamento, p.id_cliente -- Agrupa por compra para calcular total de unidades
19611997 -- por transação
19621998) sub
1963- JOIN Clientes c ON c.id_cliente = sub.id_cliente -- Junta com a tabela de clientes para trazer
1999+ JOIN Clientes c ON c.id_cliente = sub.id_cliente -- Junta com a tabela de clientes para trazer
19642000-- os nomes
19652001GROUP BY c.id_cliente, c.nome -- Agrupa novamente para calcular a média por cliente
19662002ORDER BY volume_medio_consumo DESC -- Ordena dos que mais consomem para menos
19672003LIMIT 10; -- Mostra apenas os 10 primeiros resultados
19682004
19692005-- Seleciona os 10 clientes cuja última compra foi mais recente
1970- SELECT
2006+ SELECT
19712007 c.id_cliente, -- ID do cliente
19722008 c.nome, -- Nome do cliente
19732009 MAX(p.data_pagamento) AS ultima_compra -- Obtém a data mais recente de pagamento
19742010FROM Clientes c
1975- LEFT JOIN Pagamentos p
2011+ LEFT JOIN Pagamentos p
19762012 ON c.id_cliente = p.id_cliente -- Liga com a tabela de pagamentos
19772013GROUP BY c.id_cliente, c.nome -- Agrupa por cliente
19782014ORDER BY ultima_compra DESC -- Ordena da compra mais recente para a mais antiga
19792015LIMIT 10; -- Mostra apenas os 10 primeiros resultados
19802016
19812017-- Seleciona os 10 clientes que mais gastaram no total (€)
1982- SELECT
2018+ SELECT
19832019 c.id_cliente, -- ID do cliente
19842020 c.nome, -- Nome do cliente
19852021 ROUND(SUM(p.valor), 2) AS total_gasto -- Soma do valor total gasto (apenas compras concluídas)
19862022FROM Clientes c
1987- LEFT JOIN Pagamentos p
2023+ LEFT JOIN Pagamentos p
19882024 ON c.id_cliente = p.id_cliente
19892025 AND p.estado_pagamento = 'concluido' -- Filtra apenas pagamentos concluídos
19902026GROUP BY c.id_cliente, c.nome -- Agrupa por cliente
19912027ORDER BY total_gasto DESC -- Ordena do maior para o menor gasto
19922028LIMIT 10; -- Mostra apenas os 10 primeiros resultados
19932029
19942030-- Seleciona os 10 clientes com maior ticket médio por compra
1995- SELECT
2031+ SELECT
19962032 c.id_cliente, -- ID do cliente
19972033 c.nome, -- Nome do cliente
19982034 ROUND(AVG(p.valor), 2) AS media_consumo_compra -- Calcula o valor médio gasto por compra
19992035FROM Clientes c
2000- LEFT JOIN Pagamentos p
2036+ LEFT JOIN Pagamentos p
20012037 ON c.id_cliente = p.id_cliente
20022038 AND p.estado_pagamento = 'concluido' -- Apenas compras concluídas
20032039GROUP BY c.id_cliente, c.nome -- Agrupa por cliente
20042040ORDER BY media_consumo_compra DESC -- Ordena do maior valor médio para o menor
2005- LIMIT 10; -- Mostra apenas os 10 primeiros resultados
2041+ LIMIT 10; -- Mostra apenas os 10 primeiros resultados
0 commit comments