30 exemplos para dominar SQL

Um tutorial prático e abrangente

SQL é uma linguagem de programação que é usada para gerenciar dados armazenados em forma tabular (ou seja, tabelas) em bancos de dados relacionais.

dados relacionais

Um banco de dados relacional consiste em múltiplas tabelas que se relacionam entre si. A relação entre as tabelas é formada no sentido de colunas compartilhadas.

gerenciamento de banco de dados

Existem muitos sistemas de gerenciamento de banco de dados relacionais diferentes (por exemplo, MySQL, PostgreSQL, SQL Server). A sintaxe SQL entre eles pode diferir ligeiramente.

o que veremos:

  • Criar um banco de dados e tabelas
  • Inserir dados em tabelas
  • Excluir dados de tabelas
  • Tabelas de atualização
  • Tabelas de consulta usando uma grande variedade de instruções selecionadas

1. conectar ao servidor

Primeiro nos conectamos ao servidor MySQL do terminal e criamos um banco de dados.

sudo mysql -u root

Seremos solicitados a digitar a senha. Agora estamos conectados ao servidor MySQL em nossa máquina.

2. criar banco de dados

O comando a seguir cria um banco de dados chamado “retail”.

create database retail;
use retail;

Ainda não estamos no banco de dados de varejo que ainda não contém tabelas.

3. criar tabelas

Primeiro criaremos uma tabela chamada “cliente” usando o comando criar tabela.

create table customer (
cust_id int primary key,
age int,
location varchar(20),
gender varchar(20)
);

Definimos o nome das colunas e tipos de dados associados dentro do parêntese. A coluna cust_id é especificada como a chave principal.

A chave principal é a coluna que identifica exclusivamente cada linha. É como o índice de um quadro de dados pandas.

4. criar outra tabela

Vamos criar a segunda tabela que é chamada de “orders”.

create table orders (
order_id int primary key,
date date,
amount decimal(5,2),
cust_id int,
foreign key (cust_id) references customer(cust_id)
on delete cascade
);

No início, mencionamos que as tabelas relacionais estão relacionadas entre si por meio de colunas compartilhadas. Uma coluna que relaciona duas tabelas é uma chave estrangeira.

A chave estrangeira é o que diz respeito a uma tabela a outra.

A chave estrangeira contém a chave principal de outra tabela.

A coluna cust_id na tabela orders é uma chave estrangeira e relaciona a tabela de pedidos à tabela do customer. Especificamos essa condição ao criar a tabela.

5. ver tabelas

O banco de dados de varejo contém duas tabelas agora. Podemos ver as tabelas existentes em um banco de dados usando o comando tabelas de show.

show tables;
+------------------+
| Tables_in_retail |
+------------------+
| customer |
| orders |
+------------------+

Nota: Os comandos em SQL terminam com um semi-cólon (“;”).

6. descrição da tabela — info( )

Os comandos desc ou descrevem fornecem uma visão geral da tabela em termos de nomes de colunas, tipos de dados e algumas informações adicionais.

mysql> desc orders;+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| order_id | int(11) | NO | PRI | NULL | |
| date | date | YES | | NULL | |
| amount | decimal(5,2) | YES | | NULL | |
| cust_id | int(11) | YES | MUL | NULL | |
+----------+--------------+------+-----+---------+-------+

7. modificar tabelas ple 6

Podemos modificar tabelas existentes. Por exemplo, o comando alterar tabela pode ser usado para adicionar uma nova coluna ou excluir uma coluna existente.

Vamos adicionar uma coluna à tabela de pedidos chamada “is_sale”.

alter table orders add is_sale varchar(20);

Escrevemos o nome da coluna e o tipo de dados, juntamente com a palavra-chave adicionar.

desc orders;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| order_id | int(11) | NO | PRI | NULL | |
| date | date | YES | | NULL | |
| amount | decimal(5,2) | YES | | NULL | |
| cust_id | int(11) | YES | MUL | NULL | |
| is_sale | varchar(20) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+

A coluna is_sale foi adicionada à tabela de pedidos.

8. deletar recurso

A tabela de alterações também pode ser usada para excluir uma coluna com uma pequena alteração na sintaxe.

alter table orders drop is_sale;

A palavra-chave drop é usada em vez do add. Também não precisamos escrever o tipo de dados para soltar uma coluna.

9. inserir dados

Temos tabelas, mas elas não contêm dados. Uma maneira de preencher tabelas é a instrução de inserção.

insert into customer values (
1000, 42, 'Austin', 'female');

Os valores especificados são inseridos nas colunas na mesma ordem. Assim, precisamos manter a ordem consistente.

10. inserir várias linhas

Podemos inserir várias linhas ao mesmo tempo separando cada linha.

insert into customer values 
(1001, 34, 'Austin', 'male'),
(1002, 37, 'Houston', 'male'),
(1003, 25, 'Austin', 'female'),
(1004, 28, 'Houston', 'female'),
(1005, 22, 'Dallas', 'male');

11. exclusão de linhas

A exclusão da declaração pode ser usada para excluir linhas existentes em uma tabela. Precisamos identificar as linhas a serem excluídas fornecendo uma condição. Por exemplo, a instrução abaixo excluirá a linha com um id de pedido de 17.

delete from orders 
where order_id = 17;

Se não especificarmos uma condição, todas as linhas na tabela dada serão excluídas.

12. atualizar uma linha

Também podemos atualizar uma linha existente. Vamos atualizar uma linha na tabela de pedidos.

+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 1 | 2020-10-01 | 24.40 | 1001 |
+----------+------------+--------+---------+

Esta é a primeira fila na tabela de pedidos. Queremos alterar o valor da ordem para 27,40.

update orders
set amount = 27.40 #alterar essa coluna
where order_id = 1;
select * from orders limit 1;
+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 1 | 2020-10-01 | 27.40 | 1001 |
+----------+------------+--------+---------+

Escrevemos os valores atualizados após a palavra-chave definida. As linhas a serem atualizadas são identificadas fornecendo as condições após a palavra-chave onde.

13. replicar uma estrutura de tabela

Se quisermos criar uma tabela copiando a estrutura de uma tabela existente, podemos usar a instrução de tabela de criação com a palavra-chave semelhante.

create table orders_copy like orders;
show tables;
+------------------+
| Tables_in_retail |
+------------------+
| customer |
| orders |
| orders_copy |
+------------------+

A tabela orders_copy tem a mesma estrutura da tabela de pedidos, mas não contém dados.

14. replicar uma tabela por completo

Também podemos criar uma cópia de uma tabela existente com os dados usando a tabela criar e selecionar declarações em conjunto.

create table new_orders
select * from orders;

Parece uma combinação de duas declarações separadas. A primeira linha cria a tabela e a segunda linha a preenche com os dados na tabela de pedidos.

15. dropar tabelas

A instrução drop pode ser usada para excluir tabelas em um banco de dados.

drop table orders_copy, new_orders;
show tables;
+------------------+
| Tables_in_retail |
+------------------+
| customer |
| orders |
+------------------+

Deixamos cair com sucesso as tabelas criadas no exemplo anterior.

Temos duas tabelas relacionais em um banco de dados. Os exemplos a seguir demonstrarão como podemos recuperar dados dessas tabelas usando consultas selecionadas.

16. visualizar recursos da tabela

A consulta mais simples é visualizar todas as colunas em uma tabela.

select * from orders
limit 3;
+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 1 | 2020-10-01 | 27.40 | 1001 |
| 2 | 2020-10-01 | 36.20 | 1000 |
| 3 | 2020-10-01 | 65.45 | 1002 |
+----------+------------+--------+---------+

O “*” seleciona todas as colunas e a palavra-chave limite coloca uma restrição no número de linhas a serem exibidas.

17. selecionar colunas específicas

Podemos selecionar apenas algumas das colunas escrevendo o nome das colunas em vez de “*”.

select order_id, amount 
from orders
limit 3;
+----------+--------+
| order_id | amount |
+----------+--------+
| 1 | 27.40 |
| 2 | 36.20 |
| 3 | 65.45 |
+----------+--------+

18. condição where

Podemos especificar uma condição para que as linhas sejam selecionadas usando a cláusula where. A consulta a seguir retornará todas as encomendas feitas em 2020–10–01.

select * from orders
where date = '2020-10-01';
+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 1 | 2020-10-01 | 27.40 | 1001 |
| 2 | 2020-10-01 | 36.20 | 1000 |
| 3 | 2020-10-01 | 65.45 | 1002 |
+----------+------------+--------+---------+

19. múltiplas condicões where

A cláusula onde aceita múltiplas condições. Vamos adicionar outra condição à consulta no exemplo anterior.

select * from orders
where date = '2020-10-01' and amount > 50;
+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 3 | 2020-10-01 | 65.45 | 1002 |
+----------+------------+--------+---------+

20. classificar e ordenar

Podemos querer classificar os resultados de consulta que podem ser feitos usando a ordem por cláusula.

A consulta a seguir retornará as ordens em 2020–10–02 e as classificará com base no valor.

select * from orders
where date = '2020-10-02'
order by amount;
+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 5 | 2020-10-02 | 18.80 | 1005 |
| 6 | 2020-10-02 | 21.15 | 1009 |
| 4 | 2020-10-02 | 34.40 | 1001 |
| 7 | 2020-10-02 | 34.40 | 1008 |
| 8 | 2020-10-02 | 41.10 | 1002 |
+----------+------------+--------+---------+

21. ordernar ascendente

A ordem por cláusula classifica as linhas em ordem ascendente por padrão. Podemos mudá-lo para descer com a palavra-chave desc.

select * from orders
where date = '2020-10-02'
order by amount desc;
+----------+------------+--------+---------+
| order_id | date | amount | cust_id |
+----------+------------+--------+---------+
| 8 | 2020-10-02 | 41.10 | 1002 |
| 4 | 2020-10-02 | 34.40 | 1001 |
| 7 | 2020-10-02 | 34.40 | 1008 |
| 6 | 2020-10-02 | 21.15 | 1009 |
| 5 | 2020-10-02 | 18.80 | 1005 |
+----------+------------+--------+---------+

22. contagem (fundamental)

SQL é uma linguagem versátil que também pode ser usada como uma ferramenta de análise de dados. Ele fornece muitas funções para analisar e transformar dados durante a consulta a partir de um banco de dados.

Por exemplo, podemos contar o número de dias únicos na tabela de pedidos.

select count(distinct(date)) as day_count
from orders;
+-----------+
| day_count |
+-----------+
| 4 |
+-----------+

A tabela de ordens contém ordens em 4 dias diferentes. A palavra-chave “as” é usada para renomear a coluna no resultado da consulta. Caso contrário, o nome da coluna seria “count(data(data)”.

22.

Há 4 dias diferentes na tabela de pedidos. Também podemos descobrir quantos pedidos por dia. O group by nos ajudará nessa tarefa.

select date, count(order_id) as order_count
from orders
group by date;
+------------+-------------+
| date | order_count |
+------------+-------------+
| 2020-10-01 | 3 |
| 2020-10-02 | 5 |
| 2020-10-03 | 6 |
| 2020-10-04 | 2 |
+------------+-------------+

Contamos as ordens e as agrupamos até a coluna de datas.

24. valor médio por dia

Calcularemos o valor médio do pedido por cada dia e encomendaremos os resultados com base no valor médio em ordem decrescente.

select date, avg(amount)
from orders
group by date
order by avg(amount) desc;
+------------+-------------+
| date | avg(amount) |
+------------+-------------+
| 2020-10-01 | 43.016667 |
| 2020-10-04 | 42.150000 |
| 2020-10-03 | 37.025000 |
| 2020-10-02 | 29.970000 |
+------------+-------------+

25. agrupar e filtrar

Queremos modificar a consulta no exemplo anterior e incluir apenas dias com um valor médio superior a 30.

select date, avg(amount)
from orders
group by date
having avg(amount) > 30
order by avg(amount) desc;
+------------+-------------+
| date | avg(amount) |
+------------+-------------+
| 2020-10-01 | 43.016667 |
| 2020-10-04 | 42.150000 |
| 2020-10-03 | 37.025000 |
+------------+-------------+

É importante notar que a ordem das declarações na consulta importa. Por exemplo, dá um erro se colocarmos a ordem por cláusula antes da cláusula de ter.

26. valor máximo por dia

Queremos descobrir o valor máximo do pedido por dia.

 select date, max(amount)
from orders
group by date;
+------------+-------------+
| date | max(amount) |
+------------+-------------+
| 2020-10-01 | 65.45 |
| 2020-10-02 | 41.10 |
| 2020-10-03 | 80.20 |
| 2020-10-04 | 50.10 |
+------------+-------------+

27. combinar várias funções

Queremos combinar várias funções agregadas em uma instrução selecionada. Para demonstrar isso, vamos elaborar o exemplo anterior.

Queremos ver a diferença entre o pedido máximo e o pedido mínimo de cada cliente. Também queremos classificar os resultados com base na diferença na ordem ascendente e exibir os três primeiros.

select cust_id, max(amount) - min(amount) as dif
from orders
group by cust_id
order by dif desc
limit 3;
+---------+-------+
| cust_id | dif |
+---------+-------+
| 1007 | 46.00 |
| 1009 | 28.95 |
| 1002 | 24.35 |
+---------+-------+

A coluna dif é obtida subtraindo o valor mínimo do valor máximo.

28. contagem por grupos

Estamos mudando para a mesa do cliente agora. Vamos descobrir quantos clientes femininos e masculinos temos em cada cidade.

select location, gender, count(cust_id)
from customer
group by location, gender;
+----------+--------+----------------+
| location | gender | count(cust_id) |
+----------+--------+----------------+
| Austin | female | 2 |
| Austin | male | 1 |
| Dallas | female | 2 |
| Dallas | male | 2 |
| Houston | female | 2 |
| Houston | male | 1 |
+----------+--------+----------------+

29. relacionamento

As tabelas de clientes e pedidos estão relacionadas entre si com base na coluna cust_id. Podemos consultar dados de ambas as tabelas usando JOINS.

Queremos valor médio do pedido para cada cidade na tabela de clientes.

select customer.location, avg(orders.amount) as avg
from customer
join orders
on customer.cust_id = orders.cust_id
group by customer.location;
+----------+-----------+
| location | avg |
+----------+-----------+
| Austin | 33.333333 |
| Dallas | 34.591667 |
| Houston | 44.450000 |
+----------+-----------+

Como selecionamos colunas de duas tabelas diferentes, os nomes das colunas são especificados com nome de tabela associado. A segunda, terceira e quarta linha da consulta acima junta-se à tabela de pedidos e clientes com base na coluna cust_id em cada tabela.

30. agregação e filtro

Queremos ver a idade média dos clientes que têm um pedido em 2020–10–03.

select avg(c.age) as avg_age
from customer c
join orders o
on c.cust_id = o.cust_id
where o.date = '2020-10-03';
+---------+
| avg_age |
+---------+
| 30.0000 |
+---------+

Podemos usar codinomes para os nomes da mesa também. É útil quando precisamos digitar os nomes da mesa muitas vezes.

31. condição aninhada

Queremos ver a localização do cliente que tem a maior quantidade de pedido.

select c.location, o.amount
from customer c
join orders o
on c.cust_id = o.cust_id
where o.amount = (select max(amount) from orders);
+----------+--------+
| location | amount |
+----------+--------+
| Dallas | 80.20 |
+----------+--------+

Temos uma instrução selecionada aninhada nesta consulta.

concluindo

Creio que os 30 exemplos deste artigo fornecem uma introdução abrangente ao SQL. Cobrimos os seguintes tópicos:

  • Criando um banco de dados com tabelas relacionais
  • Modificando tabelas
  • Inserindo dados em tabelas
  • Excluindo dados de tabelas
  • Escrevendo consultas para recuperar dados de tabelas

É melhor passar para as operações mais avançadas, uma vez que você está confortável trabalhando com o básico.

Obrigado.

Composing a repository of books (i bought), authors (i follow) & blogs (direct ones) for my own understanding.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store