TOP
Polecenie TOP pozwala na pobranie określonej liczby wierszy z tabeli. Możemy skorzystać z jednego z dwóch dostępnych wariantów zapytania:
Porównajmy ich działanie:
SELECT TOP 10 * FROM Production.Product -- 10 rekordów
-- zarezerwowanym słowem kluczowym w SQL jest PERCENT
SELECT TOP 2 PERCENT * FROM Production.Product -- wynik jest zaokrąglany do góry
Żeby jednak nie było tak kolorowo...
Nie wszystkie bazy danych obsługują polecenie TOP. Identyczne zachowanie możemy jednak odtworzyć wykorzystując:
-
LIMIT dla MySQL;
-
ROWNUM dla Oracle.
LIKE
LIKE korzysta ze wspomnianych wcześniej operatorów wieloznacznych. Do naszej dyspozycji zostały oddane dwa o odmiennej charakterystyce:
-
% - oznacza zero, jeden lub wiele znaków;
-
_ - reprezentuje pojedynczą liczbę lub znak.
Powyższe operatory mogą być wzajemnie łączone.
Jaki jest cel używania tej klauzuli? Pozwala na porównywanie wartości z wartościami podobnymi. Zapomnieliście dokładnej nazwy produktu? Nie pamiętacie dokładnego nazwiska swojego pracownika? Chcecie znaleźć numer telefonu ale pamiętacie tylko 3 pierwsze cyfry? To najprostsze przypadki wykorzystania tego polecenia. Spójrzmy jeszcze na kilka przykładów:
SELECT * FROM Production.Product
WHERE Name Like 'H%' -- nazwa produktu zaczyna się od litery H
SELECT * FROM Production.Product
WHERE Name Like '%Nut%' -- w nazwie produktu występuje 'Nut' - nakrętka
SELECT * FROM Production.Product
WHERE ProductNumber Like '_E%' -- wyszukuje numery produktów gdzie na drugim miejscu jest 'E'
SELECT * FROM Production.Product
WHERE Name Like '%e' -- wyszukuje produkty których nazwa kończy się na 'e'
SELECT * FROM Production.Product
WHERE SafetyStockLevel Like '8_0' -- wyszukuje dowolną wartość 3-cyfrową, która zaczyna się na 8 i kończy na 0
HAVING
HAVING pozwala na filtrowanie wyników zwracanych przez klauzulę GROUP BY.
WHERE pozwala na definiowanie warunków na poziomie wybranych kolumn a HAVING na definiowanie warunków na poziomie group utworzonych przez GROUP BY.
Musimy jeszcze pamiętać, że HAVING występuje po GROUP BY ale przed ORDER BY jeżeli zależy nam na posortowaniu zwracanych danych.
Spójrzmy na poniższy przykład z poprzedniego wpisu:
SELECT COUNT(Name) as Products, ReorderPoint from Production.Product
GROUP BY ReorderPoint
Efektem powyższego zapytania jest dokładna liczba produktów kwalifikująca się do danego progu punktowego:
Nam jednak zależy na wprowadzeniu następujących ograniczeń:
-
chcemy wyeliminować produkty o koszcie 0:
-
interesują nas tylko grupy w których mamy więcej niż 80 produktów:
Jak osiągnać taki efekt? Spójrzcie na analizę poniższego zapytania:
SELECT COUNT(Name) as Products, ReorderPoint from Production.Product
WHERE StandardCost > 0 -- eliminujemy produkty o koszcie równym 0
GROUP BY ReorderPoint
HAVING COUNT(Name) > 80 -- zwracamy tylko grupy z liczbą produktów większą niż 80
W ramach praktyki przejdziemy przez jeszcze jeden przykład. Z tabeli HumanResources.Employee wyciągnijmy informację ilu pracowników mamy na jakich stanowiskach. Do ostatecznego raportu zwrócimy jednak tylko te stanowiska na których pracuje więcej niż 5 osób. Na sam koniec dokonamy sortowania malejącego. Tym razem bez szczegółowego objaśnienia – każdy z Was będzie doskonale wiedział dlaczego zapytanie przyjęło taką a nie inną formę
SELECT COUNT(LoginID) as Logins, JobTitle from HumanResources.Employee
GROUP BY JobTitle
HAVING COUNT(LoginID) > 5
ORDER BY Logins DESC