Kończą się wakacje, trzeba zatem wziąć się do pracy lub za jej zmianę. Przygotowałem kolejne pytania na rozmowę kwalifikacyjną z SQLa, z którymi dość często można się spotkać.

Jakie znasz funkcje agregujące?

AVG – jest to średnia. Bardzo ważne jest to, że jeśli pojawi się NULL, nie jest on brany pod uwagę. Czyli mając trzy rekordy 2, 4 i NULL, otrzymamy wynik 3.

SUM – suma wartości

COUNT – liczy ilość wierszy, poniżej opisałem dwa rodzaje tej funkcji

MIN i MAX – zwracają odpowiednio najmniejszą i największą wartość

Przy funkcjach agregujących bardzo ważne jest to, że dla wielu wierszy zwracają jeden wynik. Nie wolno ich zatem łączyć z funkcjami skalarnymi i kolumnami (poza użytymi w GROUP BY). Większość baz danych przy próbie wykonania takiego zapytania zwróci wyjątek. Są też bazy, w których ono zadziała, lecz jest to błąd i nie powinniśmy z takiej możliwości korzystać, tylko napisać zapytanie zwracające oczekiwany wynik.

Dlaczego alias nadany w SELECT nie jest widoczny w WHERE?

Kolejność zapisywania zapytania jest zbliżona do języka naturalnego.
Mówimy np.: podaj mi liczbę pracowników, którzy zostali zatrudnieni w tym roku, zapiszemy to następująco:

SELECT * FROM Pracownicy WHERE YEAR(DataZatrudnienia) = 2017

Silnik bazy danych nie jest w stanie wykonać tego w ten sposób, dlatego istnieje jeszcze kolejność wykonywania zapytania. W pierwszej kolejności przetwarzany jest FROM, a dopiero po wskazaniu źródła danych są one przetwarzane. Wracając do sedna pytania, WHERE jest wykonywany jako drugi (zaraz po FROM), a SELECT po nim. Aliasy nadawane w SELECT są więc widoczne po jego wykonaniu.

Co jest szybsze: „=” czy LIKE?

Porównanie jest zdecydowanie szybsze od LIKE. Dodanie indeksu może trochę poprawić wydajność wyrażeń wieloznacznych, lecz nadal będą one znacznie wolniejsze od porównania. Dzieje się tak dlatego, że LIKE jest dużo bardziej skomplikowaną operacja i sama złożoność daje narzut czasu wykonania. Często zdarza się, że ktoś użyje '%a’ co koszmarnie wpłynie na wydajność. Tu lepszym rozwiązaniem jest RIGHT(’a’,1), które wykona się dla dużej ilości danych w kilkadziesiąt milisekund, zamiast kilkunastu sekund przy pierwszym rozwiązaniu. Jeśli można, należy unikać LIKE, często da się go zastąpić bardziej wydajnymi rozwiązaniami.

Jaka jest różnica między COUNT(*) a COUNT(kolumna)?

Funkcja agregująca zlicza wiersze. W przypadku użycia gwiazdki, zostaną policzone wszystkie wiersze w tabeli. Gdy parametrem funkcji jest nazwa kolumny, wtedy policzone zostaną wiersze, które w podanej kolumnie mają wartość (nie ma NULLa).

Część 1

Dołącz do newslettera już dziś!
Zero spamu - tylko wartościowe treści!
Musisz już lecieć?
Zostaw swój adres e-mail i dołącz do BEZPŁATNYCH WEBINARÓW dotyczących SQLa!
  • „Jak uczyć się SQLa?” – 4 października
  • „SQL dla testerów” – 12 października