SQL DISTINCT: listando valores distintos em tabelas!

O comando SQL DISTINCT é um importante recurso da linguagem SQL utilizado para recuperar apenas uma vez uma informação que se repete várias vezes em uma tabela. Um bom exemplo é recuperar o nome de uma cidade armazenada em uma tabela em que podemos ter várias pessoas da mesma cidade, mas queremos retornar o nome de cada cidade apenas uma vez.

Essa característica, entretanto, pode fazer com que a pessoa programadora fique em dúvida sobre quando usar esse comando ou o SQL GROUP BY, pois eles podem apresentar o mesmo resultado, dependendo de como fazemos a instrução SQL. Além disso, é preciso atenção para não criar comandos muito complexos, pois eles podem comprometer a performance da aplicação.

Contudo, se a cláusula DISTINCT for utilizada da forma adequada, ajuda a agilizar o trabalho de seleção de dados. Para demonstrar como utilizar esse recurso, preparamos este post com os seguintes tópicos:

Continue conosco e boa leitura!

O que é o comando SQL DISTINCT?

O comando SQL DISTINCT é utilizado para retornar apenas uma ocorrência de campos que contenham dados repetidos. Esse recurso é útil para eliminar a duplicidade de informações e, assim, recuperar apenas o que será utilizado pela aplicação.

Imagine que temos uma tabela com um grande volume de dados e com diversas pessoas de cidades em comum ou não. Se fizéssemos uma seleção apenas com a cláusula SELECT para descobrir quais são as cidades existentes em uma tabela e tivéssemos dez pessoas cadastradas que moram em São Paulo, por exemplo, essa cidade seria listada dez vezes — o que é desnecessário.

O comando DISTINCT, portanto, elimina a redundância de informação. Dessa forma, o retorno da nossa consulta ao utilizar esse recurso, seria apenas o de uma linha com a informação “São Paulo”.

Qual a sintaxe do comando SQL DISTINCT?

O comando SQL DISTINCT é utilizado com a cláusula SELECT, sua sintaxe é:

SELECT DISTINCT coluna1, coluna2, ..., colunaN
FROM nome_tabela
WHERE condição

Em que:

  • coluna1, coluna2, …, colunaN: representam as colunas que serão exibidas no retorno da instrução;
  • nome_tabela: indica a tabela em que os dados estão armazenados;
  • condição: corresponde a uma expressão para compor o critério de seleção.

Vale ressaltar que a cláusula WHERE é opcional quando utilizamos o comando DISTINCT.

4 Exemplos de uso do comando SQL DISTINCT

A melhor forma de entender como o comando DISTINCT funciona é por meio de exemplos práticos. Para isso, criamos uma pequena base de dados chamada “escola”, que contém as tabelas “Disciplina_Periodo” e “Professor”.

Os dados redundantes são muito comuns em tabelas que armazenam dados de relacionamentos N:N, ou seja, muitos para muitos. No nosso banco de dados de exemplo, a tabela disciplina_periodo contém muitos dados redundantes, pois se estivéssemos em uma situação real, ela faria parte desse tipo de relacionamento e armazenaria os campos de identificação do nome da disciplina e do período de aula.

Veja o script para a criação do banco de dados no MySQL:

Criação de banco de dados SQL distinct

1. Seleção de apenas uma coluna

Ao fazer a seleção com o comando DISTINCT, devemos selecionar um ou mais campos que tenham valores repetidos. Caso contrário, o retorno será como o de apenas a cláusula SELECT. 

No código de exemplo abaixo, selecionamos todas as disciplinas que estão cadastradas na tabela “Disciplina_Periodo”. Veja como fica a instrução SQL:

SELECT DISTINCT nome_disciplina FROM disciplina_periodo

Resultado 
nome_disciplina:
Matemática
Física
Português
Literatura
Biologia

Perceba que o resultado mostra apenas uma ocorrência de cada disciplina apesar de ela se repetir várias vezes na tabela de origem.

É importante dizer que o comando DISTINCT também retorna valores nulos. Isso significa que se tivermos um ou vários registros com o conteúdo igual a nulo e fizermos a seleção distinta sobre ele, haverá uma linha indicando que existe pelo menos um registro igual a nulo na tabela.

2. Seleção de duas ou mais colunas

Quando utilizamos duas ou mais colunas para compor o critério de seleção da cláusula DISTINCT, os registros selecionados serão únicos em relação a todos os campos presentes na instrução de seleção. Veja o código a seguir:

SELECT DISTINCT nome_disciplina, periodo_aula FROM disciplina_periodo

Resultado 
nome_disciplina / período_aula
Matemática / Manhã
Matemática / Noite
Física / Tarde
Português / Manhã
Português / Tarde
Literatura / Noite
Biologia / Manhã

Na instrução SQL acima, fizemos uma seleção distinta dos campos nome_disciplina e período_aula. Perceba que as disciplinas Matemática e Português se repetem no resultado. Entretanto, o período de cada uma é diferente (manhã e noite), o que torna o retorno da seleção um valor único.

Além disso, se observarmos na tabela de origem, veremos que existem três professores de matemática no período da manhã. Já no resultado da nossa instrução SQL, há apenas uma ocorrência dessa informação.

3. Seleção com valor total de registros

Também podemos utilizar o comando DISTINCT com funções para retornar uma determinada ação sobre o conteúdo selecionado. No exemplo a seguir, utilizamos a função COUNT(), que retorna o número de registros, para indicar a quantidade de disciplinas cadastrada na nossa tabela. Veja a instrução SQL:

SELECT COUNT(DISTINCT nome_disciplina) AS total_disciplina FROM disciplina_periodo

Resultado:
total_disciplina
5

Perceba que utilizamos a cláusula DISTINCT ao chamar a função COUNT(). Isso porque é sobre esse resultado que queremos contar os valores únicos. Se escrevêssemos o comando “SELECT DISTINCT COUNT(nome_disciplina)…”, o resultado seria 10, pois a função COUNT() seria aplicada em cada nome_disciplina existente na tabela.

Portanto, é preciso atenção ao utilizar o DISTINCT com funções para que o resultado seja o que realmente esperamos.

4. Seleção de valores únicos com duas tabelas

Na tabela “disciplina_periodo” temos o campo “professor_id”, que contém apenas o identificador desse campo. Veja a instrução abaixo:

SELECT DISTINCT professor_id FROM disciplina_periodo;

Resultado:
professor_id
1
2
3
4
5

Entretanto, para recuperar o nome de cada professor, devemos acessar a tabela “Professor”. Para isso, utilizaremos a cláusula INNER JOIN, que recupera os valores que contêm correspondência nas duas tabelas. Veja a instrução SQL a seguir:

SELECT DISTINCT a.professor_id, b.nome_professor 
FROM disciplina_periodo AS a 
INNER JOIN professor AS b 
ON a.professor_id = b.professor_id

Resultado:
professor_id / nome_professor
1           João Paulo
2           Ana Paula
3           Maria Helena
4           Suzana Batista
5           José Pedro 

Quais as diferenças entre o SQL DISTINCT e SQL GROUP BY?

Os comandos SQL DISTINCT E GROUP BY podem retornar resultados iguais dependendo da instrução SQL que fizermos. Observe o código a seguir:

SELECT nome_disciplina FROM disciplina_periodo GROUP BY nome_disciplina

Resultado:
nome_disciplina
Matemática
Física
Português
Literatura
Biologia

Na instrução acima, agrupamos todos os registros da tabela pelo campo nome_disciplina. Perceba que o resultado desse comando SQL é o mesmo que o do nosso primeiro exemplo. Basicamente, os dois comandos fazem a mesma coisa, entretanto, a finalidade de cada um é diferente.

Enquanto o comando DISTINCT é utilizado para retornar apenas uma ocorrência de um determinado valor entre vários registros, o GROUP BY é usado para agrupar os registros de acordo com um critério específico. Também podemos realizar uma ação sobre o grupo selecionado, como determinar a quantidade de registros selecionados, somar valores numéricos, calcular a média etc.

Outra diferença é em relação à performance. De acordo com um comparativo entre os dois comandos, feito pelo site sqlperformance.com, em 2017, o comando GROUP BY apresenta melhores resultados quando comparado com a cláusula DISTINCT.

Boas práticas ao usar o comando SQL DISTINCT 

Ao utilizar o comando DISTINCT, é preciso atenção para sempre selecionar colunas que realmente tenham valores duplicados. De nada adianta, por exemplo, usá-lo para selecionar campos que já sejam únicos em uma tabela, pois o retorno será o mesmo que um SELECT normal.

Como mencionamos, existe muita semelhança entre os comandos DISTINCT e GROUP BY. A escolha sobre qual comando utilizar deve ser feita de acordo com a necessidade da aplicação tanto em relação à finalidade da instrução, quanto com o impacto sobre a performance. Isso facilita o entendimento de outras pessoas do time, caso elas precisem realizar manutenções no código.

Assim como em todos comandos SQL, é preciso atenção para evitar instruções complexas e entre muitas tabelas, pois isso pode comprometer o desempenho da aplicação.

Os comandos SQL são comuns em todos os bancos de dados relacionais. Entretanto, pode existir alguma variação na forma de utilizá-los. Por isso, é sempre bom consultar a documentação oficial do banco utilizado para garantir que a sintaxe está correta.

O comando SQL DISTINCT é um recurso para retornar apenas uma ocorrência de campos que contenham informações duplicadas em uma tabela. Sua utilização facilita o desenvolvimento de diversas aplicações web, quando precisamos recuperar apenas uma vez o conteúdo de um determinado campo.

Gostou do nosso conteúdo sobre como utilizar o comando SQL DISTINCT? Então, confira nosso post sobre o que é trigger, para que serve e como utilizar em SQL!