Kończą się wakacje, trzeba zatem wziąć się do pracy lub za jej zmianę. Przygotowałem kolejne pytania na rozmowę kwalifikacyjną z SQLa, które dość często można 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 pracowników, którzy zostali zatrudnieni w tym roku, zapiszemy to następująco:

Silnik bazy danych nie jest w stanie wykonać tego w ten sposób, dlatego istniej 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ą widoczne więc 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(*) od 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).