SQL praca z tabelami 4 Wykład 7 1
Funkcje agregujące Informacja poszukiwana w bazie danych często musi być wyliczana na podstawie danych znajdujących się w wielu wierszach tabeli. Tak jest gdy chcemy znać np. średnią wartość zamówienia, liczbę klientów zamieszkałych na danym obszarze czy liczba towarów spełniających zadane kryteria. Uzyskanie takich złożonych informacji umożliwiają funkcje agregujące. Najczęściej używane funkcje agregujące to: AVG(wyrażenie) oblicza wartość średnią BIT_AND(wyrażenie) - oblicza iloczyn bitowy BIT_OR(wyrażenie) oblicza sumę bitową BOOL_AND - oblicza iloczyn logiczny BOOL_OR - oblicza sumę logiczną COUNT(wyrażenie) oblicza liczbę wierszy zwróconych przez zapytanie GROUP_CONCAT(wyrażenie) tworzy ciąg będący połączeniem zwróconych przez zapytanie wartości różnych od NULL 2
Funkcje agregujące MIN(wyrażenie) - podaje wartość minimalną zwróconą przez zapytanie MAX(wyrażenie) podaje wartość maksymalną zwróconą przez zapytanie STD(wyrażenie) - oblicza odchylenie standardowe z wartości zwróconych przez zapytanie STDDEV(wyrażenie) oblicza odchylenie standardowe tak jak STD STDDEV_POP (wyrażenie) oblicza odchylenie standardowe tak jak STD SUM(wyrażenie) oblicza sumę wartości zwróconych przez zapytanie VAR_POP(wyrażenie) oblicza wariancję standardową z wartości zwróconych przez zapytanie VARIANCE(wyrażenie) oblicza wariancję standardową z wartości zwróconych przez zapytanie 3
Funkcje agregujące SELECT COUNT(*) FROM pracownicy; (zwraca kolumnę zawierającą liczbę pracowników) SELECT COUNT(*) FROM pracownicy WHERE stanowsko_id=3; (zwraca kolumnę zawierającą liczbę pracowników pracujących na stanowisku z id=3) SELECT COUNT(*) AS liczba sprzedawców FROM pracownicy WHERE stanowsko_id=3; (zwraca kolumnę zawierającą liczbę pracowników pracujących na stanowisku z id=3 (sprzedawcy) z nazwą kolumny liczba sprzedawców ) SELECT MAX(placa) AS najwyższe wynagrodzenie FROM pracownicy; zwraca kolumnę z wartością maksymalną placy i nazwą najwyższe wynagrodzenie 4
Funkcje agregujące SELECT MIN(placa) AS najniższe wynagrodzenie FROM pracownicy; zwraca kolumnę z minimalną placą i nazwą najniższe wynagrodzenie SELECT AVG(placa) AS średnie wynagrodzenie, MAX(placa) AS Maksymalne wynagrodzenie, MIN(placa) AS Minimalne wynagrodzenie FROM pracownicy; zwraca trzy kolumny z wartościami średniej, maksymalnej i minimalnej placy (i nazwą wynagrodzenie) SELECT AVG(placa) AS średnie wynagrodzenie, MAX(placa) AS Maksymalne wynagrodzenie, MIN(placa) AS Minimalne wynagrodzenie FROM pracownicy WHERE stanowisko_id=3; zwraca trzy kolumny z wartościami średniej maksymalnej i minimalnej placy (wynagrodzenia) dla pracowników na stanowisku z id=3 5
Funkcje agregujące SELECT SUM(placa) AS Suma płac FROM pracownicy; zwraca kolumnę z sumą plac wszystkich pracowników i nazwą Suma płac SELECT VAR_POP(placa) AS wariancja płac FROM pracownicy; zwraca kolumnę z wariancja dla wartości plac wszystkich pracowników i nazwą Wariancja płac SELECT STDDEV(placa) AS odchyl stand płac FROM pracownicy; zwraca kolumnę z odchyl stand dla wartości plac wszystkich pracowników i nazwą odchyl stand płac 6
Funkcje agregujące (GROUP_CONCAT) Funkcja grupująca GROUP_CONCAT pozwala na połączenie wartości występujących w agregowanej kolumnie i zaprezentowanie ich w postaci łańcucha znakowego w postaci: GROUP_CONCAT( [DISTINCT] wyrażenie [ORDER BY typ_sortowania [ASC DESC] kolumna] [SEPARATOR separator] ) DISTINCT usuwa duplikaty z wyników zapytania, a domyślnym separatorem jest przecinek. 7
Funkcje agregujące (GROUP_CONCAT) SELECT GROUP_CONCAT(nazwisko) AS Nazwiska FROM pracownicy; zwraca nazwiska pracowników rozdzielone przecinkami SELECT GROUP_CONCAT(DISTINCT nazwisko ORDER BY nazwisko SEPARATOR ; ) AS Nazwiska FROM pracownicy; zwraca nazwiska pracowników (bez duplikatów) uporządkowane alfabetycznie i rozdzielone średnikami. 8
Grupowanie danych Funkcje agregujące pozwalają na zebranie danych dotyczących wielu wierszy tabeli, ale są one pobierane ze względu na jedno kryterium (np. średnia płaca na stanowisku sprzedawca). Czasem potrzebujemy bardziej złożonego grupowania np. jaka jest średnia płaca na różnych stanowiskach. Można to uzyskać za pomocą serii zapytań opisanych wcześniej lub przez klauzulę grupującą GROUP BY w postaci: SELECT kolumna1[, kolumna2,, kulumnan] FROM tabela1[, tabela2,, tabelan] WHERE warunki GROUP BY kolumna1[, kolumna2,, kolumnan] a wyniki zostaną zgrupowane względem wskazanych kolumn. 9
Grupowanie danych SELECT stanowisko_id, AVG(placa) AS Średnia płaca FROM pracownicy GROUP BY stanowisko_id; wyświetla tabele o dwóch kolumnach stanowisko_id i Średnia płaca uporządkowanych (zgrupowanych) względem kolumny stanowisko_id. SELECT nazwa AS Stanowisko, AVG(placa) AS Średnia płaca FROM pracownicy, stanowiska WHERE pracownicy.stanowisko_id=stanowiska.id GROUP BY nazwa; wykorzystuje złączenie tabel (pracownicy.stanowisko_id=stanowiska.id) i wyświetla kolumny Stanowisko i Średnia płaca uporządkowane jak wyżej. 10
Grupowanie danych SELECT nazwa AS Stanowisko, AVG(placa) AS Średnia płaca FROM pracownicy, stanowiska WHERE pracownicy.stanowisko_id=stanowiska.id GROUP BY nazwa ORDER BY Średnia płaca DESC; wykorzystuje złączenie tabel (pracwnicy.stanowisko_id=stanowiska.id) i wyświetla kolumny Stanowisko i Średnia płaca uporządkowane malejąco według średniej płacy. 11
Grupowanie danych SELECT nazwa AS Stanowisko, AVG(placa) AS Średnia płaca FROM pracownicy, stanowiska WHERE pracownicy.stanowisko_id=stanowiska.id AND pracownicy.pesel IS NOT NULL GROUP BY nazwa ORDER BY Średnia płaca DESC; podobnie jak w przykładzie wcześniejszym ale dla pracowników dla których podano w tabeli pesel. 12
Grupowanie danych SELECT nazwa AS Stanowisko, nazwisko, COUNT(*) AS Liczba pracowników FROM pracownicy, stanowiska WHERE pracownicy.stanowisko_id=stanowiska.id GROUP BY nazwa, nazwisko ORDER BY stanowisko, nazwisko; wyświetla kolumny Stanowisko, nazwisko i Liczba pracowników (pokazuje liczbę pracowników na każdym stanowisku i dla danego nazwiska) i uporządkowanych względem: najpierw stanowisko a potem nazwisko. Wykonano grupowanie względem dwóch kolumn. 13
Grupowanie danych W grupowaniu danych można wykorzystywać klauzulę HAVING wprowadzającą dodatkowe warunki grupowania w postaci: SELECT kolumna1[, kolumna2,, kulumnan] FROM tabela1[, tabela2,, tabelan] WHERE warunki_where GROUP BY kolumna1[, kolumna2,, kolumnan] HAVING warunki_having przy czym warunki_having określają, jakie warunki muszą spełniać dane - wyniki działania funkcji agregujących, aby zostały wyświetlone, np. SELECT nazwa AS Stanowisko, AVG(placa) AS Średnia płaca FROM pracownicy, stanowiska WHERE pracownicy.stanowisko_id=stanowiska.id GROUP BY nazwa HAVING AVG(placa) > 1400 ORDER BY Średnia płaca DESC; wyświetla stanowiska i średnie płace powyżej 1400. 14