CodeGym /Kursy /SQL SELF /Pobieranie unikalnych wartości z DISTINCT

Pobieranie unikalnych wartości z DISTINCT

SQL SELF
Poziom 6 , Lekcja 1
Dostępny

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.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION