0Pricing
SQL Interview Prep · Lekcja

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

  1. Projekcja kolumn i pułapki aliasów
  2. Kolumny obliczane i pierwszeństwo operatorów
  3. DISTINCT a GROUP BY w uzyskiwaniu unikatowości
  4. Wyrażenia CASE w SELECT
← Powrót do SQL Interview Prep