Czasem bazy danych przypominają osobę z kiepską pamięcią — wszystko zapisuje, ale zapomina, że już to zapisała. W efekcie otwierasz tabelę z miastami klientów, a tam dziesięć "Berlinów", pięć "Seattle" i masa innych powtórek. Tak się dzieje, gdy to samo miasto pojawia się u różnych klientów. Ale przecież nie chcesz robić kampanii reklamowej na dziesięć "Berlinów", skoro to tylko jedno miasto, prawda?
Żeby wyciągnąć tylko unikalne wartości — bez duplikatów — jest wygodna komenda DISTINCT. To jak magiczny mop: jednym ruchem usuwa powtarzające się wiersze i zostawia tylko to, co się naprawdę różni.
DISTINCT pozwala pobierać tylko unikalne wiersze z wyniku zapytania. To przydatne w sytuacjach, gdy musisz pozbyć się powtarzających się danych, takich jak:
- Unikalne produkty w zamówieniach.
- Unikalne imiona klientów.
- Unikalne kombinacje danych, na przykład "miasto + kraj".
Jak działa DISTINCT?
Składnia DISTINCT jest prosta i czytelna, jak to zwykle bywa z SQL:
SELECT DISTINCT kolumna1, kolumna2, ...
FROM tabela;
Kiedy dodajesz DISTINCT do zapytania, baza danych gwarantuje, że każdy wiersz w wyniku będzie unikalny.
Przykłady użycia DISTINCT
Zacznijmy od klasycznych przykładów, żeby ogarnąć, jak działa DISTINCT.
Przykład 1: Unikalne wartości jednej kolumny
Załóżmy, że mamy tabelę students z danymi o studentach:
-- 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 |
Chcemy się dowiedzieć, z jakich miast pochodzą studenci. Piszesz zapytanie
SELECT city
FROM students;
i dostajesz wynik:
| city |
|---|
| Seattle |
| Toronto |
| Seattle |
| Chicago |
| Seattle |
Trochę nie to, o co chodziło :(
Żeby usunąć duplikaty, trzeba użyć DISTINCT:
SELECT DISTINCT city
FROM students;
Wynik:
| city |
|---|
| Seattle |
| Toronto |
| Chicago |
Bez DISTINCT w wyniku zobaczysz powtórzenie "Seattle" trzy razy, a nam chodziło tylko o pojedyncze wystąpienia.
Przykład 2: Unikalne wartości kilku kolumn
Teraz wyobraź sobie, że chcesz dostać unikalne kombinacje "imię + nazwisko", bo wśród studentów mogą być osoby o tych samych imionach lub nazwiskach.
Mamy tę samą tabelę 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 |
Zapytanie:
SELECT DISTINCT first_name, last_name
FROM students;
Wynik:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Alex | Lin |
| Anna | Song |
| Nat | Cole |
Tak więc DISTINCT działa jak filtr: bierze pod uwagę wszystkie wskazane kolumny i usuwa powtórki tylko tych wierszy, gdzie wartości wszystkich tych kolumn są identyczne.
Przykład 3: Unikalne kombinacje i sortowanie
Teraz połączymy DISTINCT z sortowaniem ORDER BY, żeby dostać unikalne wartości, posortowane alfabetycznie po nazwisku.
Mamy tabelę 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 |
Zapytanie:
SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;
Wynik:
| first_name | last_name |
|---|---|
| Maria | Chi |
| Nat | Cole |
| Alex | Lin |
| Anna | Song |
Powtarzające się wiersze zostały usunięte, a nazwiska są posortowane alfabetycznie.
Przykład 4: Użycie na agregacjach
A co, jeśli spróbujemy użyć DISTINCT w funkcji, na przykład COUNT?
SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;
Wynik:
| unique_city_count |
|---|
| 3 |
To zapytanie zwróci liczbę unikalnych miast. Wygodne, nie?
Specyfika działania DISTINCT
Używając DISTINCT ważne jest, żeby pamiętać, że działa on na wszystkich wskazanych kolumnach. Jeśli dodasz więcej kolumn do zapytania, wynik może się zmienić.
Przykład 5: Dlaczego tak ważny jest kontekst?
Jeśli dodasz do zapytania dodatkowe pola, może to wpłynąć na unikalność wierszy.
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 |
Wynik:
| first_name | city |
|---|---|
| Maria | Seattle |
| Alex | Austin |
| Anna | Seattle |
| Otto | Denver |
| Maria | Portland |
Każda kombinacja "imię + miasto" jest teraz unikalna. Więc pamiętaj: unikalność jest określana przez wszystkie wskazane kolumny, a nie przez każdą z osobna.
Typowe błędy przy pracy z DISTINCT
Jednym z najczęstszych błędów przy używaniu DISTINCT jest złe zrozumienie, co dokładnie robi zapytanie. Na przykład, jeśli w zapytaniu podasz za dużo kolumn, możesz dostać wynik, który jest daleki od oczekiwanego, bo unikalność będzie liczona po wszystkich kolumnach.
Na przykład:
SELECT DISTINCT *
FROM students;
W tym przypadku każdy wiersz będzie uznany za unikalny, bo wszystkie kolumny są brane pod uwagę.
Kolejny błąd — używanie DISTINCT tam, gdzie nie jest potrzebny. Jeśli masz pewność, że dane już są unikalne (na przykład kolumna będąca kluczem głównym), to DISTINCT tylko niepotrzebnie obciąży bazę danych.
GO TO FULL VERSION