MIN, MAX i agregowanie wartości nieliczbowych
Agregowanie dat i ciągów znaków oraz znaczenie MIN zastosowanego do tekstu
MIN, MAX i agregowanie wartości nieliczbowych to bezpłatna lekcja Coding 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 Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
MIN i MAX nie tylko dla liczb
Kandydaci zakładają, że MIN i MAX działają tylko na liczbach. Rekruterzy uwielbiają pytać: „Co zwraca MAX(name)? A co MIN(order_date)?”
Prawda jest taka, że MIN i MAX działają na każdym typie, dla którego określona jest kolejność — na liczbach, datach i ciągach znaków. Rzeczywistą sprawdzaną umiejętnością jest zrozumienie reguł porządkowania właściwych dla każdego typu.
Przypadek wartości liczbowych
Zacznijmy od tego, co znane. Dla kolumn liczbowych MIN zwraca najmniejszą wartość, a MAX największą. To proste.
Podobnie jak pozostałe agregaty, MIN i MAX pomijają wartości NULL. NULL nigdy nie jest wartością minimalną ani maksymalną — jest po prostu pomijany. Jeśli każda wartość jest NULL, obie funkcje zwracają NULL.
SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;MIN i MAX dla dat
Daty i znaczniki czasu są w pełni porządkowalne, dlatego MIN(order_date) zwraca najwcześniejszą datę, a MAX(order_date) — najpóźniejszą.
W ten sposób można odpowiedzieć na pytania „kiedy złożono pierwsze zamówienie?” (MIN) i „kiedy miała miejsce ostatnia aktywność?” (MAX) bez sortowania i ograniczania wyniku. Jest to idiomatyczne rozwiązanie oparte na zbiorach.
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS latest_order
FROM orders;Zakres dat w jednym zapytaniu
Często pojawia się pytanie uzupełniające: „Jak długo ten klient jest aktywny?” W tym celu należy połączyć MIN i MAX, a następnie odjąć jedną wartość od drugiej.
Oblicza to odstęp między pierwszym a ostatnim zamówieniem. Dokładna składnia odejmowania zależy od dialektu, ale idea MIN/MAX jest uniwersalna i pokazuje, że zakresy można wyrażać deklaratywnie.
SELECT
customer_id,
MIN(order_date) AS first_order,
MAX(order_date) AS last_order,
MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;MIN i MAX dla ciągów znaków
Oto część, która zaskakuje wiele osób. W przypadku kolumn tekstowych MIN i MAX wykorzystują porządek leksykograficzny (alfabetyczny) oparty na ustawieniach collation kolumny.
Dlatego MIN(name) zwraca nazwę, która jest pierwsza w kolejności alfabetycznej, a MAX(name) — tę, która jest ostatnia. MIN dla {'Carol', 'Alice', 'Bob'} zwraca 'Alice', a MAX zwraca 'Carol'.
SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'Collation i uwzględnianie wielkości liter
Kolejność ciągów znaków zależy od ustawienia collation, które określa uwzględnianie wielkości liter oraz reguły lokalizacyjne. W wielu domyślnych ustawieniach collation wielkie litery mogą być sortowane przed małymi, dlatego MAX dla {'apple', 'Banana'} może zaskoczyć.
Podczas rozmowy rekrutacyjnej należy wspomnieć, że wyniki MIN/MAX dla ciągów znaków zależą od collation. Ta uwaga odróżnia wyuczoną odpowiedź od rzeczywistego zrozumienia tematu.
Czego NIE oznacza MIN(text)
Częste nieporozumienie polega na założeniu, że MIN(name) zwraca najkrótszy ciąg znaków, a MAX(name) — najdłuższy. Tak nie jest. Chodzi wyłącznie o kolejność sortowania, a nie o długość.
Jeśli rzeczywiście potrzebują Państwo najdłuższego ciągu znaków, należy sortować według LENGTH(name) i wybrać pierwszy wiersz albo użyć MAX(LENGTH(name)), aby uzyskać samą długość. Nie należy mylić kolejności wartości z ich długością.
SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;MIN/MAX nie łączą kolumn
Ważna pułapka: MIN i MAX działają niezależnie na pojedynczej kolumnie. Nie zwracają całego wiersza, który zawiera najmniejszą lub największą wartość.
Jeśli napiszą Państwo SELECT MIN(salary), name bez grupowania, nie otrzymają Państwo nazwy osoby zarabiającej najmniej — zależnie od dialektu pojawi się błąd albo zostanie zwrócona dowolna nazwa. Aby pobrać cały wiersz, należy użyć ORDER BY + LIMIT lub funkcji okna.
-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;Podsumowanie zachowania NULL dla MIN/MAX
Podobnie jak SUM i AVG, MIN i MAX pomijają wartości NULL. NULL nie jest ani najmniejszą, ani największą wartością.
- Wartości rzeczywiste + NULL: wartości NULL są ignorowane, a zwracane są rzeczywiste min/max.
- Same wartości NULL lub brak wierszy: MIN i MAX zwracają NULL.
Ta spójność między funkcjami agregującymi pozwala jasno stwierdzić: „Wszystkie standardowe funkcje agregujące ignorują wartości NULL”.
Wykorzystanie grupowania
MIN i MAX doskonale sprawdzają się z GROUP BY przy znajdowaniu wartości skrajnych dla poszczególnych grup. Klasycznym przykładem jest „najwyższa pensja w każdym dziale”.
Zapytanie zwraca jeden wiersz na dział z najwyższą pensją w tym dziale. Należy pamiętać, że zwraca wartość, a nie pracownika. Powiązanie z nazwiskiem pracownika to osobny i często pojawiający się problem.
SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;Jak odpowiedzieć pewnie
Dobra odpowiedź podczas rozmowy rekrutacyjnej brzmi: „MIN i MAX działają na każdym typie, dla którego można ustalić kolejność. W przypadku liczb oznaczają najmniejszą/największą wartość, w przypadku dat — najwcześniejszą/najpóźniejszą, a w przypadku ciągów znaków — kolejność alfabetyczną zgodną z collation kolumny. Ignorują wartości NULL i zwracają NULL tylko wtedy, gdy nie istnieje żadna wartość inna niż NULL. Zwracają pojedynczą wartość, a nie cały wiersz, więc aby pobrać wiersz, użyłbym ORDER BY z LIMIT lub funkcji okna”.
Szybkie sprawdzenie
Przeanalizuj agregowanie ciągów znaków.
Podsumowanie
Wszystko o MIN i MAX:
- Działają na każdym porządkowalnym typie: liczbach, datach i ciągach znaków.
- Ciągi znaków wykorzystują kolejność alfabetyczną zgodną z collation, a nie długość.
- Daty: MIN = najwcześniejsza, MAX = najpóźniejsza.
- Ignorują wartości NULL; w przypadku samych wartości NULL lub braku wierszy zwracają NULL.
- Zwracają wartość, a nie cały wiersz — w tym celu należy użyć ORDER BY + LIMIT.
Następnie: co się dzieje, gdy używa się funkcji agregujących bez GROUP BY.
Często zadawane pytania
Czy lekcja „MIN, MAX i agregowanie wartości nieliczbowych” jest bezpłatna?
Tak — pełny tekst „MIN, MAX i agregowanie wartości nieliczbowych” 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 Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „MIN, MAX i agregowanie wartości nieliczbowych”?
Agregowanie dat i ciągów znaków oraz znaczenie MIN zastosowanego do tekstu Ćwiczysz Coding 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ąć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding 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 „MIN, MAX i agregowanie wartości nieliczbowych”?
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 Coding Interview Prep?
Tak. Każda lekcja Coding 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
- COUNT(*) a COUNT(column) i COUNT(DISTINCT)
- SUM i AVG z wartościami NULL
- MIN, MAX i agregowanie wartości nieliczbowych
- Agregaty bez GROUP BY