Às vezes os bancos de dados parecem aquela pessoa que anota tudo mas esquece o que já escreveu. Você abre a tabela com as cidades dos clientes e tem dez "Berlim", cinco "Seattle" e um monte de repetido. Isso rola quando a mesma cidade aparece pra clientes diferentes. Mas você não quer fazer uma campanha de marketing pra dez "Berlim" se é só uma cidade, né?
Pra pegar só os valores únicos — sem duplicados — tem um comando massa chamado DISTINCT. Ele é tipo uma vassoura mágica: num passe só tira as linhas repetidas e deixa só o que realmente é diferente.
DISTINCT deixa você extrair só as linhas únicas do resultado da query. Isso é útil quando você quer se livrar de dados repetidos, tipo:
- Produtos únicos nos pedidos.
- Nomes únicos de clientes.
- Combinações únicas de dados, tipo "cidade + país".
Como funciona o DISTINCT?
A sintaxe do DISTINCT é simples e direta, como quase tudo no SQL:
SELECT DISTINCT coluna1, coluna2, ...
FROM tabela;
Quando você coloca DISTINCT na query, o banco de dados garante que cada linha do resultado vai ser única.
Exemplos de uso do DISTINCT
Bora começar com exemplos clássicos pra sacar como o DISTINCT funciona.
Exemplo 1: Valores únicos de uma coluna só
Imagina que a gente tem uma tabela students com dados dos estudantes:
-- Tabela students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
A gente quer saber de quais cidades vêm os estudantes. Escreve a query
SELECT city
FROM students;
e recebe esse resultado:
| city |
|---|
| Seattle |
| Toronto |
| Seattle |
| Chicago |
| Seattle |
Não era bem isso que a gente queria :(
Pra tirar os duplicados tem que usar o DISTINCT:
SELECT DISTINCT city
FROM students;
Resultado:
| city |
|---|
| Seattle |
| Toronto |
| Chicago |
Sem o DISTINCT no resultado a gente vê "Seattle" três vezes, mas o que a gente queria era só uma vez cada cidade.
Exemplo 2: Valores únicos de várias colunas
Agora imagina que a gente quer pegar combinações únicas de "nome + sobrenome", porque pode ter estudante com o mesmo nome ou sobrenome.
A tabela students é a mesma:
-- Tabela students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Query:
SELECT DISTINCT first_name, last_name
FROM students;
Resultado:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Alex | Lin |
| Anna | Song |
| Nat | Cole |
Então, o DISTINCT funciona como um filtro: ele olha todas as colunas que você colocou e só tira as linhas repetidas se todas essas colunas forem iguais.
Exemplo 3: Combinações únicas e ordenação
Agora vamos juntar DISTINCT com ORDER BY pra pegar os valores únicos e ainda deixar em ordem alfabética pelo sobrenome.
De novo, a tabela students:
-- Tabela students
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Toronto |
| 3 | Anna | Song | Seattle |
| 4 | Nat | Cole | Chicago |
| 5 | Maria | Chi | Seattle |
Query:
SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;
Resultado:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Nat | Cole |
| Alex | Lin |
| Anna | Song |
As linhas duplicadas sumiram e os sobrenomes ficaram em ordem alfabética.
Exemplo 4: Usando em agregações
E se a gente tentar usar DISTINCT numa função, tipo COUNT?
SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;
Resultado:
| unique_city_count |
|---|
| 3 |
Essa query vai te dar a quantidade de cidades únicas. Bem prático, né?
Coisas pra ficar ligado no DISTINCT
Quando usar o DISTINCT é importante lembrar que ele funciona pra todas as colunas que você colocou. Se você botar mais colunas na query, o resultado pode mudar.
Exemplo 5: Por que é importante entender o contexto?
Se você colocar mais campos na query, isso pode mudar o que é considerado único.
SELECT DISTINCT first_name, city
FROM students;
Tabela students:
| id | first_name | last_name | city |
|---|---|---|---|
| 1 | Maria | Chi | Seattle |
| 2 | Alex | Lin | Austin |
| 3 | Anna | Song | Seattle |
| 4 | Otto | Art | Denver |
| 5 | Maria | Chi | Portland |
Resultado:
| first_name | city |
|---|---|
| Maria | Seattle |
| Alex | Austin |
| Anna | Seattle |
| Otto | Denver |
| Maria | Portland |
Cada combinação "nome + cidade" agora é única. Então lembra: o que é considerado único depende de todas as colunas que você colocou, não de cada coluna separada.
Erros comuns usando DISTINCT
Um dos erros mais comuns ao usar DISTINCT é não entender direito o que a query faz. Por exemplo, se você colocar coluna demais, pode acabar com um resultado bem diferente do que esperava, porque o que é único vai ser definido por todas as colunas.
Por exemplo:
SELECT DISTINCT *
FROM students;
Nesse caso, cada linha vai ser considerada única, porque todas as colunas entram na conta.
Outro erro é usar DISTINCT onde não precisa. Se você já sabe que os dados são únicos (tipo uma coluna que é chave primária), o DISTINCT só vai deixar o banco mais lento à toa.
GO TO FULL VERSION