Trata-se de uma cláusula para eliminar repetições em consultas, considerando as colunas informadas na listagem de colunas do comando SELECT que contenham valores iguais como o mesmo registro.
Visão geral
Considere a tabela cliente (Tabela 1), responsável por armazenar informações dos clientes da loja Star Calçados.
id | nome | data_cadastro | |
1 | Fernando Braga | comercial@mundial.com.br | 2017-11-05 |
2 | Luana Soares | luanassa@yahoo.com.br | 2016-05-05 |
3 | Pedro Botelho | comercial@mundial.com.br | 2018-04-02 |
4 | Marilia Gabriela | mari_21@yahoo.com.br | 2018-03-01 |
5 | Bruno Henrique | brunohrq@gmail.com | 2016-05-05 |
6 | Cintia Pereira | cintiazinha@ig.com.br | 2014-11-12 |
7 | Raquel Tavares | raquel-tav@terra.com.br | 2014-11-11 |
Agora imagine que desejamos enviar uma mensagem de feliz natal para todos os clientes. Uma vez que existem clientes diferentes que utilizam o mesmo endereço de e-mail, a exemplo de Fernando Braga e Pedro Botelho, para evitar que esses clientes recebam o mesmo e-mail mais de uma vez é necessário deixar nesse relatório apenas um registro para cada e-mail.
Para resolver este problema podemos utilizar o DISTINCT. A consulta ficaria como no fragmento de código SQL abaixo:
SELECT
DISTINCT email
FROM
cliente
Este código removerá as ocorrências em duplicidade. O resultado da consulta pode ser visto na Tabela 2.
comercial@mundial.com.br |
luanassa@yahoo.com.br |
mari_21@yahoo.com.br |
brunohrq@gmail.com |
cintiazinha@ig.com.br |
raquel-tav@terra.com.br |
Observe que no resultado acima, somente há uma ocorrência do email comercial@mundial.com.br, afinal, originalmente haviam dois registros com o mesmo e-mail, que foi removido deste resultado através da cláusula DISTINCT.
Sintaxe
SELECT
[ DISTINCT ] [ coluna1, coluna2, … | * ]
FROM
[ tabela ]
Na pratica
Exemplo 1
Agora, para este novo exemplo vamos adicionar um dado duplicado a tabela cliente (Tabela 1). Observe a nova estrutura abaixo, na (Tabela 3).
id | nome | data_cadastro | |
1 | Fernando Braga | comercial@mundial.com.br | 2017-11-05 |
2 | Luana Soares | luanassa@yahoo.com.br | 2016-05-05 |
3 | Pedro Botelho | comercial@mundial.com.br | 2018-04-02 |
4 | Marilia Gabriela | mari_21@yahoo.com.br | 2018-03-01 |
5 | Bruno Henrique | brunohrq@gmail.com | 2016-05-05 |
6 | Cintia Pereira | cintiazinha@ig.com.br | 2014-11-12 |
7 | Raquel Tavares | raquel-tav@terra.com.br | 2014-11-11 |
8 | Raquel Tavares | raquel-tav@terra.com.br | 2014-11-11 |
Observe que na tabela acima que o cliente Raquel Tavares se repete, tanto no ID 7 quanto no ID 8. Se executarmos a query abaixo, conseguiremos remover as informações duplicadas:
SELECT
DISTINCT nome,
email
FROM
cliente
Observe que no trecho de código acima, selecionamos as colunas nome e e-mail utilizando a cláusula DISTINCT. O Resultado pode ser visto na (Tabela 4).
nome | |
Fernando Braga | comercial@mundial.com.br |
Luana Soares | luanassa@yahoo.com.br |
Pedro Botelho | comercial@mundial.com.br |
Marilia Gabriela | mari_21@yahoo.com.br |
Bruno Henrique | brunohrq@gmail.com |
Cintia Pereira | cintiazinha@ig.com.br |
Raquel Tavares | raquel-tav@terra.com.br |
Observe que o registro duplicado (Raquel Tavares) foi removido desta consulta. Isso foi possível porque ao utilizar o DISTINCT, o SQL foi capaz de perceber que esses dois registros se tratavam da mesma pessoa, podendo assim, ficar apenas uma informação no resultado.
Exemplo 2
Um dado importante é que ao utilizar o DISTINCT somente serão removidos da consulta os registros nos quais TODAS as colunas informadas estejam em duplicidade. Caso haja pelo menos um dado diferente entre as colunas informadas os registros serão interpretados como diferentes.
Na mesma estrutura da tabelas acima (Tabela 1), solicitaremos agora uma consulta de todas as colunas da tabela.
SELECT
DISTINCT
*
FROM
cliente
Observe que no trecho de código acima, solicitamos todas as colunas através do *. Dessa forma, a consulta deve verificar se há duplicidade nos registros, analisando todas as colunas.
O resultado da query pode ser visto abaixo na (Tabela 5)
id | nome | data_cadastro | |
1 | Fernando Braga | comercial@mundial.com.br | 2017-11-05 |
2 | Luana Soares | luanassa@yahoo.com.br | 2016-05-05 |
3 | Pedro Botelho | comercial@mundial.com.br | 2018-04-02 |
4 | Marilia Gabriela | mari_21@yahoo.com.br | 2018-03-01 |
5 | Bruno Henrique | brunohrq@gmail.com | 2016-05-05 |
6 | Cintia Pereira | cintiazinha@ig.com.br | 2014-11-12 |
7 | Raquel Tavares | raquel-tav@terra.com.br | 2014-11-11 |
8 | Raquel Tavares | raquel-tav@terra.com.br | 2014-11-11 |
Observe que o resultado acima ainda apresenta dados duplicados, por exemplo os registros de ID 7 e 8. Esses registros não foram removidos porque ao verificar todas as colunas da consulta, o SQL reconheceu cada registro como único, afinal, não são todas as colunas que possuem dados iguais. A Coluna ID é quem foi responsável pela permanência dos dados duplicados, afinal, ela possui um valor diferente para cada item.
Exemplo 3
Para o próximo exemplo, considere a seguinte estrutura de tabelas, a tabela carro(Tabela 6), responsável por armazenar informações relacionadas aos carros cadastrados no banco de dados, e a tabale manutencao (Tabela 7), responsável por registrar a entrada de carros na manutenção.
ID | modelo | placa |
1 | Palio | LTE-3245 |
2 | Gol G3 | OIU-2544 |
3 | Gol G4 | LKJ-9874 |
4 | Voyage | LKJ-6654 |
5 | Citroen C3 | JHG-7456 |
6 | Onix LT | PYP-9965 |
7 | Onix LT | LKJ-5547 |
8 | Palio | LKJ-9510 |
9 | Palio | LKJ-7896 |
10 | Uno Mile | HGF-9954 |
11 | Uno Mile | LLK-5542 |
12 | Novo Uno | GGF-2232 |
ID | id_carro | Data |
1 | 1 | 2018-05-04 |
2 | 4 | 2018-06-10 |
3 | 3 | 2018-01-20 |
4 | 7 | 2018-06-06 |
5 | 8 | 2017-09-12 |
6 | 6 | 2017-12-16 |
Para selecionar todos os carros, mas trazendo apenas os modelos distintos, sem repetição, podemos utilizar a query abaixo:
SELECT
DISTINCT modelo
FROM
carro;
Observa que na Linha 2, pedimos pra trazer o modelo dos carros, mas com a cláusula distinct, o que produz o resultado que pode ser visto na tabela Tabela 8.
modelo |
Palio |
Gol G3 |
Gol G4 |
Voyage |
Citroen C3 |
Onix |