Você está na página 1de 41

Aula 1 - 02/06

Exemplos:

CREATE TABLE item_pedido(num_pedido int, num_item int, quantidade int,


PRIMARY KEY (num_pedido, num_item), FOREIGN KEY (num_pedido)
REFERENCES pedido(num_pedido), FOREIGN KEY (num_item) REFERENCES
item(num_item));
★ Cria tabela item_pedido, com chaves primarias num_pedido e num_item,
que também são estrangeiras.

INSERT INTO cliente(cidade, nome_cliente, num_cliente)


VALUES('Feliz','Tulio', 1);
★ Inserir valores em uma tabela já criada.

SELECT nome_cliente, cidade FROM cliente;


★ Consultar a coluna nome_cliente da tabela cliente.

SELECT cidade FROM cliente WHERE nome_cliente = 'Tulio';


★ Consulta a coluna cidade, da tabela cliente, onde o valor da coluna
nome_cliente for igual a Tulio.

SELECT * FROM cliente WHERE nome_cliente = 'Tulio';


★ Consulta todas as colunas da tabela cliente onde o valor da coluna
nome_cliente é igual a Tulio;

UPDATE cliente SET cidade = 'Bom Princípio' WHERE num_cliente = 2;


★ Muda o valor da tabela cidade para Bom Princípio onde o valor da coluna
num_cliente é igual 2;

DELETE FROM cliente WHERE num_cliente = 2;


★ Deleta tupla/linha (dados do cliente específico) onde o valor da coluna
num_cliente é igual a 2;
Exercícios:

- EXERCÍCIO 1:

https://moodle.feliz.ifrs.edu.br/pluginfile.php/160147/mod_resource/content/1/Ativida
de_RelacionandoTabelas.pdf

--------------------------------------------INSERÇÃO---------------------------------------------------------

INSERT INTO cliente (num_cliente, nome_cliente, cidade)


VALUES (2, 'Joao', 'Feliz');

INSERT INTO cliente (num_cliente,nome_cliente,cidade)


VALUES (3, 'Pedro', 'Caxias');

INSERT INTO item (num_item, descricao, preco_unitario) VALUES (123, 'TV LED
32', 900), (124, 'DVD', 100), (125, 'PS4', 1800), (126, 'Frigobar', 300);

INSERT INTO pedido (num_pedido, num_cliente, data_pedido) VALUES (1, 2,


"2013-06-08"), (2, 3, "2013-06-09"),
(3, 1, "2013-06-05");

INSERT INTO item_pedido (num_pedido, num_item, quantidade) VALUES (1, 123,


1), (1, 124, 1), (2, 126, 5), (3, 123, 2), (3, 125, 2);

--------------------------------------------------------------------------------------------------------------------

SELECT nome_cliente FROM cliente WHERE cidade = 'Feliz';

SELECT descricao FROM item WHERE preco_unitario > 500;

UPDATE item SET preco_unitario = 1500 WHERE descricao = 'Playstation 4';

DELETE FROM item WHERE num_item = 125;


E2
->SELECT nome_cliente, num_pedido, data_pedido FROM cliente JOIN pedido
WHERE nome_cliente = 'Tulio';

->SELECT nome_cliente, num_pedido, data_pedido FROM cliente JOIN pedido ON


cliente.num_cliente = pedido.num_cliente WHERE nome_cliente = 'Tulio';

1. SELECT num_pedido, data_pedido, nome_cliente FROM pedido JOIN


cliente ON pedido.num_cliente = cliente.num_cliente;
2. SELECT pedido.num_pedido, descricao, quantidade FROM pedido JOIN
item_pedido ON pedido.num_pedido = item_pedido.num_pedido JOIN
item ON item_pedido.num_item = item.num_item;
3. SELECT nome_cliente FROM cliente JOIN pedido ON cliente.num_cliente =
pedido.num_cliente JOIN item_pedido ON pedido.num_pedido =
item_pedido.num_pedido JOIN item ON item_pedido.num_item =
item.num_item WHERE item.descricao = 'TV LED 32';
4.

Aula 2 - 23/06

Lista Remota
1. SELECT Pnome, Datanasc, Dnome FROM funcionario JOIN departamento
ON funcionario.Dnr = departamento.Dnumero
ORDER BY Dnome, Datanasc;

2. SELECT DISTINCT Dnome FROM departamento JOIN funcionario ON


departamento.Dnumero = funcionario.Dnr WHERE Sexo = 'M';

3. SELECT Pnome, Unome FROM funcionario WHERE Pnome like '%a%' and
Unome like '%o';
4. SELECT Pnome, Salario, (Salario*1.25) possivelSalario FROM funcionario;

Aula 3 - 23/06

ativ exemplo 4 - 23/06


SELECT MIN(salario), MAX(salario), AVG(salario)
FROM funcionario, departamento
WHERE funcionario.Dnr=departamento.Dnumero AND
departamento.Dnome="Administração";

exemplo 5
SELECT COUNT(Pnome) FROM funcionario;

ex 6
SELECT COUNT(Pnome)
FROM funcionario
WHERE Sexo = "F";

Outros exemplos
SELECT departamento.Dnome, SUM(funcionario.Salario)
FROM funcionario JOIN departamento on funcionario.Dnr=departamento.Dnumero
WHERE sexo="M"
GROUP BY departamento.Dnome;

SELECT departamento.Dnome, SUM(funcionario.salario) somaSalario


FROM funcionario
JOIN departamento on funcionario.dnr=departamento.Dnumero
WHERE sexo='M'
GROUP BY departamento.Dnome
HAVING SUM(funcionario.salario) > 100000;
// ou HAVING somaSalario > 100000;

EXERCÍCIOS 23/06

https://docs.google.com/document/d/1oBFj6L24TYI7HcUmYfVGf-Pi2GsSeClHSPBk
Gj1iTcA/edit?usp=sharing

1. Recuperar o nome dos funcionários que tem salário maior que ‘30.000’.
SELECT Pnome FROM funcionario
WHERE Salario > 30000;
2. Recuperar o nome dos funcionários que tem salário menor que ‘30.000’ e que
seja do sexo feminino.

SELECT Pnome
FROM funcionario
WHERE Salario < 30000 AND Sexo ="F";

OUTRA RESOLUÇÂO
SELECT Pnome
FROM `funcionario` f
WHERE f.Salario > 30000 and f.Sexo='F';

3. Listar a soma total dos salários por sexo.


SELECT Sexo, SUM(Salario) salarioTotal
FROM funcionario
GROUP BY Sexo;

4. Listar o menor, o maior e a média dos salários por departamento.


SELECT Dnome, MIN(Salario), MAX(Salario), AVG(Salario)
FROM funcionario JOIN departamento ON funcionario.dnr = departamento.Dnumero
GROUP BY Dnome;

OUTRA RESOLUÇÃO

SELECT Dnome, MIN(salario), MAX(salario), AVG(salario)


FROM departamento d
JOIN funcionario f ON d.Dnumero = f.Dnr
GROUP BY d.Dnome;

5. Retornar a quantidade de dependentes por sexo.


SELECT Sexo, COUNT(Nome_dependente)
FROM dependente
GROUP BY Sexo;

6. Retornar a quantidade de dependentes por sexo do funcionário.


SELECT funcionario.Sexo, COUNT(Nome_dependente)
FROM dependente JOIN funcionario ON dependente.Fcpf = funcionario.Cpf
GROUP BY funcionario.Sexo;
7. Recuperar o nome e o endereço de todos os funcionários que trabalham para o
departamento de ‘Pesquisa’.
SELECT Pnome, Endereco
FROM funcionario JOIN departamento ON funcionario.Dnr =
departamento.Dnumero
WHERE Dnome = "Pesquisa";

ATIVIDADE 2

https://docs.google.com/document/d/1maCPusfiuj-XiCxvMzmFjnE5HTkkTj76JD9zJh
kS7mY/edit?usp=sharing

1. Retornar a quantidade de projetos por departamento.


SELECT Dnome, COUNT(Projnome)
FROM projeto JOIN departamento ON projeto.Dnum = departamento.Dnumero
GROUP BY Dnome;

2. Listar os nomes dos funcionários que trabalham em dois ou mais projetos.


SELECT Pnome FROM funcionario JOIN trabalha_em ON trabalha_em.Fcpf =
funcionario.Cpf JOIN projeto ON projeto.Projnumero = trabalha_em.Pnr GROUP BY
Cpf HAVING COUNT(Fcpf) >=2;

ATIVIDADE 3
https://docs.google.com/document/d/1PE_QLLbQG9fskXKbgsmOopSMfQdkPTe_ZU
EbQewnHZU/edit?usp=sharing

1. Para cada projeto localizado em ‘Mauá’, liste o número do projeto, o número do


departamento que o controla e o último nome, endereço e data de nascimento do
gerente do departamento.

SELECT Projnumero, Dnum, Unome, Endereco, Datanasc FROM


projeto JOIN departamento ON projeto.Dnum =
departamento.Dnumero JOIN funcionario ON funcionario.Dnr =
departamento.Dnumero WHERE Projlocal = "Mauá" AND Cpf_gerente
= Cpf;

2. Listar os nomes dos funcionários com dois ou mais dependentes.

SELECT Pnome FROM funcionario JOIN dependente ON dependente.Fcpf =


funcionario.Cpf
GROUP BY Cpf
HAVING COUNT(Fcpf) >=2;
3. Recuperar os nomes de todos os funcionários do departamento número 5 que
trabalham mais de 10 horas por semana no ‘ProdutoX’.
SELECT Pnome FROM funcionario JOIN departamento ON
departamento.Dnumero = funcionario.Dnr JOIN projeto ON
projeto.Dnum = departamento.Dnumero JOIN trabalha_em ON
trabalha_em.Pnr = projeto.Projnumero WHERE Projnome =
'ProdutoX' AND Horas > 10 AND Dnum = 5 GROUP BY Pnome;

4. Liste os nomes de todos os funcionários que tem um dependente com o primeiro


nome igual ao seu.

SELECT Pnome FROM funcionario JOIN dependente ON


dependente.Fcpf = funcionario.Cpf WHERE Pnome =
Nome_dependente;

5. Para cada projeto, liste o nome do projeto e o total de horas por semana (por
todos os funcionários) gastas nesse projeto.

SELECT projNome, SUM(Horas) FROM projeto JOIN trabalha_em ON


trabalha_em.Pnr = projeto.Projnumero
GROUP BY projNome;

6. Para cada departamento, recupere o nome do departamento e o salário médio


de todos os seus funcionários.

SELECT Dnome, AVG(Salario) FROM departamento JOIN funcionario ON


departamento.Dnumero = funcionario.Dnr
GROUP BY Dnome;

7. Recupere salário médio de todos os funcionários do sexo feminino.


SELECT Sexo, AVG(Salario) FROM funcionario WHERE Sexo = 'F';

Aula 4 - 30/06

LISTA 01 - 30/06/2023

1.Fazer uma lista dos números de projeto nos quais trabalham funcionários
cujo último nome seja ‘Silva’. A lista também deve conter os números dos
projetos que pertencem ao departamento “Pesquisa”. Uso obrigatório de
UNION ou UNION ALL para apresentar os números dos projetos,
considerando que eles não devem aparecer de forma repetida.

SELECT Projnumero FROM `projeto` JOIN funcionario ON funcionario.Dnr =


projeto.Dnum WHERE Unome = 'Silva' UNION SELECT Projnumero FROM
projeto JOIN departamento ON departamento.Dnumero = projeto.Dnum
WHERE Dnome = 'Pesquisa'; //jeito errado

SELECT Pnr FROM trabalha_em JOIN funcionario ON funcionario.Cpf =


trabalha_em.Fcpf WHERE Unome = 'Silva' UNION SELECT Projnumero
FROM projeto JOIN departamento ON departamento.Dnumero =
projeto.Dnum WHERE Dnome = 'Pesquisa'; jeito certo

2.Encontre o nome de todos os funcionários que nasceram entre '1960-01-01'


AND '1969-12-31'. Uso obrigatório do BETWEEN.

SELECT Pnome, Unome FROM `funcionario` WHERE Datanasc


BETWEEN '1960-01-01' AND '1969-12-31';

3. Recuperar o nome e o sobrenome dos funcionários que não possuem


dependentes. Uso obrigatório de IN ou NOT IN conforme necessidade.

SELECT Pnome, Unome FROM `funcionario`


WHERE Cpf NOT IN (SELECT Fcpf FROM dependente);

4. Recuperar a quantidade de funcionários por projeto, considerando apenas os


funcionários que tenham horas de trabalho associado ao projeto. Isso significa que
horas com valor em branco ou nulos não devem se contabilizados. Uso obrigatório
de IS NULL ou IS NOT NULL conforme necessidade.

SELECT COUNT(Fcpf) FROM `trabalha_em`


WHERE Horas IS NOT NULL
GROUP BY Pnr;

8. Para cada projeto localizado em ‘Mauá’, liste o número do projeto, o número do


departamento que o controla e o último nome, endereço e data de nascimento do
gerente do departamento.
SELECT Projnumero, Dnum, Unome, Endereco, Datanasc FROM
projeto JOIN departamento ON projeto.Dnum =
departamento.Dnumero JOIN funcionario ON funcionario.Dnr =
departamento.Dnumero WHERE Projlocal = "Mauá" AND Cpf_gerente
= Cpf;

9. Descobrir os nomes dos funcionários que trabalham em todos os projetos


controlados pelo departamento número 5.

SELECT Pnome, COUNT(trabalha_em.Fcpf) FROM `funcionario` JOIN


trabalha_em ON funcionario.Cpf=trabalha_em.Fcpf JOIN projeto
ON trabalha_em.Pnr = projeto.Projnumero
WHERE projeto.Dnum=5
GROUP BY Cpf
HAVING COUNT(trabalha_em.Fcpf) = (SELECT COUNT(Projnome) FROM
projeto WHERE Dnum=5);

10. Fazer uma lista dos números de projeto para aqueles que envolvem um
funcionário cujo último nome é ‘Silva’, seja como um trabalhador ou como um
gerente do departamento que controla o projeto.

SELECT Pnr FROM trabalha_em


JOIN funcionario ON funcionario.Cpf = trabalha_em.Fcpf
WHERE Unome = 'Silva'
GROUP BY Fcpf;

11. Listar os nomes dos funcionários com dois ou mais dependentes.


SELECT Pnome FROM funcionario
JOIN dependente ON dependente.Fcpf = funcionario.Cpf
GROUP BY Cpf
HAVING COUNT(Fcpf) >=2;

12. Recuperar os nomes dos funcionários que não possuem dependentes.


SELECT Pnome, Unome FROM `funcionario`
WHERE Cpf NOT IN (SELECT Fcpf FROM dependente);

13. Listar os nomes dos gerentes que têm pelo menos um dependente.
SELECT Pnome FROM `funcionario` JOIN departamento ON
departamento.Dnumero = funcionario.Dnr WHERE funcionario.Cpf =
departamento.Cpf_gerente AND departamento.Cpf_gerente IN
(SELECT Fcpf FROM dependente);

14. Recuperar os nomes de todos os funcionários do departamento número 5 que


trabalham mais de 10 horas por semana no ‘ProdutoX’.
SELECT Pnome FROM funcionario JOIN departamento ON
departamento.Dnumero = funcionario.Dnr JOIN projeto ON
projeto.Dnum = departamento.Dnumero JOIN trabalha_em ON
trabalha_em.Pnr = projeto.Projnumero WHERE Projnome =
'ProdutoX' AND Horas > 10 AND Dnum = 5 GROUP BY Pnome;

15. Liste os nomes de todos os funcionários que tem um dependente com o


primeiro nome igual ao seu.

16. Para cada projeto, liste o nome do projeto e o total de horas por semana (por
todos os funcionários) gastas nesse projeto.

17. Para cada departamento, recupere o nome do departamento e o salário médio


de todos os seus funcionários.
SELECT Dnome, AVG(Salario) FROM departamento
JOIN funcionario ON departamento.Dnumero = funcionario.Dnr
GROUP BY Dnome;

18. Recupere salário médiode todos os funcionários do sexo feminino.


SELECT Sexo, AVG(Salario) FROM funcionario WHERE Sexo = 'F';

19. Liste o último nome de todos os gerentes de departamento que não possuem
dependentes.
SELECT Unome FROM `funcionario`
JOIN departamento ON departamento.Dnumero = funcionario.Dnr
WHERE funcionario.Cpf = departamento.Cpf_gerente AND
departamento.Cpf_gerente NOT IN (SELECT Fcpf FROM dependente);

Aula 5 - 07/07

QUESTÃO REVISÃO - 07/07/2023


1. Listar, sem repetir, o número e o nome dos projetos que tenham algum
funcionário do departamento Administração trabalhando no projeto e também o
nome dos projetos que que tenham algum funcionário que trabalha mais de 20
horas no projeto. Apresentar os resultados em ordem decrescente de número de
projeto

SELECT Projnumero, Projnome FROM `projeto` JOIN trabalha_em ON


projeto.Projnumero = trabalha_em.Pnr JOIN funcionario ON funcionario.Cpf =
trabalha_em.Fcpf JOIN departamento ON departamento.Dnumero = funcionario.Dnr
WHERE departamento.Dnome = "Administração"
UNION
SELECT Projnumero, Projnome FROM projeto JOIN trabalha_em ON
projeto.Projnumero = trabalha_em.Pnr WHERE trabalha_em.Horas > 20
ORDER BY Projnumero DESC;

ou

SELECT DISTINCT Projnumero, Projnome FROM projeto JOIN


trabalha_em ON projeto.Projnumero = trabalha_em.Pnr JOIN
funcionario ON funcionario.Cpf = trabalha_em.Fcpf JOIN
departamento ON funcionario.Dnr = departamento.Dnumero WHERE
departamento.Dnome = 'Administração' OR trabalha_em.Horas >20
ORDER BY Projnumero DESC;

2.
Para o projeto Informatização, retorne o valor gasto por hora de trabalho do projeto
considerando o salário e as horas de trabalho no projeto de todos os funcionários
que trabalham no projeto (dividir a soma dos salários pela soma das horas
trabalhadas de todos os funcionários).
SELECT (SUM(Salario) / SUM(Horas)) Gasto FROM funcionario JOIN
trabalha_em ON trabalha_em.Fcpf = funcionario.Cpf JOIN projeto
ON projeto.Projnumero = trabalha_em.Pnr
WHERE Projnome = "Informatização";

3.
Recuperar o primeiro nome, último nome e salário dos funcionários do
departamento ‘Administração’ que trabalham mais de 15 horas no projeto
‘Informatização’.

SELECT Pnome, Unome, Salario FROM funcionario


JOIN departamento ON funcionario.Dnr = departamento.Dnumero
JOIN trabalha_em ON funcionario.Cpf = trabalha_em.FcpfJOIN projeto ON
projeto.Projnumero = trabalha_em.Pnr
WHERE Dnome = "Administração" AND (Projnome = "Informatização") AND
trabalha_em.horas > 15;

ou

3. SELECT Pnome, Unome, Salario FROM `funcionario`


JOIN departamento ON departamento.Dnumero = funcionario.Dnr
JOIN trabalha_em ON trabalha_em.Fcpf = funcionario.Cpf
JOIN projeto ON trabalha_em.Pnr = projeto.Projnumero
WHERE departamento.Dnome = 'Administração' AND trabalha_em.Horas > 15 AND
projeto.Projnome = 'Informatização';

4.REPETIDO
5.
Listar o primeiro nome do funcionário e o número de projetos que trabalham todos
os funcionários que moram na cidade de São Paulo que trabalham no departamento
Pesquisa e que trabalham em dois ou mais projetos de empresa.

SELECT Pnome, COUNT(trabalha_em.Fcpf)


FROM funcionario
JOIN trabalha_em ON funcionario.Cpf = trabalha_em.Fcpf
JOIN projeto ON projeto.Projnumero = trabalha_em.Pnr JOIN departamento ON
funcionario.Dnr = departamento.Dnumero
WHERE Endereco LIKE "%São Paulo%" AND Dnome = "Pesquisa"
GROUP BY funcionario.Cpf
HAVING COUNT(trabalha_em.Fcpf) >= 2;

6.
Mesmo enunciado da questão anterior, mas adicionando a restrição de que o local
dos projetos também seja São Paulo.

SELECT Pnome, COUNT(trabalha_em.Fcpf)


FROM funcionario
JOIN trabalha_em ON funcionario.Cpf = trabalha_em.Fcpf
JOIN projeto ON projeto.Projnumero = trabalha_em.Pnr JOIN departamento ON
funcionario.Dnr = departamento.Dnumero
WHERE Endereco LIKE "%São Paulo%" AND Dnome = "Pesquisa" AND Projlocal =
"São Paulo"
GROUP BY funcionario.Cpf
HAVING COUNT(trabalha_em.Fcpf) >= 2;

7. Retornar o nome do funcionário, a quantidade de projetos que o funcionário


trabalha, seu salário, o total de horas trabalhadas pelo funcionário e o valor da sua
hora de trabalho (considerando seu salário dividido pela quantidade de horas que o
funcionário trabalha). Exemplo: se Pedro tem salário de 10000 e trabalha em 4
projetos, sendo 5 horas em cada, então Pedro trabalha 20h no total. Assim, seu
valor de hora trabalhada é 10000/20 = 500.

Select f.Pnome, count(t.Pnr), f.salario, sum(t.hora)


total_hora, (f.salario/sum(t.hora))valor_hora
from funcionario f join trabalha_em t on f.cpf = t.Fcpf
GROUP BY f.Cpf;

8) Listar o nome dos dependentes de todos os funcionários do sexo feminino que


tenham dependentes do sexo masculino, mas que não tenham dependentes do
sexo feminino.

select d.nome_dependente
from funcionarios f join dependente d on f.Cpf = d.Fcpf
where f.sexo ="F" and d.sexo = "M" AND
f.Cpf Not in (Select dependente.Fcpf from dependente where dependente.sexo
="F");

9) Listar o cpf e o total de horas que o funcionário trabalha, de todos os funcionários


que moram no estado de São Paulo, que trabalham no departamento
Administração, que trabalham em dois ou mais projetos.

SELECT f.Cpf, SUM(t.Horas) totHoras


FROM funcionario f JOIN departamento d ON f.Dnr = d.Dnumero
JOIN trabalha_em t ON f.Cpf = t.Fcpf
WHERE d.Dnome='Administração' AND f.Endereco LIKE '%SP%’
GROUP BY f.Cpf
HAVING COUNT(t.Pnr) > 1;

10) Fazer uma lista dos números de projeto para aqueles que envolvem um
funcionário cujo último nome é ‘Silva’. Além do solicitado na parte inicial da questão,
a lista de projetos também deve conter os números dos projetos que tenham
funcionários do sexo feminino trabalhando nele. USO obrigatório do UNION ou
UNION ALL nesta questão.

select t.Pnr from funcionario f


join trabalha_em t on f.Cpf = t.Fcpf
where f.Unome = "Silva"
Union
select t.Pnr from funcionario f
join trabalha_em t on f.Cpf = t.Fcpf
where f.sexo="F";

Aula 6 - 08/08

08/08

SELECT LOWER(Pnome) FROM funcionario;


-Mostra os nomes de funcionário formatados em letra minúscula.

SELECT UPPER(Pnome) FROM funcionario;


-Mostra os nomes de funcionários formatados em letra maiúscula.

SELECT CONCAT(Pnome, ' ', Unome) FROM funcionario;


- Concatena nome e sobrenome de funcionário com espaço entre eles

SELECT UPPER(CONCAT(Pnome, ' ', Unome)) FROM funcionario;


- Concatena nome e sobrenome de funcionário com espaço entre eles formatado
em letra maiúscula.

SELECT CONCAT_WS('_', Cpf, UPPER(Pnome), LOWER(Unome)) FROM


funcionario;
- Concatena cpf, nome(formatado em letra maiúscula) e sobrenome(formatado
em letra minúscula) de funcionário com underline entre eles

SELECT Pnome, Unome, CHAR_LENGTH(CONCAT(Pnome, Unome)) FROM


funcionario;
- table com nome, sobrenome e n° de caracteres de nome e sobrenome juntos,
sem espaço.

SELECT Pnome, Unome, CHAR_LENGTH(CONCAT(Pnome, Unome)),


LENGTH(CONCAT(Pnome, Unome)) FROM funcionario;
- num de caracteres //// num de bytes;

1. Retornar os 3 primeiros dígitos do cpf concatenados por um hífen com as


últimas 3 letras do primeiro nome do funcionário.

SELECT CONCAT(LEFT(Cpf, 3), '-', RIGHT(Pnome, 3)) FROM funcionario;

Outra forma :
SELECT CONCAT_WS('-',LEFT(Cpf,3), RIGHT(Pnome,3)) FROM
funcionario;

2. Retornar os 3 primeiros dígitos do cpf concatenados por um hífen com as


últimas 3 letras do nome do departamento onde o funcionário trabalha:

SELECT CONCAT_WS('-',LEFT(Cpf,3), RIGHT(Dnome,3)) FROM funcionario


f
JOIN departamento d ON f.Dnr = d.Dnumero;

SELECT CONCAT(LEFT(f.Cpf, 3), '-', RIGHT(d.Dnome, 3)) FROM funcionario


f JOIN departamento d ON f.Dnr=d.Dnumero;

3. Retornar o cpf do funcionário no formato 000.000.000-00.


SELECT CONCAT(LEFT(Cpf, 3), '.', MID(Cpf, 4, 3), '.', MID(Cpf, 7, 3), '-',
RIGHT(Cpf, 2)) FROM funcionario;

4. Pegar o endereço antes de São Paulo.


SELECT MID(Endereco,1,INSTR(Endereco,'São Paulo')-3) Endereco FROM
`funcionario`
WHERE Endereco LIKE '%São Paulo%';

SELECT LEFT(Endereco, (INSTR(Endereco, ', São Paulo')) -1) FROM funcionario


WHERE Endereco LIKE "%São Paulo%";
- Pega tudo do endereço antes de São Paulo;

EXERCÍCIO

1) Considerando o banco de dados Empresa, selecionar o nome completo do


funcionário, seu salário, um salário novo (considerando 20% de aumento), e uma
coluna contendo os seguintes valores concatenados (separados por _ ) nesta
ordem:
- as primeiras 3 letras do nome do departamento
- código do departamento
- as últimas 3 letras do nome do projeto
- o número do projeto
- nome do funcionário
- quarto, quinto, e sexto dígitos do CPF do funcionário
Considerando as seguintes restrições:
- somente dos funcionários que moram em São Paulo ou que tenham nascido na
década de 60. Apresentando os resultados ordenados em ordem decrescente.
Observação: apenas para deixar claro, caso o funcionário trabalhe em mais de um
projeto, seu nome e salário aparecerão em mais de uma linha no resultado

RESPOSTA:
SELECT CONCAT(f.Pnome, ' ', f.Unome), f.Salario, (f.Salario*1.2)Novo_Salario,
CONCAT_WS('_', LEFT(d.Dnome, 3),
d.Dnumero , RIGHT(p.Projnome, 3), p.Projnumero, f.Pnome, MID(f.Cpf, 4, 3))
FROM funcionario f
JOIN departamento d ON d.Dnumero = f.Dnr
JOIN trabalha_em t ON f.Cpf = t.Fcpf
JOIN projeto p ON t.Pnr = p.Projnumero
WHERE f.Endereco LIKE '%São Paulo%' OR f.Datanasc BETWEEN '1960-01-01'
AND '1969-12-31' (ou assim: f.Datanasc LIKE "__6_______")
ORDER BY Cpf DESC;

Aula 7 - 15/08

AULA DIA 15/08

1. Retornar o nome do funcionário, o nome do departamento que o funcionário é


gerente e o tempo que o funcionário é gerente do departamento
Tempo no formato: 10 anos, 5 meses, 356 dias

SELECT Pnome, Dnome FROM `funcionario` JOIN departamento ON


departamento.Dnumero = funcionario.Dnr WHERE funcionario.Cpf =
departamento.Cpf_gerente;

Exemplo de solução:

SELECT
CONCAT(f.Pnome, ' ', f.Unome) AS nome_funcionario,
d.Dnome AS nome_departamento,
CONCAT(
CONCAT(TIMESTAMPDIFF(YEAR, d.Data_inicio_gerente, current_date), ' anos, ') ,
CONCAT(TIMESTAMPDIFF(MONTH, d.Data_inicio_gerente + INTERVAL
TIMESTAMPDIFF(YEAR, d.Data_inicio_gerente, current_date) YEAR ,
current_date), ' meses, ') ,
CONCAT(TIMESTAMPDIFF(DAY, d.Data_inicio_gerente + INTERVAL
TIMESTAMPDIFF(MONTH, d.Data_inicio_gerente, current_date) MONTH ,
current_date), ' dias') ) AS tempo
FROM funcionario f
JOIN departamento d ON f.Cpf = d.Cpf_gerente;

Aula 8 - 22/08

Aula 22/08

1. Diz a lenda da sorte que se a soma do dia, mês e ano de nascimento for maior do
que a soma do dia, mês e ano atual você terá sorte no dia. Essa lenda é totalmente
verdadeira exceto pelas partes que foram totalmente inventadas. Faça uma consulta
para verificar se o funcionário terá sorte no dia de hoje. Retornar o nome do
funcionário, a soma referente ao dia do nascimento e a soma referente ao dia atual.
Soma da data: 04/10/1980 = 1994.

parte 1
SELECT Pnome, funcionario.Datanasc, (DAYOFMONTH(funcionario.Datanasc) +
MONTH(funcionario.Datanasc) + YEAR(funcionario.Datanasc))soma_nasc,
DAYOFMONTH(CURDATE()) + MONTH(CURDATE()) +
YEAR(CURDATE())soma_hoje
FROM funcionario;

parte 2
transformar em sorte ou azar

2:.
Considerando que o endereço dos funcionários segue um padrão, faça uma
consulta para extrair o nome das cidades onde moram os funcionários.

SELECT f.Pnome,
reverse(SUBSTRING_INDEX(reverse(SUBSTRING_INDEX(f.Endereco, ",", 3)),",",
1)) FROM funcionario f;

RESOLUÇÃO DO SOR
SELECT endereco,
reverse(SUBSTRING_INDEX(reverse(SUBSTRING_INDEX(Endereco, ',', 3)),',',1))
exemplo1,

reverse(substring(reverse(left(endereco,char_length(Endereco)-4)),1,instr(reverse(le
ft(endereco,char_length(Endereco)-4)),',')-2)) exemplo2
FROM funcionario
3.Considerando que o endereço dos funcionários segue um padrão, faça uma
consulta para extrair o nome das cidades onde moram os funcionários que
trabalham em 2 ou mais projetos.

SELECT f.Pnome,
reverse(SUBSTRING_INDEX(reverse(SUBSTRING_INDEX(f.Endereco, ",", 3)),",",
1))
FROM funcionario f
JOIN trabalha_em tb ON tb.Fcpf = f.Cpf
JOIN projeto p ON p.Projnumero = tb.Pnr
GROUP BY f.Cpf
HAVING COUNT(p.Projnumero) > 1;

Glossário: A função SUBSTRING_INDEX() retorna uma substring de uma string


antes que um número especificado de delimitadores ocorra.
SELECT SUBSTRING_INDEX("www.w3schools.com", ".", 1);
→ WWW

4. Retornar os três últimos dígitos do cpf do funcionário concatenados com as três


primeiras letras do nome dos dependentes dos funcionários concatenado com o
nome do departamento do funcionário.

SELECT Pnome,
CONCAT(RIGHT(funcionario.Cpf, 3), LEFT(dependente.Nome_dependente, 3),
departamento.Dnome)
FROM funcionario
JOIN dependente ON dependente.Fcpf = funcionario.Cpf
JOIN departamento ON departamento.Dnumero = funcionario.Dnr;

5.Percentual de tempo de trabalho do funcionário em relação a idade do funcionário.


Exemplo: Funcionário trabalha a 20 anos na empresa e tem 50 anos. Percentual de
tempo de trabalho na empresa é 20/50 = 40%

SELECT Pnome, (((YEAR(NOW()) - YEAR(departamento.Data_inicio_gerente))/


(YEAR(NOW()) - YEAR(funcionario.Datanasc)))*100)porcentagem_trab FROM
funcionario JOIN departamento ON departamento.Dnumero = funcionario.Dnr;

2° forma
SELECT Pnome, ROUND((((YEAR(NOW()) -
YEAR(departamento.Data_inicio_gerente))/ (YEAR(NOW()) -
YEAR(funcionario.Datanasc)))*100), 2)porcentagem_trab FROM funcionario JOIN
departamento ON departamento.Dnumero = funcionario.Dnr;

ROUND arredonda as casas, como o parâmetro é dois ele arredonda para duas
casas.

6.Refaça o exercício 1 somando cada um dos algarismos das datas. Exemplo:


Soma da data: 04/10/1980 = 0 + 4 + 1 + 0 + 1 + 9 + 8 + 0 = 2

só da data do nascimento do funcionário…

SELECT Pnome, funcionario.Datanasc,


(RIGHT(DAYOFMONTH(funcionario.Datanasc),1)+
LEFT(DAYOFMONTH(funcionario.Datanasc),1) +
RIGHT(MONTH(funcionario.Datanasc),1) +
LEFT(MONTH(funcionario.Datanasc),1) +
SUBSTRING(YEAR(funcionario.Datanasc),1,1)+
SUBSTRING(YEAR(funcionario.Datanasc),2,1)+
SUBSTRING(YEAR(funcionario.Datanasc),3,1)+
SUBSTRING(YEAR(funcionario.Datanasc),4,1))SomaNasc
FROM funcionario;

SUBSTRING_INDEX(): Retorna uma substring de uma string antes que ocorra um


número especificado de delimitadores;
SELECT SUBSTRING_INDEX("São Paulo, SP, Brasil", ",", 2);
Retorna: São Paulo, SP

Aula 9 - 12/09

12/09

Arquivo:

2. Fazer uma consulta SQL que retorne o nome do departamento onde existam
funcionários do sexo feminino. Embora possa ser feito de forma mais simples, você
deve utilizar EXISTS para exercitar seu uso.

SELECT d.Dnome FROM departamento d WHERE EXISTS (SELECT 1 FROM


funcionario f WHERE f.Dnr = d.Dnumero AND f.Sexo = 'F');
3. Fazer uma consulta SQL que retorne o nome e o sexo do funcionário. Porém, ao
invés de retornar ‘F’ e ‘M’ no sexo você deve retornar ‘Feminino’ e ‘Masculino’. Para
isso, nesta questão você deve utilizar o CASE.

SELECT f.Pnome, CASE WHEN f.Sexo = 'M'THEN "Masculino" ELSE "Feminino" END
'Sexo' FROM funcionario f;

ou

SELECT f.Pnome,
CASE WHEN f.Sexo = 'M' THEN "Masculino"
WHEN f.Sexo = 'M' THEN "Feminino"
ELSE "Outro"
END
'Sexo'
FROM funcionario f;

Exercícios JOIN:

1) Selecione os clientes com seus pedidos (id e data do pedido). Clientes sem
pedido também devem aparecer na lista.

SELECT c.id, p.data FROM cliente c LEFT JOIN pedido p ON c.id = p.cliente_id;

2) Selecione os clientes com a sua quantidade de pedidos. Clientes sem


pedido também devem aparecer na lista com a quantidade 0.

SELECT c.nome, COUNT(p.id) FROM cliente c


LEFT JOIN pedido p ON c.id = p.cliente_id
GROUP BY c.nome;

3) Selecione o nome dos produtos com o seu total de itens vendidos (coluna
quantidade em produto_pedido). Produtos sem pedido também devem
aparecer na lista.

SELECT p.nome, SUM(pp.quantidade)


FROM produto p
LEFT JOIN produto_pedido pp ON p.id = pp.produto_id
GROUP BY p.nome;
4) Mesmo enunciado anterior alterando: Produtos sem pedido devem
aparecer na lista com a quantidade 0.

SELECT p.nome,
CASE
WHEN SUM(pp.quantidade) is NULL THEN 0
ELSE SUM(pp.quantidade)
END
'quantidade'
FROM produto p
LEFT JOIN produto_pedido pp ON p.id = pp.produto_id
GROUP by p.nome;

5) Selecionar o id e o nome de todos os produtos que tiveram ao menos


algum pedido. Uo obrigatório do EXISTS.

SELECT p.id, p.nome FROM produto p


WHERE EXISTS (SELECT 1 FROM produto_pedido pp WHERE pp.produto_id =
p.id)
GROUP BY p.id;

6) Selecionar o nome e a quantidade em estoque de cada produto. Valores


nulos devem ser substituídos por 0. Para testar ambas funções, retornar duas
colunas com essa informação: uma utilizando IFNULL e outra utilizando o
COALESCE.

SELECT p.nome, IFNULL(p.quantidade, 0), COALESCE (p.quantidade, 0) FROM


produto p;

8) Retorne o nome do produto, sua quantidade, e um texto informando o


seguinte: 'Estoque adequado' quando o produto tiver mais de 10 itens em
estoque. 'Estoque regular' quando o produto tiver entre 5 e 10 itens em
estoque. 'Estoque baixo' quando o produto tiver entre 1 e 4 itens em estoque.
'Indisponível' quando o produto tiver menos de 0 itens em estoque.

SELECT p.nome, IFNULL(p.quantidade,0),


CASE
WHEN p.quantidade > 10 THEN "Estoque Adequado"
WHEN p.quantidade >= 5 AND p.quantidade <= 10 THEN "Estoque regular"
WHEN p.quantidade >= 1 AND p.quantidade <= 4 THEN "Estoque baixo"
ELSE "Indisponível"
END 'Estoque'
FROM produto p;

O código da ação, a data do pregão e a soma do número de negócios por código de


negociação e data do pregão. Somente considerar resultados onde a soma do número de
negócios tenha valor maior que 25500 e menor que 26344.

Concatene o resultado destas três colunas na ordem código, data e soma, separados por _
(ex. ZZZZZ_XXXXX_YYYYYY)

19/09/2023

ANY qualquer valor, retorna TRUE ou FALSE.

ALL maior ou menor que todos os valores, retorna TRUE ou FALSE.

EXERCÍCIO 1:

Retornar o nome do projeto que tenha mais funcionários trabalhando nele do a média
de funcionários trabalhando em todos os projetos.

Exercícios subconsultas:

1. Retornar o nome completo (primeiro e último nome concatenados) de todos os


funcionários que trabalham mais de 8 horas no projeto "ProdutoX" ou no "ProdutoY"
e que tenham mais de um dependente. Os nomes não podem aparecer repetidos e
devem estar em ordem alfabética.

SELECT CONCAT(funcionario.Pnome,' ', funcionario.Unome)nome_completo FROM


funcionario JOIN dependente ON funcionario.Cpf = dependente.Fcpf JOIN trabalha_em ON
trabalha_em.Fcpf = funcionario.Cpf JOIN projeto ON projeto.Projnumero = trabalha_em.Pnr
WHERE (projeto.Projnome = 'ProdutoX' OR projeto.Projnome = 'ProdutoY')
GROUP BY Cpf
HAVING COUNT(dependente.Fcpf) > 1
ORDER BY funcionario.Pnome;

2. Listar o nome do funcionário, seu cpf e seu número de dependentes considerando


todos os funcionários que tenham pelo menos 1 dependente do sexo masculino e 1
dependente do sexo feminino.

SELECT funcionario.Pnome, funcionario.cpf, count(dependente.Fcpf) Quantidade


FROM funcionario,dependente
WHERE funcionario.Cpf = dependente.Fcpf AND
funcionario.Cpf in (SELECT dependente.Fcpf FROM dependente WHERE dependente.Sexo
= "M") and
funcionario.Cpf in (SELECT dependente.Fcpf FROM dependente WHERE dependente.Sexo
= "F")
GROUP by funcionario.cpf;

3. Listar o nome e o salário dos funcionários que trabalham no departamento


localizado em “Itu”, que tenham nascido na década de 60 e que tenham salário abaixo
da média salarial do departamento onde trabalha.

SELECT f1.Pnome, Salario


from funcionario f1, localizacao_dep
where f1.Datanasc BETWEEN "1960-01-01" and "1969-12-12"
and f1.Dnr=localizacao_dep.Dnumero and localizacao_dep.Dlocal="Itu"
and f1.Salario < (SELECT avg(f2.Salario) from funcionario f2 where f2.dnr=f1.dnr);

Aula 10 - 03/10
FUNÇÕES -

MODELO:
DELIMITER $
CREATE FUNCTION()
RETURNS
BEGIN
RETURN
END$
DELIMITER ;

EXEMPLO SIMPLES:

CREATE FUNCTION fn_multiplica (a INT, b INT)


RETURNS INT
RETURN a * b;
--uso da função
SELECT fn_multiplica(5, 6) AS Resultado;

EXEMPLO VARIÁVEIS:

DELIMITER $

CREATE FUNCTION fn_multiplica_var(a INT, b INT)


RETURNS INT
BEGIN
DECLARE valorA, valorB, resultado INT;
SET valorA=a;
SET valorB=b;
SET resultado=valorA*valorB;
RETURN resultado;
END$

DELIMITER ;

NUMERIC(3,1) ex.: 10,0 (até 3 dígitos, com uma casa depois da vírgula)

EXEMPLO COM IF

DELIMITER $

CREATE FUNCTION verificaAprovacao(nota1 NUMERIC(3,1),nota2 NUMERIC(3,1), nota3


NUMERIC(3,1))
RETURNS VARCHAR(15)
BEGIN
DECLARE media NUMERIC(3,1);
DECLARE situacao VARCHAR(15);

SET media = (nota1+nota2+nota3)/3;

IF media >= 7 THEN


SET situacao = 'APROVADO';
ELSE
SET situacao = 'REPROVADO';
END IF;

RETURN situacao;
END$
DELIMITER ;

--uso da função
select verificaAprovacao(7.5,5,4.3);

OUTROS EXEMPLOS
--------------------------------
DELIMITER $
CREATE FUNCTION PrimeiroNome (nomeCompleto VARCHAR(50))
RETURNS varchar(50)
BEGIN
declare novo_nome varchar(50);

SELECT LEFT(nomeCompleto,INSTR(nomeCompleto, " ")) into novo_nome;


#set novo_nome = LEFT(nomeCompleto,INSTR(nomeCompleto, " ")) ;

return novo_nome;
end$
DELIMITER ;

--uso da função
select PrimeiroNome("Lucas Ramos dos Santos");
---------------------------

DELIMITER $$

CREATE FUNCTION fn_ValorPedido(pedidoID int)


RETURNS int
return( select sum(item.preçoUnitario * item_pedido.quantidade)
from item_pedido, item
where item_pedido.NumItem=item.NumItem and
item_pedido.NumPedido = pedidoID
)$$

DELIMITER ;

--uso da função
select fn_ValorPedido(3);

--uso da função
select cliente.nomeCliente, fn_ValorPedido(3) totalPedido
from cliente, pedido
where cliente.NumCliente = pedido.NumCliente AND
pedido.NumPedido=3;
----------------------------

DELIMITER $$

CREATE FUNCTION fn_ValorPedido(pedidoID int)


RETURNS int
return( select sum(item.preçoUnitario * item_pedido.quantidade)
from item_pedido, item
where item_pedido.NumItem=item.NumItem and
item_pedido.NumPedido = pedidoID
)$$

DELIMITER ;

EXERCÍCIOS:
- Exercício 1:
Criar uma função que recebe a data de nascimento do funcionário e retorna a
idade do funcionário.
Dica: procurar funções de data(date) do MySQL pode ajudar.

DELIMITER $
CREATE FUNCTION calc_idade(dataNascimento date)
RETURNS INT
BEGIN
RETURN TRUNCATE((DATEDIFF(NOW(), dataNascimento) / 365.25),0);
END$
DELIMITER;

- Exercício 2:
Fazer um select que retorne o nome e a idade de todos os funcionário
demostrando o uso da função.

SELECT Pnome AS nome, calc_idade(Datanasc) AS idade FROM `funcionario`;

- Exercício 3:
Criar uma função que recebe o CPF do funcionário e retorna o número de
dependentes do funcionário.

CREATE FUNCTION dependentes(cpf bigint) RETURNS int RETURN (SELECT


COUNT(dependente.Fcpf) FROM dependente WHERE Fcpf = cpf);
- Exercício 4:
Fazer um select que retorne o nome e o número de dependentes de um
funcionário informado na função.

SELECT Pnome AS nome, dependentes(funcionario.Cpf) AS


quantidade_dependentes FROM funcionario WHERE Cpf = 12345678966;

- Exercício 5:
Fazer um select que retorne o nome e o número de dependentes de todos os
funcionários.

SELECT Pnome AS nome, dependentes(funcionario.Cpf) AS


quantidade_dependentes FROM funcionario;

EXERCÍCIOS PARTE 2:

- Exercício 1:
Crie a função TotalHoras para retornar o total de horas que um funcionário
trabalha. O parâmetro de entrada da função deve ser o cpf do funcionário.
função deve retornar o total de horas que o funcionário trabalha (tabela
trabalha_em).

DELIMITER $
CREATE FUNCTION TotalHoras(cpf bigint)
RETURNS decimal(10,1)
BEGIN
RETURN (SELECT SUM(trabalha_em.Horas) FROM trabalha_em WHERE
trabalha_em.Fcpf = cpf);
END$
DELIMITER ;

SELECT Pnome AS nome, TotalHoras(funcionario.Cpf) FROM funcionario;

- Exercício 2:
Crie a função TotalHorasProjetos para retornar o total de horas e o número
de projetos que um funcionário trabalha. O parâmetro de entrada da função
deve ser o cpf do funcionário. A função deve retornar de forma concatenada
o total de horas que o funcionário trabalha e a quantidade de projetos que o
funcionário trabalha. Exemplo de retorno da função: '10h - 2 projetos'.

CREATE FUNCTION TotalHorasProjetos (cpf bigint)


RETURNS varchar(30)
RETURN (SELECT CONCAT(SUM(trabalha_em.Horas),'h -
',COUNT(trabalha_em.pnr),' projetos')
FROM trabalha_em
WHERE trabalha_em.Fcpf=cpf);

select TotalHorasProjetos(12345678966);

select Pnome, TotalHorasProjetos(cpf)


from funcionario;

- Exercício 3:
Crie a função TotalFuncionários para retornar a quantidade de funcionários
que trabalham em um determinado projeto. O parâmetro de entrada da
função deve ser o nome do projeto. A função deve retornar a quantidade de
funcionários que trabalha no projeto indicado.

CREATE FUNCTION TotalFuncionarios (nomeProjeto VARCHAR(20))


RETURNS int
RETURN (SELECT count(t.Fcpf)
FROM trabalha_em t, projeto p
WHERE t.Pnr=p.Projnumero AND
p.Projnome = nomeProjeto);

select p.Projnome, TotalFuncionarios(p.Projnome)


from projeto p

- Exercício 4:
Crie a função MediaSalDep para retornar a média salarial dos funcionários
de um departamento. O parâmetro de entrada da função deve ser o nome do
departamento. A função deve retornar a média salarial dos funcionários que
trabalham no departamento indicado.

CREATE FUNCTION MediaSalDep (nomeDepto VARCHAR(25))


RETURNS double
RETURN (select avg(f.Salario)
from funcionario f, departamento d
where f.Dnr=d.Dnumero and
d.Dnome=nomeDepto);

select d.Dnome, MediaSalDep(d.Dnome)


from departamento d;
Aula 11 - 10/10/23

EXERCÍCIOS PARTE 3:

- Exercicio 1:
Criar uma função que recebe o CPF do funcionário e retorna o valor do
aumento do funcionário. Se a soma de horas trabalhadas em projetos pelo
funcionário for maior ou igual a 40, o aumento deve ser de 20%. Caso
contrário o aumento deve ser de 5%.

DELIMITER $
CREATE FUNCTION aumentoSalario(cpf bigint)
RETURNS float
BEGIN
DECLARE horas decimal(10,1);
DECLARE aumento float;

SET horas = (SELECT SUM(trabalha_em.Horas) AS horas FROM


trabalha_em JOIN funcionario ON funcionario.Cpf = trabalha_em.Fcpf
WHERE cpf = funcionario.Cpf
GROUP BY funcionario.Cpf);
IF horas >= 40 THEN
SET aumento = (SELECT Salario FROM funcionario WHERE
funcionario.Cpf = cpf)*0.2;
ELSE
SET aumento = (SELECT Salario FROM funcionario WHERE
funcionario.Cpf = cpf)*0.05;
END IF;

RETURN aumento;

END$
DELIMITER ;

- Exercício 2:
Fazer uma consulta para mostrar o uso da função que retorne o nome do
funcionário e seu novo salário.

SELECT Pnome AS nome, Cpf, Salario, Salario +


aumentoSalario(funcionario.Cpf) AS novoSalario FROM `funcionario`;
- Exercício 3:
Criar uma função que recebe três 3 números de projeto como parâmetro e
retorna o projeto com mais funcionários trabalhando nele.

DELIMITER $
CREATE FUNCTION maisFuncionarios(proj1 int, proj2 int, proj3 int)
RETURNS int
BEGIN
DECLARE projFunc1 int;
DECLARE projFunc2 int;
DECLARE projFunc3 int;
DECLARE resultado int;

SET projFunc1 = (SELECT COUNT(trabalha_em.Pnr) FROM trabalha_em


WHERE trabalha_em.Pnr = proj1);
SET projFunc2 = (SELECT COUNT(trabalha_em.Pnr) FROM trabalha_em
WHERE trabalha_em.Pnr = proj2);
SET projFunc3 = (SELECT COUNT(trabalha_em.Pnr) FROM trabalha_em
WHERE trabalha_em.Pnr = proj3);

IF projFunc1 > projFunc2 THEN


SET resultado = proj1;
ELSEIF projFunc2 > projFunc3 THEN
SET resultado = proj2;
ELSE
SET resultado = proj3;
END IF;
RETURN resultado;
END$

DELIMITER ;

OBS: greatest (proj1,proj2,proj3) retorna o maior entre eles

- Exercício 4:
Fazer uma consulta para mostrar o uso da função.

SELECT maisFuncionarios(1,2,3);

EXERCÍCIO PARTE 4:

- Exercício 1:
Criar uma função que recebe o nome do departamento como parâmetro de entrada
e retorna o nome do gerente do departamento juntamente com o tempo de gerência
do funcionário no departamento. Retornar no seguinte formato: Fula do tal, gerente a
5 anos, 3 meses e 5 dias.

- Exercício 2:

Fazer uma consulta para mostrar o uso da função.

- Exercício 3:

Fazer uma função que receba como entrada o cpf do funcionário e o sexo dos
dependentes que deve ser considerado na contabilização. A função deve retornar o
número de dependentes do funcionário para o sexo indicado.

- Exercício 4:

Fazer uma consulta para mostrar o uso da função. Essa consulta deve retornar as
seguintes colunas: nome e sobrenome do funcionário, total de dependentes,
dependentes femininos, dependentes masculinos. Essas três últimas colunas devem
utilizar a função criada para retornar os dados

DELIMITER $
CREATE OR REPLACE FUNCTION listarAll()
RETURNS text
BEGIN
DECLARE id int;
DECLARE id2 int;
DECLARE resultado text;
DECLARE tarefa text;
SET id2 = (SELECT MIN(tarefas.id) FROM tarefas);
SET id = (SELECT MAX(tarefas.id) FROM tarefas);
WHILE id2 <= id DO
SET tarefa = (SELECT titulo FROM tarefas WHERE id2 = tarefas.id);
SET resultado = (SELECT CONCAT(tarefa,'\n'));
SET id2 = (id2 + 1);
END WHILE;
RETURN resultado;
END$
DELIMITER ;

Aula 12 - 24/10/23
Xampp - APACHE - config - phpmyadmin

Alterar o ‘auth_type’ para ‘cookie’ ao invés de config

CREATE USER ‘exemplodeusuário’@’localhost’ IDENTIFIED BY


‘password’;

Você pode querer substituir a palavra localhost pelo endereço do seu servidor. Por exemplo,
se este usuário precisa acessar o MySQL de uma máquina com o endereço IP 11.0.0.0,
então você executaria o seguinte:
CREATE USER ‘newuser’@’11.0.0.0’ DENTIFIED BY
‘user_password’;

Se você quiser criar um usuário que possa se conectar de qualquer host, você pode incluir a
% wildcard no seu comando. Por exemplo:
CREATE USER ‘newuser’@’%’ IDENTIFIED BY ‘user_password’;

1. Quais são as principais tarefas de um administrador de banco de dados?

O administrador de banco de dados, também chamado de DBA (Database


Administrator), é o profissional responsável por realizar o gerenciamento, a configuração, a
instalação, a atualização e o monitoramento de bancos de dados. Além disso, esse
profissional também desenvolve melhorias para o sistema de banco de dados.

2. Qual o comando para criar uma conta de usuário com senha?

CREATE USER ‘exemplodeusuário’@’localhost’ IDENTIFIED BY ‘password’;

3. Qual o comando para dar acesso para um usuário apenas em um banco de


dados específico?

GRANT ALL PRIVILEGES ON nome_do_banco_de_dados.* TO


'nome_do_usuario'@'localhost';

OU para permissões específicas

GRANT SELECT, INSERT, UPDATE, DELETE ON nome_do_banco_de_dados.* TO


'nome_do_usuario'@'localhost';
4. Qual o comando para dar acesso para um usuário apenas em um conjunto de
tabelas de um banco de dados?

GRANT permissão1, permissão2 ON nome_do_banco_de_dados.nome_da_tabela TO


'nome_de_usuario'@'localhost';

onde as permissões podem ser SELECT, INSERT, UPDATE,..

5. Qual o comando para dar acesso para um usuário apenas em um conjunto de


colunas de uma tabela de um banco de dados?

Para isso é necessário criar um view.

CREATE VIEW visao_restrita AS

SELECT coluna1, coluna2

FROM sua_tabela;

E depois conceder o acesso usando a esse view.

GRANT SELECT ON nome_do_banco_de_dados.visao_restrita TO


'nome_do_usuario'@'localhost';

6. Qual o comando para dar acesso apenas de consulta (SELECT) para um usuário
em um banco de dados?

GRANT SELECT ON nome_do_banco_de_dados.* TO 'nome_do_usuario'@'localhost';

7. Como revogar uma permissão já concedida.

REVOKE type_of_permission ON database_name.table_name FROM


‘username’@’localhost’;

VIEWS
EX.: CREATE VIEW vfunc as SELECT f.Pnome, f.Salario FROM funcionario f;

EXERCÍCIO:
Uma aplicação externa precisa de alguns dados disponíveis em nosso banco de
dados PESSOAS. Porém, como esta aplicação externa é uma aplicação para uso gerencial,
ela necessita apenas ter acesso aos dados de maneira consolidada. Você precisa
disponibilizar acesso apenas de consulta aos dados solicitados e não permitir acesso a
nenhuma outra informação do banco. Os dados necessários são: o número de pessoas
físicas por país como no exemplo a seguir:

Desta forma, solicita-se que você crie uma visão(view) chamada viewConsolidada
para disponibilizar estes dados e crie um usuário chamado appGerente com acesso de
select apenas a esta view.

Entregas do exercício:
● Script de criação da view viewConsolidada;

CREATE VIEW viewConsolidada AS
SELECT pais AS País, tipo_pessoa AS Tipo, COUNT(tipo_pessoa) AS
Quantidade FROM pessoaold WHERE tipo_pessoa = "PF" GROUP BY pais;

● Script que fornece acesso a view viewConsolidada para o usuário


appGererente;

CREATE USER appGerente@localhost IDENTIFIED BY '1234';


GRANT SELECT ON pessoas.viewconsolidada TO appGerente@localhost;

● Imagens (print) da tela do phpMyAdmin com o usuário appGerente logado e


com acesso a view viewConsolidada.

PROCEDURE:

EXEMPLO SIMPLES:

DELIMITER $
CREATE PROCEDURE sp_soma(in A int, in B int, out S int)
BEGIN
SET S=A+B;
END$
DELIMITER ;

CALL sp_soma(30,40,@saida);
SELECT @saida;
=

EXERCÍCIO:

Criar um procedimento que atualize os salários dos funcionários de um departamento de


acordo com o especificado na chamada do procedimento.

O procedimento deverá receber como parâmetro de entrada:


-nome do departamento
-faixa de aumento

Internamente o procedimento deve considerar a faixa de aumento da seguinte forma:


Se faixa de aumento:
"A" - então aumentar salário em 10%
"B" - então aumentar salário em 20%
"C" - então aumentar salário em 30%

O procedimento deverá ter como saída:


-número de funcionários do departamento que tiveram o salário atualizado e a soma total
dos salários do departamento após a atualização.

Exemplo de chamada: call atualizaSalario("Pesquisa","B");

Exemplo de saída: Departamento: Pesquisa | Funcionários atualizados: 3 | Aumento: 20%


| Soma antiga dos salários: 2000 | Soma atual dos salário: 2200.

Dica: retornar do procedimento um texto contendo essas informações concatenadas.

(n acabado)
DELIMITER $
CREATE PROCEDURE atualizaSalario(in Dnome varchar, in aumento char, out resultado
varchar)
BEGIN
DECLARE salario = (SELECT salario from funcionario f JOIN departamento d on f.Dnr =
d.Dnumero where d.Dnome = Dnome );
DECLARE porcentagem varchar;
if(aumento = "A") THEN
SET salario= salario * 1.1;
SET porcentagem = "10%";
ELSEIF(aumento = "B") THEN
SET salario= salario * 1.2;
SET porcentagem = "20%";
ELSEIF(aumento = "C") THEN
SET salario= salario * 1.3;
SET porcentagem = "30%";

END$
DELIMITER ;

DELIMITER $
CREATE PROCEDURE atualizaSalario(IN nome_departamento VARCHAR(25), IN
faixa_aumento CHAR(1), OUT saida VARCHAR(200))
BEGIN
DECLARE numDepto int;
DECLARE percentual_aumento double;
DECLARE soma_salarios_atuais DECIMAL(10,2);
DECLARE soma_salarios_novos DECIMAL(10,2);
DECLARE registros_atualizados int;

SELECT Dnumero INTO numDepto FROM departamento WHERE Dnome =


nome_departamento;
SET percentual_aumento = 0.00;

CASE faixa_aumento
WHEN "A" THEN
SET percentual_aumento = 0.10;
WHEN "B" THEN
SET percentual_aumento = 0.20;
WHEN "C" THEN
SET percentual_aumento = 0.30;
END CASE;

SELECT COUNT(cpf) INTO registros_atualizados FROM funcionario WHERE Dnr =


numDepto;
SELECT SUM(salario) INTO soma_salarios_atuais FROM funcionario WHERE Dnr =
numDepto;

UPDATE funcionario SET salario = salario * (1+percentual_aumento) WHERE Dnr =


numDepto;

SELECT SUM(salario) INTO soma_salarios_novos FROM funcionario WHERE Dnr =


numDepto;
SET saida = CONCAT("Departamento: ", nome_departamento, " | Funcionários
atualizados: ", registros_atualizados, " | Aumento: ", percentual_aumento*100,"% | Soma
antiga dos salários: ", soma_salarios_atuais, " | Soma atual dos salários: ",
soma_salarios_novos);
END $$
DELIMITER ;

#TESTANDO
call atualizaSalario("Pesquisa","A", @saida);
SELECT @saida;

EXERCÍCIO:

Crie uma procedure para alterar o preço de um produto.


O preço antigo deve ser gravado na tabela histórico de preço.

Entrada: nome do produto a ser alterado e novo preço.


Saída: texto de acordo com a seguinte condição:

“Produto atualizado com sucesso” – se o produto existe.


“Produto não existe” – se o produto não existe na tabela.

DELIMITER $
CREATE PROCEDURE atualizarPreco(in nomeP VARCHAR(20), in valorUni
DECIMAL(10.0), out saida varchar(200))
BEGIN
DECLARE codigoP int;
DECLARE uni char;
DECLARE valorU decimal;
DECLARE codHP int;
select cod_produto, Valor_unitario INTO codigoP, valorU FROM produto where descricao =
nomeP;
SET codHP = (select IFNULL(MAX(cod_produto),0) from historico_preco);

INSERT INTO historico_preco (codigo, cod_produto, valor_unitario_antigo,data_alteracao)


VALUES(codHP, codigoP, valorU, CURRENT_DATE());

UPDATE produto SET Valor_unitario = valorUni WHERE descricao = nomeP;


IF(codHP = 0) THEN
ELSE
set saida = valorUni;

end $
DELIMITER ;

Aula 13 - 09/11/23 - TRIGGERS

CREATE TABLE FUNCIONARIO


( id_funcionario INT NOT NULL,
nome VARCHAR(30) NOT NULL,
sobrenome VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT null,
cargo VARCHAR(30) NOT NULL,
PRIMARY KEY(id_funcionario)
);

CREATE TABLE FUNCIONARIO_AUDITORIA(


id INT NOT NULL AUTO_INCREMENT,
id_funcionario INT NOT NULL,
nome VARCHAR(30) NOT NULL,
sobrenome VARCHAR(30) NOT NULL,
cargo VARCHAR(30) NOT NULL,
modificadoem DATETIME DEFAULT NULL,
acao VARCHAR(30) DEFAULT null, PRIMARY KEY (id)
);

DELIMITER $$
CREATE TRIGGER antesUpdate_Funcionario
BEFORE UPDATE ON funcionario
FOR EACH ROW BEGIN
INSERT INTO funcionario_auditoria (id_funcionario, nome, sobrenome, cargo,
modificadoem, acao)
VALUES (OLD.id_funcionario, OLD.nome, OLD.sobrenome,
OLD.cargo, NOW(), "update");
END$$
DELIMITER ;

TESTE TRIGGER:

INSERT INTO funcionario (id_funcionario, nome, sobrenome, email, cargo) VALUES ('1', 'Tulio',
'Basegio', 'tulio@ifrs.com', 'Professor');

UPDATE funcionario SET cargo = 'Coordenador' WHERE id_funcionario = 1;

Exemplo INSERT
DELIMITER $$
CREATE TRIGGER Insert_Funcionario
BEFORE INSERT ON funcionario
FOR EACH ROW BEGIN
INSERT INTO funcionario_auditoria (id_funcionario, nome, sobrenome, cargo,
modificadoem, acao)
VALUES (NEW.id_funcionario, NEW.nome, NEW.sobrenome,
NEW.cargo, NOW(), "insert");
END$$
DELIMITER ;

Exemplo DELETE

DELIMITER $$
CREATE TRIGGER Delete_Funcionario
AFTER DELETE ON funcionario
FOR EACH ROW BEGIN
INSERT INTO funcionario_auditoria (id_funcionario, nome, sobrenome, cargo,
modificadoem, acao)
VALUES (OLD.id_funcionario, OLD.nome, OLD.sobrenome,
OLD.cargo, NOW(), "delete");
END$$
DELIMITER ;

DELETE FROM `funcionario` WHERE id_funcionario = 2;

ATIVIDADE 1

create table flor (


idFlor int AUTO_INCREMENT PRIMARY key, nome_flor varchar (30), preco
decimal (5,2), percentual_promocao decimal (5,2));

CREATE TABLE promocao (


idFlor int (11) NOT NULL primary key, preco_promocional decimal (5,2)
DEFAULT NULL, FOREIGN KEY (idFlor) REFERENCES flor (idFlor));

DELIMITER $$
CREATE TRIGGER Insert_Flor
AFTER INSERT ON flor
FOR EACH ROW BEGIN
INSERT INTO promocao (idFlor, preco_promocional)
VALUES (NEW.idFlor, (NEW.preco - NEW.preco * NEW.percentual_promocao));
END$$
DELIMITER ;
ATIVIDADE 2

Considerando as tabelas abaixo (que devem ser criadas por você), crie triggers conforme
solicitado a seguir:

1. Criar uma trigger para atualizar o estoque na tabela produtos toda vez que um produto
for vendido (neste exercício vender significa inserir na tabela itensvenda).
2. Criar uma trigger para atualizar o estoque na tabela produtos toda vez que um for
devolvido (neste exercício devolver significa apagar da tabela itensvenda).
3. Criar uma trigger para atualizar o estoque na tabela produtos toda vez que a quantidade
de um produto vendido for alterado (neste exercício significa alterar a quantidade na tabela
itensvenda).

CREATE TABLE itensvenda (


venda_id int DEFAULT NULL,
produto_id int DEFAULT NULL,
quantidade int DEFAULT NULL
);

CREATE TABLE produtos (produto_id int NOT NULL, descricao varchar (30)
DEFAULT NULL, estoque int NOT NULL DEFAULT 0);

CREATE TABLE itensvenda ( venda_id int DEFAULT NULL, produto_id int DEFAULT
NULL, quantidade Int DEFAULT NULL);

1.
DELIMITER $$
CREATE TRIGGER Insert_Venda
AFTER INSERT ON itensvenda
FOR EACH ROW BEGIN
UPDATE produtos SET estoque = estoque - NEW.quantidade WHERE NEW.produto_id =
produtos.produto_id;
END;
DELIMITER ;

2.
DELIMITER $$
CREATE TRIGGER atualiza_estoque
AFTER DELETE ON itensvenda
FOR EACH ROW BEGIN
UPDATE produtos SET estoque = estoque + OLD.quantidade WHERE
produtos.produto_id = OLD.produto_id;
END$$
DELIMITER ;
DELETE FROM `itensvenda` WHERE venda_id = 1;

3.
DELIMITER $$
CREATE TRIGGER update_VendasEstoque
AFTER UPDATE ON itensvenda
FOR EACH ROW BEGIN
UPDATE produtos SET estoque = estoque + OLD.quantidade - NEW.quantidade WHERE
OLD.produto_id = produtos.produto_id;
END$$
DELIMITER ;

Você também pode gostar