DISTINCT a GROUP BY w uzyskiwaniu unikatowości
Kiedy właściwą odpowiedzią jest DISTINCT, a kiedy rekruter oczekuje GROUP BY
DISTINCT a GROUP BY w uzyskiwaniu unikatowości to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Działanie DISTINCT
DISTINCT usuwa zduplikowane wiersze. Najważniejsza kwestia, którą sprawdzają osoby prowadzące rozmowy techniczne: działa ono na całym wybranym wierszu, a nie na jednej kolumnie — dlatego SELECT DISTINCT a, b usuwa duplikaty pary (a, b).
SELECT DISTINCT department
FROM employees;DISTINCT obejmuje wszystkie wybrane kolumny
W przypadku kilku kolumn DISTINCT zachowuje każdą unikalną kombinację — po jednym wierszu dla każdej różnej pary (department, job_title). Nie istnieje standardowy sposób usuwania duplikatów tylko w jednej kolumnie.
SELECT DISTINCT department, job_title
FROM employees;Działanie GROUP BY
GROUP BY scala wiersze o tym samym kluczu w jeden wiersz na grupę. Samo grupowanie według jednej kolumny daje taki sam wynik jak użycie DISTINCT na tej kolumnie.
SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;Rzeczywista różnica: agregacja
Kiedy zatem występuje różnica? Gdy potrzebna jest agregacja. GROUP BY może obliczać COUNT, SUM lub AVG dla każdej grupy, a DISTINCT nie. Potrzebne są unikalne wiersze? DISTINCT. Potrzebna jest miara dla każdej grupy? GROUP BY.
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;DISTINCT nie może zliczać elementów w grupach
Nie można dodać zliczania do DISTINCT. W przypadku pytania „ilu pracowników przypada na dział” właściwym narzędziem jest zawsze GROUP BY z COUNT(*) — a nie SELECT DISTINCT.
-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;
-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;COUNT(DISTINCT) łączy oba podejścia
Popularne połączenie: COUNT(DISTINCT col) zlicza unikalne wartości w każdej grupie. W tym przypadku DISTINCT znajduje się wewnątrz funkcji agregującej i odpowiada na pytanie: „ile różnych stanowisk przypada na każdy dział?”
SELECT department,
COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;Zliczanie różnych wartości ogółem
Bez GROUP BY funkcja COUNT(DISTINCT col) zlicza unikalne wartości w całej tabeli — to prosta odpowiedź na pytanie: „ile różnych działów mamy?”
SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;
-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;Wydajność często jest porównywalna
Co jest szybsze: DISTINCT czy GROUP BY? W przypadku zwykłego usuwania duplikatów zazwyczaj są równoważne — optymalizatory planują je w podobny sposób. Należy wybrać konstrukcję zgodnie z intencją: DISTINCT dla unikalnych wierszy, GROUP BY podczas agregowania.
DISTINCT i NULL
Jak DISTINCT traktuje NULL? Uznaje wszystkie wartości NULL za równe, więc wiele wierszy z NULL zostaje scalonych w jeden. GROUP BY działa tak samo — wartości NULL tworzą jedną grupę.
-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;Postgres DISTINCT ON (bonus)
Bonus: Postgres ma niestandardową konstrukcję DISTINCT ON (expr), która zachowuje pierwszy wiersz dla danego klucza zgodnie z ORDER BY. Przenośny kod używa zamiast niej ROW_NUMBER().
-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;DISTINCT dotyczy całego SELECT, a nie jednej kolumny
Jeszcze jedna pułapka: DISTINCT działa na całym wierszu, dlatego SELECT DISTINCT customer_id, order_date nie zwróci jednego wiersza na klienta. W tym celu należy użyć GROUP BY z MAX albo funkcji okna.
-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;
-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;Szybkie sprawdzenie
Wybierz właściwe narzędzie.
Podsumowanie
Podsumowanie: DISTINCT usuwa duplikaty całych wierszy, a GROUP BY scala je według klucza i umożliwia agregowanie. COUNT(DISTINCT col) zlicza unikalne wartości, obie konstrukcje traktują NULL jako jedną wartość, a ich wydajność jest zazwyczaj porównywalna.
Często zadawane pytania
Czy lekcja „DISTINCT a GROUP BY w uzyskiwaniu unikatowości” jest bezpłatna?
Tak — pełny tekst „DISTINCT a GROUP BY w uzyskiwaniu unikatowości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „DISTINCT a GROUP BY w uzyskiwaniu unikatowości”?
Kiedy właściwą odpowiedzią jest DISTINCT, a kiedy rekruter oczekuje GROUP BY Ćwiczysz SQL Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć SQL Interview Prep?
Nie wymagamy żadnego doświadczenia. SQL Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „DISTINCT a GROUP BY w uzyskiwaniu unikatowości”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji SQL Interview Prep?
Tak. Każda lekcja SQL Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Projekcja kolumn i pułapki aliasów
- Kolumny obliczane i pierwszeństwo operatorów
- DISTINCT a GROUP BY w uzyskiwaniu unikatowości
- Wyrażenia CASE w SELECT