Skip to content

Instantly share code, notes, and snippets.

@ANDREHORMAN1994
Last active September 15, 2023 19:34
Show Gist options
  • Save ANDREHORMAN1994/466b4244178efbed256f64e13d1b528b to your computer and use it in GitHub Desktop.
Save ANDREHORMAN1994/466b4244178efbed256f64e13d1b528b to your computer and use it in GitHub Desktop.
RESUMÃO SQL

RESUMÃO MySQL

O que é SQL?

Existe dois tipos de Bancos de Dados, entre eles o Relacional e Não Relacional, pra isso existe ferramentas conhecidas como SGBD, sistemas de gerenciamento de banco de dados:

  • Relacionais: Tabelas pré-definidas, sem alteração dinâmica, previsível e usa a linguagem SQL;

  • Não Relacionais: Estrutura pré-definida não obrigatória, estrutura dinâmica e não existe linguagem oficial;

SQL é a linguagem usada para criar, pesquisar, extrair e também manipular dados dentro de um banco de dados relacional. Para que isso seja possível, existem comandos como o SELECT, UPDATE, DELETE, INSERT e WHERE, entre outros que são fundamentais.

1. Comandos de instalação do MySQL

Para iniciar, você pode se conectar ao MySQL usando os seguintes comandos:

# Atualizar os softwares do sistema;
sudo apt update

# Instalar o servidor do mySQL;
sudo apt install mysql-server

# Visualizar o status do servidor;
sudo systemctl status mysql

# Parar o servidor;
sudo systemctl stop mysql

# Iniciar o servidor;
sudo systemctl start mysql

# Desabilitar o servidor para não iniciar junto com o PC, assim não consome muita memória RAM;
sudo systemctl disable mysql

# Habilitar o servidor para iniciar junto com o PC;
sudo systemctl enable mysql

1.1 Definindo uma senha

Substitua root pelo seu nome de usuário MySQL. Você será solicitado a inserir sua senha.

# Acessando o Banco, usando as flags -u de user, -p de password;
sudo mysql -u root -p

# Para alterar a senha utiliza o comando dentro do SQL:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'sua_senha_aqui'; flush privileges;

# Exemplo:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234'; flush privileges;

1.2 Instalando uma interface gráfica

2. Criar um Banco de Dados

Por convenção, utilizamos as palavras chave do SQL em caixa alta para diferenciar das indicações de tabelas e colunas. E o ponto e vírgula no final para o comando funcionar. Dessa forma, para criar um novo banco de dados, use o comando CREATE DATABASE:

# Criando um banco chamado minha_base
CREATE DATABASE minha_base;

# Para listar os bancos
SHOW DATABASES;

# Para excluir um banco de dados
DROP DATABASE minha_base;

# Escolher o Banco a ser usado
USE minha_base;

# Mostrar Tabelas
SHOW TABLES;

# Visualizar estrutura de uma tabela chamada products
DESCRIBE products;

# Excluindo uma tabela products
DROP TABLE products;

# Excluindo apenas os registros dentro da tabela products
TRUNCATE TABLE products;

3. Criar uma Tabela

Agora, você pode criar uma tabela dentro do banco de dados selecionado. Aqui está um exemplo:

CREATE TABLE usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(50),
    email VARCHAR(100)
);

Este exemplo cria uma tabela chamada usuarios com três colunas: "id", "nome" e "email".

4. Inserir Dados

Você pode inserir dados em sua tabela usando o comando INSERT INTO:

INSERT INTO nome_da_tabela (coluna1, coluna2)
VALUES ('valor_coluna1', 'valor_coluna2');

Dessa forma, podemos inserir na coluna nome_da_tabela os valores em suas colunas correspondentes. Apesar de ser possível inserir novos valores sem especificar os nomes das colunas, é uma boa prática sempre especificá-los.

# Exemplos
INSERT INTO usuarios (nome, email) VALUES ('João', 'joao@example.com');
INSERT INTO usuarios (nome, email) VALUES ('Maria', 'maria@example.com');

4.1 INSERT IGNORE

Podemos ignorar os erros durante a inserção usando o INSERT IGNORE . Por exemplo evitando erros como duplicidade de primary keys.

INSERT IGNORE INTO 
	pessoas (id, name)
VALUES
	(4,'Gloria'), 	-- Sem o IGNORE, essa linha geraria um erro e o INSERT não continuaria.
	(5,'Amanda');

4.2 INSERT SELECT (Inserindo dados de uma outra tabela)

É possível inserir dados a partir de outra tabela usando INSERT INTO SELECT

INSERT INTO tabelaA (coluna1, coluna2)
    SELECT tabelaB.coluna1, tabelaB.coluna2
    FROM tabelaB
    WHERE tabelaB.nome_da_coluna <> 'algumValor'
    ORDER BY tabelaB.coluna_de_ordenacao;

Assim, estaríamos extraindo a colunaA e a colunaB da tabelaB e as inserindo na tabelaA , de acordo com a condição que for passada no WHERE.

É possível usar também SELECT * FROM e copiar todos os dados de todas as colunas de uma tabela para outra, mas nessa situação a tabelaA e a tabelaB precisam obrigatoriamente possuir a mesma quantidade de colunas, e os tipos de dados das colunas correspondentes devem ser iguais.

5. Consultar Dados

Use o comando SELECT para recuperar dados de sua tabela:

SELECT * FROM usuarios;

Isso retornará todos os registros da tabela "usuarios".

6. Atualizar Dados

Para atualizar dados existentes, utilize o comando UPDATE:

UPDATE nome_da_tabela
SET propriedade_a_ser_alterada = 'novo valor para coluna'
WHERE alguma_condicao; -- importantíssimo aplicar o WHERE para não alterar a tabela inteira!

Uma curiosidade sobre o UPDATE e o DELETE no MySQL Server é que, por padrão, existe uma configuração chamada safe updates mode que só vai te permitir executá-los caso eles incluam quais IDs devem ser modificados. Então, caso você tente fazer a query SET SQL_SAFE_UPDATES = 1, ela não funcionaria por não incluir o ID.

# Exemplo
UPDATE usuarios SET email = 'novo_email@example.com' WHERE nome = 'João';

Isso atualiza o email do usuário com o nome "João". Você pode consultar novamente para ter certexa usando o SELECT.

6.1 UPDATE e CASE

Você pode usar a cláusula CASE em uma instrução UPDATE para realizar atualizações condicionais.

UPDATE sakila.actor
SET first_name = (
  CASE actor_id
    WHEN 1 THEN 'JOE' -- se actor_id = 1, alterar first_name para 'JOE'
    WHEN 2 THEN 'DAVIS' -- se actor_id = 2, alterar first_name para 'DAVIS'
    WHEN 3 THEN 'CAROLINE' -- se actor_id = 3, alterar first_name para 'CAROLINE'
  END);

7. Excluir Dados

Para excluir registros, use o comando DELETE:

DELETE FROM usuarios WHERE nome = 'Maria';

Isso exclui o registro da tabela onde o nome é "Maria".

8. Consultas com Condições

Você pode realizar consultas mais avançadas usando condições, como o WHERE e o LIKE:

  • WHERE - É utilizado para filtrar consultas.
  • LIKE - É usado para buscar padrões de texto. Dois operadores são usados em conjunto com o LIKE, o operador % e o _
  • % - O sinal de percentual pode representar zero, um ou múltiplos caracteres dentro do texto;
  • _ - O underscore (às vezes chamado de underline) representa um único caractere;
# Exemplo filtrando produtos com preços maiores que 50
SELECT * FROM produtos
WHERE preco > 50;

# Exemplo filtrando usuários com emails que contenham "@example.com"
SELECT nome FROM usuarios
WHERE email LIKE '%@example.com%';

# Exemplo filtrando usuários que começam com a letra A
SELECT * FROM usuarios
WHERE nome LIKE 'A%';

# Exemplo filtrando usuários que começam com a letra M e possuem exatamente cinco letras
SELECT * FROM usuarios
WHERE nome LIKE 'M____';

9. Ordenar e Limitar Resultados

Você pode ordenar resultados usando o comando ORDER BY e limitar o número de resultados com LIMIT:

SELECT * FROM usuarios ORDER BY nome ASC LIMIT 5;

Isso retorna os primeiros 5 registros da tabela "usuarios" ordenados por nome em ordem crescente.

10. Operadores Lógicos

=  		  IGUAL
>   		MAIOR QUE
<   		MENOR QUE
>=  		MAIOR QUE OU IGUAL
<=  		MENOR QUE OU IGUAL
<>  		DIFERENTE DE
AND 		OPERADOR LÓGICO E
OR  		OPERADOR LÓGICO OU
NOT 		NEGAÇÃO
IS  		COMPARA COM VALORES BOOLEANOS (TRUE, FALSE, NULL)

11. IN e BETWEEN

É possível juntar várias condições nas suas queries usando os operadores AND e OR. No entanto, você ainda terá que digitar cada condição separadamente, como no exemplo a seguir:

SELECT 
	* FROM sakila.actor
WHERE 
	first_name = 'PENELOPE'
	OR first_name = 'NICK'
	OR first_name = 'ED'
	OR first_name = 'JENNIFER';

Uma forma melhor de fazer essa mesma pesquisa seria usando o IN:

SELECT 
	* FROM sakila.actor
WHERE 
	first_name IN ('PENELOPE','NICK','ED','JENNIFER');

Uma outra opção quando queremos trabalhar com faixas de resultados é o BETWEEN, que torna possível fazer pesquisas dentro de uma faixa inicial e final.

# Filtrando título com tamanho de caracteres entre 50 e 120
SELECT title, length FROM sakila.film
WHERE length BETWEEN 50 AND 120;

# Filtrando linguagens com valores entre Italian e Mandarin
SELECT * FROM sakila.language
WHERE name BETWEEN 'Italian' AND 'Mandarin'
ORDER BY name;

# Filtrando valores entre uma data inicial e final
SELECT rental_id, rental_date FROM sakila.rental
WHERE rental_date
BETWEEN '2005-05-27' AND '2005-07-17';

12. Manipulação de STRING

É possível alterar frases completas com alguns dos seguintes comandos

-- Converte o texto da string para CAIXA ALTA
SELECT UCASE('Oi, eu sou uma string');

-- Converte o texto da string para caixa baixa
SELECT LCASE('Oi, eu sou uma string');

-- Substitui as ocorrências de uma substring em uma string
SELECT REPLACE('Oi, eu sou uma string', 'string', 'cadeia de caracteres');

-- Retorna a parte da esquerda de uma string de acordo com o
-- número de caracteres especificado
SELECT LEFT('Oi, eu sou uma string', 3);

-- Retorna a parte da direita de uma string de acordo com o
-- número de caracteres especificado
SELECT RIGHT('Oi, eu sou um string', 6);

-- Exibe o tamanho, em caracteres, da string
SELECT LENGTH('Oi, eu sou uma string');

-- Extrai parte de uma string de acordo com o índice de um caractere inicial
-- e a quantidade de caracteres a extrair
SELECT SUBSTRING('Oi, eu sou uma string', 5, 2);

-- Se a quantidade de caracteres a extrair não for definida,
-- então a string será extraída do índice inicial definido, até o seu final
SELECT SUBSTRING('Oi, eu sou uma string', 5);

Algo importante a se notar sobre strings em SQL é que, diferente de várias linguagens de programação, no SQL strings são indexadas a partir do índice 1 e não no índice 0. Caso tenha resultados inesperados, essa pode ser uma das razões.

13. Condicionais

Em linguagens de alto nível como Python , JavaScript e outras, as condicionais são a base para a criação de algorítimos dinâmicos que se adaptam de acordo com a necessidade do programa.

O SQL não fica para trás nesse quesito, sendo possível nele também usar os principais comandos de controle de fluxo, como o IF e o CASE.

13.1 IF (CONDIÇÃO, TRUE, FALSE)

-- Sintaxe:
SELECT IF(condicao, valor_se_verdadeiro, valor_se_falso);

SELECT IF(idade >= 18, 'Maior de idade', 'Menor de Idade')
FROM pessoas;

SELECT IF(aberto, 'Entrada permitida', 'Entrada não permitida')
FROM estabelecimentos;

-- Exemplo utilizando o banco sakila:
SELECT first_name, IF(active, 'Cliente Ativo', 'Cliente Inativo') AS status
FROM sakila.customer
LIMIT 20;

13.2 CASE WHEN THEN ELSE END

-- Sintaxe:
SELECT CASE
  WHEN condicao THEN valor
  ELSE valor padrao
END;

-- Exemplo básico
SELECT
    nome,
    nivel_acesso,
    CASE
        WHEN nivel_acesso = 1 THEN 'Nível de acesso 1'
        WHEN nivel_acesso = 2 THEN 'Nível de acesso 2'
        WHEN nivel_acesso = 3 THEN 'Nível de acesso 3'
        ELSE 'Usuário sem acesso'
    END AS nivel_acesso
FROM permissoes_usuario;

-- Exemplo utilizando a tabela sakila.film:
SELECT
    first_name,
    email,
    CASE
        WHEN email = 'MARY.SMITH@sakilacustomer.org' THEN 'Cliente de baixo valor'
        WHEN email = 'PATRICIA.JOHNSON@sakilacustomer.org' THEN 'Cliente de médio valor'
        WHEN email = 'LINDA.WILLIAMS@sakilacustomer.org' THEN 'Cliente de alto valor'
        ELSE 'não classificado'
    END AS valor
FROM sakila.customer
LIMIT 10;

14. Funções Matemáticas

Adição, Subtração, Multiplicação e Divisão.

Para as operações matemáticas mais comuns, podemos empregar os operadores matemáticos usuais.

SELECT 5 + 5;
SELECT 5 - 5;
SELECT 5 * 5;
SELECT 5 / 5;

O DIV retorna o resultado inteiro de uma divisão, ignorando as casas decimais de um número. Veja os exemplos abaixo:

SELECT 10 DIV 3; -- 3
SELECT 10 DIV 2; -- 5
SELECT 14 DIV 3; -- 4
SELECT 13 DIV 2; -- 6

Já o operador MOD retorna o resto de uma divisão como resultado. Por exemplo:

SELECT 10 MOD 3; -- 1
SELECT 10 MOD 2; -- 0
SELECT 14 MOD 3; -- 2
SELECT 13 MOD 2; -- 1
SELECT 10.5 MOD 2; -- 0.5, ou seja, 2 + 2 + 2 + 2 + 2 = 10, restando 0.5

O ROUND arredonda os números de acordo com sua parte decimal. Se for maior ou igual a 0.5, o resultado é um arredondamento para cima. Caso contrário, ocorre um arredondamento para baixo. Veja os exemplos abaixo:

-- Podemos omitir ou especificar quantas casas decimais queremos
SELECT ROUND(10.4925); -- 10
SELECT ROUND(10.5136); -- 11
SELECT ROUND(-10.5136); -- -11
SELECT ROUND(10.4925, 2); -- 10.49
SELECT ROUND(10.4925, 3); -- 10.493

O arredondamento sempre para cima pode ser feito com o CEIL :

SELECT CEIL(10.51); -- 11
SELECT CEIL(10.49); -- 11
SELECT CEIL(10.2); -- 11

O arredondamento sempre para baixo pode ser feito com o FLOOR :

SELECT FLOOR(10.51); -- 10
SELECT FLOOR(10.49); -- 10
SELECT FLOOR(10.2); -- 10

Para cálculos de exponenciação e raiz quadradas, podemos utilizar as funções POW e SQRT , respectivamente.

Elevando um número X à potência Y usando a função POW :

SELECT POW(2, 2); -- 4
SELECT POW(2, 4); -- 16

Encontrando a raiz quadrada de um valor usando SQRT :

SELECT SQRT(9); -- 3
SELECT SQRT(16); -- 4

Para gerar valores aleatórios pode utilziar o RAND :

-- Para gerar um valor aleatório entre 0 e 1:
SELECT RAND();

-- Para gerar um valor entre 7 e 13:
-- O cálculo realizado: (7 + (0.0 a 1.0 * 6))
SELECT ROUND(7 + (RAND() * 6));

Podemos consultar a data e hora atuais usando as seguintes funções:

SELECT CURRENT_DATE(); -- YYYY-MM-DD
SELECT NOW(); -- YYYY-MM-DD HH:MM:SS

Podemos descobrir a diferença em dias entre duas datas usando o DATEDIFF e a diferença de tempo entre dois horários usando o TIMEDIFF

Em ambos os casos, o segundo valor é subtraído do primeiro para calcular o resultado.

-- 30, ou seja, a primeira data é 30 dias depois da segunda
SELECT DATEDIFF('2020-01-31', '2020-01-01');

-- -30, ou seja, a primeira data é 30 dias antes da segunda
SELECT DATEDIFF('2020-01-01', '2020-01-31');

-- -01:00:00, ou seja, há 1 hora de diferença entre os horários
SELECT TIMEDIFF('08:30:10', '09:30:10');

14.1 Funções de Agregação AVG , MIN , MAX , SUM E COUNT

Usando a coluna replacement_cost (valor de substituição) como teste, podemos encontrar:

SELECT AVG(replacement_cost) FROM sakila.film; 
-- 19.984000 (Média entre todos registros)

SELECT MIN(replacement_cost) FROM sakila.film; 
-- 9.99 (Menor valor encontrado)

SELECT MAX(replacement_cost) FROM sakila.film; 
-- 29.99 (Maior valor encontrado)

SELECT SUM(replacement_cost) FROM sakila.film; 
-- 19984.00 (Soma de todos registros)

SELECT COUNT(replacement_cost) FROM sakila.film; 
-- 1000 registros encontrados (Quantidade)

14.2 GROUP BY E HAVING

Os resultados de uma query podem ser agrupados por uma ou mais colunas usando o GROUP BY , o que faz com que todos os registros que têm o mesmo valor para tais colunas sejam exibidos juntos.

O GROUP BY também pode ser usado em conjunto com as funções de agregação que vimos anteriormente.

SELECT coluna(s) FROM tabela
GROUP BY coluna(s);

-- Média de duração de filmes agrupados por classificação indicativa
SELECT rating, AVG(length)
FROM sakila.film
GROUP BY rating;

-- Valor mínimo de substituição dos filmes agrupados por classificação indicativa
SELECT rating, MIN(replacement_cost)
FROM sakila.film
GROUP BY rating;

-- Valor máximo de substituição dos filmes agrupados por classificação indicativa
SELECT rating, MAX(replacement_cost)
FROM sakila.film
GROUP BY rating;

-- Custo total de substituição de filmes agrupados por classificação indicativa
SELECT rating, SUM(replacement_cost)
FROM sakila.film
GROUP by rating;

Podemos usar o HAVING para filtrar resultados agrupados, assim como usamos o SELECT...WHERE para filtrar resultados individuais.

SELECT first_name, COUNT(*)
FROM sakila.actor
GROUP BY first_name
HAVING COUNT(*) > 2;

-- Ou, melhor ainda, usando o AS para dar nomes às colunas de agregação,
-- melhorando a leitura do resultado
SELECT first_name, COUNT(*) AS nomes_cadastrados
FROM sakila.actor
GROUP BY first_name
HAVING nomes_cadastrados > 2;

-- Observação: o alias não funciona com strings para o HAVING,
-- então use o underline ("_") para separar palavras
-- Ou seja, o exemplo abaixo não vai funcionar
SELECT first_name, COUNT(*) AS 'nomes cadastrados'
FROM sakila.actor
GROUP BY first_name
HAVING 'nomes cadastrados' > 2;

15. JOINS, UNIONS E SUBQUERIES

A ideia do JOIN é permitir combinar registros de duas ou mais tabelas, através do relacionamento que uma tabela tem com a outra. Já o UNION permite acrescentar os resultados de uma query à outra.

o INNER JOIN permite retornar todos os resultados em que a condição da cláusula ON for satisfeita. Foca em trazer somente os registros que possuem valores correspondentes em ambas as tabelas.

SELECT t1.coluna, t2.coluna
FROM tabela1 AS t1
INNER JOIN tabela2 AS t2
ON t1.coluna_em_comum = t2.coluna_em_comum;

O LEFT JOIN , focamos a tabela da esquerda. São retornados todos os registros da tabela esquerda e valores correspondentes da tabela da direita, caso existam. Os valores sem correspondencia são exibidos como nulo.

SELECT
    c.customer_id,
    c.first_name,
    c.last_name,
    a.actor_id,
    a.first_name,
    a.last_name
FROM customer c
LEFT JOIN actor a
ON c.last_name = a.last_name
ORDER BY c.last_name;

O RIGHT JOIN , focamos a tabela da direita. São retornados todos os registros da tabela da direita e valores correspondentes da tabela da esquerda, caso existam. Os valores sem correspondencia são exibidos como nulo.

SELECT
    c.customer_id,
    c.first_name,
    c.last_name,
    a.actor_id,
    a.first_name,
    a.last_name
FROM customer c
RIGHT JOIN actor a
ON c.last_name = a.last_name
ORDER BY c.last_name;

Há certos cenários nos quais faz sentido pesquisar e tirar alguma conclusão analisando apenas uma única tabela. Os tipos de JOIN que você viu até agora precisam necessariamente que mais de uma tabela seja incluída em uma query para que um resultado possa ser gerado. O SELF JOIN não possui esse requisito.

Note que um SELF JOIN não é um tipo diferente de JOIN. É apenas um caso em que uma tabela faz join consigo mesma. Você pode utilzar qualquer dos tipos de JOIN vistos ao realizar um SELF JOIN.

No caso do UNION ele remove os dados duplicados, enquanto o UNION ALL os mantém. Observe que, para usar o comando corretamente, a mesma quantidade de colunas deve ser utilizada.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment