Exercícios de Consultas Multitabela MySQL

**Objetivos**

  • Compreender o conceito de chaves estrangeiras e implementar consultas multitabela com comandos SELECT;
  • Dominar o design de subconsultas e funções de agregação;
  • Desenvolver consultas de junção (join) eficientes.

**Ambiente Experimental**

Sistema Operacional: Windows 11

Software de Aplicação: MySQL Navicat

**Conteúdo Experimantal**

**【Parte 1】** Crie as quatro tabelas listadas abaixo:

  • departamentos (tabela de departamentos: ID do departamento, nome do departamento, localização)
  • funcionarios (tabela de funcionários: ID do funcionário, nome, cargo, ID do gestor, data de admissão, salário, ID do departamento)
  • faixa_salarial (tabela de faixas salariais: nível, salário mínimo, salário máximo)
  • financeiro (tabela financeira: ano, receita)

**【Parte 2】** Utilize comandos SQL para executar as seguintes operações:

  1. Exibir departamentos com pelo menos um funcionário, mostrando ID do departamento, nome, localização e número de funcionários.
  2. Listar todos os funcionários com salário superior ao do funcionário "João Silva".
  3. Exibir nomes de todos os funcionários e seus gestores diretos.
  4. Listar funcionários admitidos antes de seus gestores diretos, mostrando ID, nome e departamento.
  5. Exibir todos os departamentos e seus funcionários, incluindo departamentos sem funcionários.
  6. Listar todos os analistas com seus nomes, nomes de departamento e quantidade de funcionários no departamento.
  7. Exibir cargos com salário mínimo superior a R$ 15.000 e quantidade de funcionários em cada cargo.
  8. Listar funcionários do departamento de "Vendas", sem conhecer o ID do departamento.
  9. Exibir funcionários com salário acima da média da empresa, incluindo nome do departamento, gestor e faixa salarial.
  10. Listar funcionários que ocupam o mesmo cargo que "Maria Santos", incluindo nome do departamento.
  11. Exibir funcionários com salário superior a todos os funcionários do departamento 10, mostrando nome, salário e departamento.
  12. Listar quantidade de funcionários e salário médio por departamento.
  13. Exibir ano, receita e taxa de crescimento anual.

**Passos Experimentais e Resultados**

**【Passo 1】** Antes de executar os comandos SQL, realize as seguintes operações:

(1) Criar o banco de dados "empresa"

CREATE DATABASE empresa;
USE empresa;

(2) Criar as quatro tabelas

-- Tabela de departamentos
CREATE TABLE departamentos (
id_departamento INT PRIMARY KEY AUTO_INCREMENT,
nome_departamento VARCHAR(50),
localizacao VARCHAR(50)
);

-- Tabela de funcionários
CREATE TABLE funcionarios (
id_funcionario INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(50),
cargo VARCHAR(30),
id_gestor INT,
data_admissao DATE,
salario DECIMAL(10,2),
bonus DECIMAL(10,2),
id_departamento INT NOT NULL,
FOREIGN KEY (id_departamento) REFERENCES departamentos(id_departamento)
);

-- Tabela de faixas salariais
CREATE TABLE faixa_salarial (
nivel INT,
salario_minimo DECIMAL(10,2),
salario_maximo DECIMAL(10,2)
);

-- Tabela financeira
CREATE TABLE financeiro (
ano INT,
receita DECIMAL(10,2)
);

(3) Inserir dados nas tabelas

INSERT INTO departamentos VALUES (1, 'TI', 'São Paulo');
INSERT INTO departamentos VALUES (2, 'RH', 'Rio de Janeiro');
INSERT INTO departamentos VALUES (3, 'Vendas', 'Belo Horizonte');
INSERT INTO departamentos VALUES (4, 'Financeiro', 'Porto Alegre');
INSERT INTO departamentos VALUES (5, 'Operações', 'Curitiba');

INSERT INTO funcionarios VALUES (101, 'Ana Souza', 'Desenvolvedor', 105, '2020-01-15', 8500.00, NULL, 1);
INSERT INTO funcionarios VALUES (102, 'Carlos Mendes', 'Vendedor', 106, '2020-02-20', 12000.00, 2000.00, 3);
INSERT INTO funcionarios VALUES (103, 'Beatriz Lima', 'Vendedor', 106, '2020-02-22', 11000.00, 3000.00, 3);
INSERT INTO funcionarios VALUES (104, 'Daniel Costa', 'Gerente', 107, '2020-04-02', 25000.00, NULL, 1);
INSERT INTO funcionarios VALUES (105, 'Eduardo Pereira', 'Desenvolvedor', 104, '2020-09-28', 11000.00, NULL, 1);
INSERT INTO funcionarios VALUES (106, 'Fernanda Rocha', 'Gerente', 107, '2020-05-01', 24000.00, NULL, 3);
INSERT INTO funcionarios VALUES (107, 'Gabriel Almeida', 'Diretor', NULL, '2020-11-17', 42000.00, NULL, 5);
INSERT INTO funcionarios VALUES (108, 'Helena Martins', 'Analista', 104, '2022-09-01', 28000.00, NULL, 1);
INSERT INTO funcionarios VALUES (109, 'Igor Oliveira', 'Estagiário', 108, '2022-05-10', 2500.00, NULL, 2);
INSERT INTO funcionarios VALUES (110, 'Juliana Santos', 'Vendedor', 106, '2021-09-08', 13000.00, 1500.00, 3);
INSERT INTO funcionarios VALUES (111, 'Leonardo Gomes', 'Desenvolvedor', 108, '2022-03-15', 15000.00, NULL, 1);
INSERT INTO funcionarios VALUES (112, 'Mariana Ferreira', 'Analista', 104, '2021-12-03', 22000.00, NULL, 4);
INSERT INTO funcionarios VALUES (113, 'Nicolas Barbosa', 'Desenvolvedor', 108, '2021-11-20', 16000.00, NULL, 1);
INSERT INTO funcionarios VALUES (114, 'Patrícia Ribeiro', 'Gerente', 107, '2022-01-23', 26000.00, NULL, 2);
INSERT INTO funcionarios VALUES (115, 'Ricardo Teixeira', 'Auxiliar', 107, '2019-08-15', 3000.00, NULL, 5);

INSERT INTO faixa_salarial VALUES (1, 2000, 5000);
INSERT INTO faixa_salarial VALUES (2, 5000, 10000);
INSERT INTO faixa_salarial VALUES (3, 10000, 20000);
INSERT INTO faixa_salarial VALUES (4, 20000, 35000);
INSERT INTO faixa_salarial VALUES (5, 35000, 60000);

INSERT INTO financeiro VALUES (2018, 500000);
INSERT INTO financeiro VALUES (2019, 750000);
INSERT INTO financeiro VALUES (2020, 1200000);
INSERT INTO financeiro VALUES (2021, 1800000);
INSERT INTO financeiro VALUES (2022, 2500000);

**【Passo 2】** Após a criação das tabelas, execute os seguintes comandos SQL:

-- 1. Exibir departamentos com pelo menos um funcionário

SELECT d.id_departamento, d.nome_departamento, d.localizacao, COUNT(f.id_funcionario) AS num_funcionarios
FROM departamentos d
INNER JOIN funcionarios f ON d.id_departamento = f.id_departamento
GROUP BY d.id_departamento, d.nome_departamento, d.localizacao;

-- 2. Listar funcionários com salário superior ao do funcionário "Carlos Mendes"

SELECT id_funcionario, nome, salario
FROM funcionarios
WHERE salario > (SELECT salario FROM funcionarios WHERE nome = 'Carlos Mendes');

-- 3. Listar todos os funcionários e seus gestores diretos

SELECT f1.nome AS funcionario, f2.nome AS gestor
FROM funcionarios f1
LEFT JOIN funcionarios f2 ON f1.id_gestor = f2.id_funcionario;

-- 4. Listar funcionários admitidos antes de seus gestores

SELECT f1.id_funcionario, f1.nome, d.nome_departamento
FROM funcionarios f1
LEFT JOIN funcionarios f2 ON f1.id_gestor = f2.id_funcionario
LEFT JOIN departamentos d ON f1.id_departamento = d.id_departamento
WHERE f1.data_admissao < f2.data_admissao;

-- 5. Listar todos os departamentos e seus funcionários

SELECT d.nome_departamento, f.id_funcionario, f.nome, f.cargo
FROM departamentos d
LEFT JOIN funcionarios f ON d.id_departamento = f.id_departamento;

-- 6. Listar todos os analistas com seus departamentos e quantidade de funcionários

SELECT f.nome, d.nome_departamento, dept_count.total_funcionarios
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id_departamento
INNER JOIN (SELECT id_departamento, COUNT(*) AS total_funcionarios 
            FROM funcionarios 
            GROUP BY id_departamento) dept_count 
ON d.id_departamento = dept_count.id_departamento
WHERE f.cargo = 'Analista';

-- 7. Listar cargos com salário mínimo superior a R$ 15.000

SELECT cargo, COUNT(*) AS num_funcionarios
FROM funcionarios
GROUP BY cargo
HAVING MIN(salario) > 15000;

-- 8. Listar funcionários do departamento de "Vendas"

SELECT f.nome
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id_departamento
WHERE d.nome_departamento = 'Vendas';

-- 9. Listar funcionários com salário acima da média da empresa

SELECT f1.nome, d.nome_departamento, f2.nome AS gestor, fs.nivel
FROM funcionarios f1
LEFT JOIN funcionarios f2 ON f1.id_gestor = f2.id_funcionario
LEFT JOIN departamentos d ON f1.id_departamento = d.id_departamento
LEFT JOIN faixa_salarial fs ON f1.salario BETWEEN fs.salario_minimo AND fs.salario_maximo
WHERE f1.salario > (SELECT AVG(salario) FROM funcionarios);

-- 10. Listar funcionários com o mesmo cargo que "Mariana Ferreira"

SELECT f.nome, d.nome_departamento
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id_departamento
WHERE f.cargo = (SELECT cargo FROM funcionarios WHERE nome = 'Mariana Ferreira');

-- 11. Listar funcionários com salário superior a todos do departamento 1

SELECT f.nome, f.salario, d.nome_departamento
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id_departamento
WHERE f.salario > ALL (SELECT salario FROM funcionarios WHERE id_departamento = 1);

-- 12. Listar quantidade de funcionários e salário médio por departamento

SELECT d.nome_departamento, COUNT(f.id_funcionario) AS total_funcionarios, AVG(f.salario) AS media_salarial
FROM departamentos d
INNER JOIN funcionarios f ON d.id_departamento = f.id_departamento
GROUP BY d.id_departamento, d.nome_departamento;

-- 13. Exibir ano, receita e taxa de crescimento anual

SELECT f1.ano, f1.receita, 
       CONCAT(IFNULL(ROUND((f1.receita - f2.receita) / f2.receita * 100, 2), 0), '%') AS crescimento_anual
FROM financeiro f1
LEFT JOIN financeiro f2 ON f1.ano = f2.ano + 1;

Tags: MySQL SQL consultas multitabela banco de dados junções

Publicado em 7-13 22:05