├── Dockerfile ├── 010-agrupar-banco-dados.sql ├── 007-join-banco-dados.sql ├── 006-deletar-banco-dados.sql ├── 008-funcoes-agregacao-banco-dados.sql ├── 003-apagar-banco-dados.sql ├── 005-atualizar-banco-dados.sql ├── 009-procedure-banco-dados.sql ├── 001-criar-banco-dados.sql ├── 002-inserir-banco-dados.sql ├── 004-ler-banco-dados.sql └── README.md /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres:latest 2 | 3 | ENV POSTGRES_DB=db_almanaque 4 | ENV POSTGRES_USER=user 5 | ENV POSTGRES_PASSWORD=pass -------------------------------------------------------------------------------- /010-agrupar-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Vamos agora ver o comando GROUP BY 3 | é muito comum usar GROUP BY com funções de agregação 4 | */ 5 | 6 | 7 | -- 1. Agrupar utilizando COUNT. 8 | SELECT categoria, COUNT(*) 9 | FROM produtos GROUP BY categoria; 10 | 11 | 12 | -- 2. Agrupar utilizando AVG 13 | SELECT categoria, AVG(preco) 14 | FROM produtos GROUP BY categoria; 15 | 16 | 17 | -- 3. Agrupar utilizando MIN 18 | SELECT nome, MIN(nota) 19 | FROM alunos GROUP BY nome; 20 | 21 | 22 | -- 4. Agrupar utilizando MAX 23 | SELECT nome, MAX(nota) 24 | FROM alunos GROUP BY nome; 25 | 26 | 27 | -- 5. Agrupar com SUM 28 | SELECT SUM(preco), categoria 29 | FROM produtos GROUP BY categoria; 30 | 31 | 32 | -- 6. Agrupar com 2 colunas 33 | SELECT categoria, COUNT(*) AS quantidade 34 | FROM produtos GROUP BY categoria, quantidade; -------------------------------------------------------------------------------- /007-join-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Vamos explorar junção de tabelas com o comando JOIN 3 | */ 4 | 5 | -- 1. Fazendo a junção entre duas tabelas. 6 | SELECT 7 | nome_produto, 8 | nome_categoria 9 | FROM produtos p 10 | JOIN categorias c ON p.categoria_id = c.categoria_id; 11 | 12 | 13 | -- 2. Fazendo a junção dando prioridade para o lado esquerdo da equação. 14 | SELECT 15 | nome_aluno, 16 | nome_materia 17 | FROM alunos a 18 | LEFT JOIN matriculas m ON a.aluno_id = m.aluno_id; 19 | 20 | -- 3. Fazendo a junção dando prioridade para o lado direito da equação. 21 | SELECT 22 | nome_aluno, 23 | nome_materia 24 | FROM alunos a 25 | RIGHT JOIN matriculas m ON a.aluno_id = m.aluno_id; 26 | 27 | 28 | -- 4. Fazendo a junção de todos os registros mesmo sem correspondência. 29 | SELECT 30 | nome_funcionario, 31 | nome_departamento 32 | FROM funcionarios f 33 | FULL JOIN departamentos d ON f.departamento_id = d.departamento_id; 34 | -------------------------------------------------------------------------------- /006-deletar-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Agora vamos deletar colunas e tabelas com o comando DELETE 3 | NOTA: altamente desaconselhado para ser usado sem o comando WHERE. 4 | 5 | Estrutura básica: 6 | DELETE * FROM tabela WHERE condição; 7 | O comando sem * também funciona 8 | 9 | Considere usar Transaction para isso. 10 | transações garantem uma consistência de dados. 11 | */ 12 | 13 | -- Dica DELETE com Transaction 14 | BEGIN; 15 | DELETE FROM alunos; 16 | DELETE FROM matriculas; 17 | COMMIT; 18 | 19 | -- 1. Deletar tabela completa 20 | DELETE * FROM alunos; 21 | DELETE FROM alunos; 22 | 23 | 24 | -- 2. Deletar coluna com condição WHERE (deixo sem WHERE) 25 | DELETE alunos FROM materia WHERE nome = 'Física'; 26 | DELETE FROM materia WHERE nome = 'Física'; 27 | 28 | 29 | -- 3. Deletar com condionais 30 | DELETE FROM pedidos 31 | WHERE data_pedido < '2022-01-01' OR status_pedido = 'Cancelado'; 32 | 33 | 34 | -- 4. Deletar com JOIN 35 | DELETE p FROM pedidos AS p 36 | JOIN produtos AS prod ON p.produto_id = prod.id 37 | WHERE prod.status_categoria = 'Descontinuado'; 38 | -------------------------------------------------------------------------------- /008-funcoes-agregacao-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Aqui veremos funções de agregação úteis como: 3 | - AVG 4 | - COUNT 5 | - MAX 6 | - MIN 7 | - SUM 8 | */ 9 | 10 | -- 1. Comando AVG é usado para obter a média dos dados 11 | SELECT AVG(preco) FROM produtos; 12 | DELETE FROM produtos WHERE AVG(preco) > 30000; 13 | 14 | 15 | -- 2. Comando COUNT retorna a quantidade de linhas 16 | SELECT COUNT(id) FROM jogadores; 17 | UPDATE jogadores SET campeao = TRUE WHERE COUNT(vitoria) > 10; 18 | 19 | 20 | -- 3. Comando MAX retorna o maior valor 21 | DELETE FROM jogadores WHERE MAX(vitoria) < 5; 22 | UPDATE FROM carros SET estado = 'Semi novo' WHERE MAX(quilometragem) < 10000; 23 | 24 | 25 | -- 4. Comando MIN retorna o menor valor 26 | SELECT MIN(quilometragem) FROM carros; 27 | UPDATE carros SET estado = 'usado' WHERE MIN(quilometragem) > 10000; 28 | 29 | 30 | -- 5. Comando SUM retorna a soma dos valores 31 | SELECT SUM(quilometragem) FROM carros; 32 | UPDATE produto SET preco = preco * 0.9 WHERE SUM(preco) > 1000; 33 | 34 | 35 | -- 6. Comando HAVING e usado para filtrar os dados 36 | SELECT * FROM carros WHERE estado = 'novo' GROUP BY estado HAVING SUM(quilometragem) > 10000; 37 | -------------------------------------------------------------------------------- /003-apagar-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Exemplos do comando DROP 3 | **Cuidado ao usar DROP DATABASE:** Essa operação exclui todos os dados do banco de dados. 4 | Como é algo didático é apresentado todos os casos de uso PORÉM em um ambiene de produção 5 | é ALTAMENTE REVISAR O COMANDO, na maioria das vezes você irá utilizar na consulta o comando 6 | WHERE. 7 | */ 8 | 9 | -- 1. Dropar tabela 10 | DROP TABLE nome_tabela; 11 | 12 | 13 | -- 2. Dropar banco de dados 14 | DROP DATABASE nome_banco_de_dados; 15 | 16 | 17 | -- 3. Dropar view 18 | DROP VIEW nome_view; 19 | 20 | 21 | -- 4. Dropar function 22 | DROP FUNCTION nome_funcao; 23 | 24 | 25 | -- 5. Dropar procedure 26 | DROP PROCEDURE nome_procedure; 27 | 28 | 29 | -- 6. Dropar índice 30 | DROP INDEX index_cliente_nome; 31 | 32 | 33 | -- 7. Dropar esquema 34 | DROP SCHEMA nome_esquema_auxiliar; 35 | 36 | 37 | -- 8. Dropar um tipo de dado 38 | DROP TYPE nome_tipo_de_dado; 39 | 40 | 41 | -- 9. Dropar um trigger 42 | DROP TRIGGER trg_atualizar_estoque ON produtos; 43 | 44 | 45 | -- 10. Dropar uma role 46 | DROP ROLE usuario_leitura; 47 | 48 | 49 | -- 11. Dropar uma constraint 50 | ALTER TABLE pedidos DROP CONSTRAINT chk_valor_total_positivo; -------------------------------------------------------------------------------- /005-atualizar-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Agora vamos atualizar colunas e tabelas com o comando UPDATE 3 | NOTA: altamente desaconselhado para ser usado sem o comando WHERE. 4 | 5 | Estrutura básica: 6 | UPDATE nome_da_tabela 7 | SET coluna1 = novo_valor1, coluna2 = novo_valor2, ... 8 | WHERE condição; 9 | 10 | Considere usar Transaction para isso. 11 | transações garantem uma consistência de dados. 12 | */ 13 | 14 | -- Dica com Transaction 15 | BEGIN; 16 | UPDATE tabela SET coluna = novo_valor; 17 | COMMIT; 18 | 19 | -- 1. Atualizando uma tabela 20 | UPDATE jogadores SET nome_jogador = 'Lucas Moura'; 21 | 22 | 23 | -- 2. Atualizando uma coluna 24 | UPDATE jogadores SET numero_camisa = 10 WHERE nome_jogador = 'Lucas Moura'; 25 | 26 | 27 | -- 3. Atualizando múltiplas colunas 28 | UPDATE produtos 29 | SET desconto = preco * 0.2, preco_parcelado = preco * 0.8 30 | WHERE categorias = 'Eletronicos'; 31 | 32 | 33 | -- 4. Atualizando colunas com Subconsultas 34 | UPDATE produtos 35 | SET status = 'Enviado' 36 | WHERE id IN (SELECT id FROM pedidos WHERE data_envio < '2022-01-01'); 37 | 38 | 39 | -- 5. Atualizando colunas com JOIN 40 | UPDATE pedidos AS p 41 | JOIN clientes AS c ON p.cliente_id = c.id 42 | SET p.status = 'Cancelado' 43 | WHERE c.ativo = false; 44 | 45 | 46 | -- 6. Atualizando com expressão 47 | UPDATE pedidos AS p 48 | SET preco = preco - (preco * 0.1) 49 | WHERE categoria = 'Livros'; 50 | 51 | 52 | -- 7. Atualizando com função agregada 53 | UPDATE usuarios SET data_atualizacao = NOW() WHERE id = 101; -------------------------------------------------------------------------------- /009-procedure-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Agora vamos ver como criar uma procedure. 4 | 5 | Procedure são úteis quando queremos "automatizar" uma tarefa, 6 | uma tarefa que executamos repetidas vezes como gerar um relatório por exemplo. 7 | */ 8 | 9 | 10 | -- 1. Procedimento para calcular o bonus de um departamento com SELECT 11 | CREATE PROCEDURE calcular_bonus(departamento_id INTEGER) 12 | AS 13 | BEGIN 14 | SELECT AVG(salario) AS media_salarios 15 | FROM funcionarios 16 | WHERE departamento = departamento_id; 17 | END; 18 | 19 | -- 1.2 Chamando procedimento 20 | CALL calcular_bonus(2); 21 | 22 | 23 | 24 | -- 2. Procedimento para calcular o bonus de um departamento com UPDATE 25 | CREATE PROCEDURE atualizar_bonus(departamento_id INTEGER) 26 | AS 27 | BEGIN 28 | UPDATE departamentos 29 | SET bonus = ( 30 | SELECT AVG(salario) AS media_salario 31 | FROM funcionarios WHERE departamento = departamento_id 32 | ); 33 | END; 34 | 35 | -- 2.2 Chamando procedimento 36 | CALL atualizar_bonus(2); 37 | 38 | 39 | -- 3. Procedimento para excluir um funcionário 40 | CREATE PROCEDURE demitir_funcionario(id INTEGER) 41 | AS 42 | BEGIN 43 | DELETE FROM funcionarios WHERE id = id; 44 | END; 45 | 46 | -- 3.2 Chamando procedimento 47 | CALL demitir_funcionario(3) 48 | 49 | 50 | -- 4. Criando procedimento para inserir novo funcionario 51 | CREATE OR REPLACE PROCEDURE inserir_cliente(nome TEXT, email TEXT) 52 | AS 53 | BEGIN 54 | INSERT INTO clientes (nome, email) 55 | VALUES (nome, email); 56 | END; 57 | 58 | -- 4.2 Chamando procedimento 59 | CALL inserir_cliente('Joaquim', 'joaquim@joaquim') -------------------------------------------------------------------------------- /001-criar-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Nós já criamos o banco em nosso arquivo Dockerfile, mas caso não tivéssemos criado o comando 3 | abaixo para criação 4 | 5 | Vejamos casos de uso para o comando CREATE. 6 | */ 7 | 8 | -- NOTA: Conectar ao banco de dados recém-criado 9 | \c db_almanaque 10 | 11 | 12 | -- 1. Criando o database 13 | CREATE DATABASE db_almanaque; 14 | 15 | 16 | -- 2. Criando a tabela 17 | CREATE TABLE carros ( 18 | id SERIAL PRIMARY KEY, 19 | marca VARCHAR(100) NOT NULL, 20 | modelo VARCHAR(100) NOT NULL, 21 | ano INT NOT NULL 22 | ); 23 | 24 | 25 | -- 3. Criando tabela com chave estrangeira 26 | CREATE TABLE pedidos ( 27 | id SERIAL PRIMARY KEY, 28 | cliente_id INTEGER NOT NULL REFERENCES clientes(id) ON DELETE CASCADE ON UPDATE CASCADE, 29 | data_pedido DATE, 30 | valor NUMERIC(10,2) 31 | ); 32 | 33 | 34 | -- 4. Criar uma view 35 | CREATE VIEW vw_carros_por_marca AS 36 | SELECT marca, COUNT(*) AS total_carros 37 | FROM carros 38 | GROUP BY marca; 39 | 40 | 41 | -- 5. Criar uma função 42 | CREATE FUNCTION calcular_idade(data_nascimento DATE) 43 | RETURNS INT AS $$ 44 | SELECT AGE(CURRENT_DATE, data_nascimento); 45 | $$ LANGUAGE SQL; 46 | 47 | 48 | -- 6. Criar uma procedure 49 | CREATE PROCEDURE inserir_cliente(nome TEXT, email TEXT) 50 | LANGUAGE plpgsql AS 51 | $$ 52 | BEGIN 53 | INSERT INTO clientes (nome, email) VALUES (nome, email); 54 | END; 55 | $$; 56 | 57 | 58 | -- 7. Criar um índice 59 | CREATE INDEX idx_pedidos_data ON pedidos (data_pedido); 60 | 61 | 62 | -- 8. Criar um tipo de dado 63 | CREATE TYPE endereco AS ( 64 | rua VARCHAR(100), 65 | numero INTEGER, 66 | cidade VARCHAR(100) 67 | ); 68 | 69 | 70 | -- 9. Criar um esquema 71 | CREATE SCHEMA esquema_auxiliar; 72 | 73 | 74 | -- 10. Criar uma extensão 75 | CREATE EXTENSION postgis; -------------------------------------------------------------------------------- /002-inserir-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Comando INSERT INTO 3 | 4 | */ 5 | 6 | -- Sintaxe: 7 | INSERT INTO nome_tabela (coluna1, coluna2, ...) 8 | VALUES (valor1, valor2, ...); 9 | 10 | -- 1. Inserir um único registro em uma tabela 11 | INSERT INTO carros (nome, marca, modelo, vendido, ano) 12 | VALUES ('Civic', 'Honda', 'Sedan', FALSE, 2019); 13 | 14 | 15 | -- 2. Inserir múltiplos registros com valores explícitos 16 | INSERT INTO carros (nome, marca, modelo, vendido, ano) 17 | VALUES 18 | ('Civic', 'Honda', 'Sedan', FALSE, 2019), 19 | ('Gol', 'Volkswagen', 'Hatchback', TRUE, 2017), 20 | ('Sentra', 'Nissan', 'Sedan'. FALSE, 2022); 21 | 22 | 23 | -- 3. Inserir dados de outra tabela 24 | INSERT INTO carros_vendidos (nome, marca, vendido, ano) 25 | SELECT nome, marca, vendido, ano FROM carros WHERE vendido = TRUE; 26 | 27 | 28 | -- 4. Inserir dados de um subconsulta 29 | INSERT INTO pedidos (cliente_id, produto_id, quantidade) 30 | SELECT c.id, p.id, 10 31 | FROM clientes c 32 | JOIN produtos p ON c.id = p.cliente_id 33 | WHERE p.categoria == "Eletrônicos"; 34 | 35 | 36 | -- 5. Inserir dados gerados de uma função 37 | INSERT INTO logs_emprestimos (livro, usuario, data_emprestimo) 38 | VALUES ('O Senhor dos Anéis', 'João Silva', NOW()); 39 | 40 | 41 | -- 6. Inserir dados a partir de um arquivo CSV (exemplo com psql) 42 | \copy carros (nome, marca, modelo, vendido, ano) FROM 'carros.csv' CSV HEADER; 43 | 44 | 45 | -- 7. Inserir dados a partir de um arquivo JSON (exemplo com psql) 46 | \copy carros (nome, marca, modelo, vendido, ano) FROM 'carros.json' CSV HEADER; 47 | 48 | 49 | -- 8. Inserir dados com valores padrão 50 | INSERT INTO usuarios (nome, email) 51 | VALUES ('Novo usuario', 'novousuario@novoemail.com'); 52 | 53 | 54 | -- 9. Inserir dados gerados de uma sequência 55 | CREATE SEQUENCE seq_pedidos; 56 | INSERT INTO pedidos (id, cliente_id, produto_id, quantidade) 57 | VALUES (nextval('seq_pedidos'), 1, 2, 5); -------------------------------------------------------------------------------- /004-ler-banco-dados.sql: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Vamos explorar mais o comando SELECT, para ler os dados de um banco de dados. 4 | 5 | */ 6 | 7 | -- Sintaxe: 8 | SELECT colunas FROM nome_tabela; 9 | 10 | -- 1. Ler todos os dados de uma tabela 11 | SELECT * FROM nome_tabela; 12 | 13 | 14 | -- 2. Ler dados de colunas em uma tabela 15 | SELECT coluna1, coluna2 FROM nome_tabela; 16 | 17 | 18 | -- 3. Ler dados em uma coluna com alias 19 | SELECT nome AS funcionario, funcao AS cargo FROM nome_tabela; 20 | 21 | 22 | -- 4. Ler dados com ordenação 23 | SELECT * FROM carros ORDER BY ano DESC; 24 | 25 | 26 | -- 5. Ler dados com WHERE 27 | SELECT * FROM carros WHERE ano > 2020; 28 | 29 | 30 | -- 6. Ler dados utilizando operadores 31 | SELECT * FROM carros WHERE marca == 'Nissa' AND ano > 2020; 32 | SELECT * FROM carros WHERE marca == 'Nissa' OR ano > 2020; 33 | SELECT * FROM carros WHERE NOT vendido; 34 | 35 | 36 | -- 7. Ler dados com LIKE (esse comando busca respostas que contenham os parametros informados) 37 | SELECT * FROM carros WHERE marca LIKE 'Nissa'; 38 | SELECT * FROM carros WHERE marca LIKE '%issa'; 39 | SELECT * FROM carros WHERE marca LIKE 'Nissa%'; 40 | SELECT * FROM carros WHERE marca LIKE '%issa%'; 41 | 42 | 43 | -- 8. Ler dados com BETWEEN 44 | SELECT * FROM carros WHERE ano BETWEEN 2010 AND 2020; 45 | 46 | 47 | -- 9. Ler dados com IN 48 | SELECT * FROM carros WHERE marca IN ('Nissa', 'Fiat', 'Ford'); 49 | 50 | 51 | -- 10. Ler dados com LIMIT 52 | SELECT * FROM carros LIMIT 5; 53 | 54 | 55 | -- 11. Ler dados com funções agregagadas 56 | SELECT COUNT(*) FROM carros; -- Conta quantos registros tem 57 | SELECT AVG(ano) FROM carros; -- Calcular a média do ano 58 | 59 | 60 | -- 12. Ler dados com Subconsultas e funções agregadas 61 | SELECT marca, COUNT(*) AS qtd_carros WHERE ano > (SELECT AVG(ano) FROM carros); 62 | 63 | 64 | -- 13. Ler dados com Join 65 | SELECT c.nome, m.nome AS modelo_nome 66 | FROM carros c 67 | JOIN modelos m ON c.modelo_id = m.id; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
Aqui será seu guia e referência de SQL, com comandos rápidos para que você apenas batendo o olho lembre-se do que é necessário.
10 | 11 | 12 | 13 | ## Pedágio 14 | 15 | Primeiramente, quero que saiba que será disponibilizado um arquivo Dockerfile contendo uma imagem base do PostgreSQL. Eu utilizarei o programa DBeaver para manipular o banco de dados com interface gráfica, mas sinta-se a vontade de utilizar o que você desejar. PS: Alguns comandos podem ser diferentes para cada banco de dados, neste caso utilizamos PostgreSQL então pesquise a documentação. 16 | 17 | 18 | 19 | ## Passo #1 20 | 21 | Primeiro siga o passos de instalação do DBeaver 22 | 23 | 24 | ## Passo #2 25 | 26 | Você tem o docker instalado? Caso a resposta seja não, Siga as instruções 27 | 28 | 29 | ## Passo #3 30 | Com o docker instalado, execute o seguinte comando (dentro do diretório do arquivo Dockerfile): 31 | ``` 32 | docker build -t db-almanaque . 33 | ``` 34 | e depois: 35 | 36 | ``` 37 | docker run -p 5432:5432 db-almanaque 38 | ``` 39 | 40 | ## Passo #4 41 | Agora você pode acessar o DBeaver, Shift + Ctrl + N nessa nova conexão 42 | selecione o postgreSQL, você irá prencher essas informações: 43 | 44 | ``` 45 | banco de dados: db_almanaque 46 | nome de usuário: user 47 | senha: pass 48 | ``` 49 | clique em finilizar (finish). Depois clique em SQL 50 | a partir daqui, você irá acompanhar pelos arquivos com a extensão .sql. 51 | 52 | 53 | 54 | 55 | 56 | # Como Contribuir 57 | Estou aberto para contribuições! Se você deseja contribuir, siga os passos abaixo: 58 | 59 | 1. Faça um fork do projeto. 60 | 2. Crie uma branch para sua feature (git checkout -b feature/nova-feature). 61 | 3. Faça commit das suas alterações (git commit -m 'Adiciona nova feature'). 62 | 4. Faça push para a branch (git push origin feature/nova-feature). 63 | 5. Abra um Pull Request. --------------------------------------------------------------------------------