60. Funkcje kolumnowe.
Istnieją następujące funkcje kolumnowe, które mogą być używane w klauzulach SELECT i HAVING:
SUM – funkcja oblicza sumę wartości w określonych kolumnach;
AVG – oblicza średnią wartość w kolumnie;
MIN- znajduje minimalną wartość w kolumnie;
MAX – znajduje maksymalną wartość w kolumnie;
COUNT – służy do zliczania wystąpień pewnej wartości w wierszach.
Poniższe zapytanie wyświetla całkowitą sumę pensji wszystkich pracowników, średnią pensję, minimalną i maksymalną pensję oraz ilość pracowników.
SELECT SUM (p.pensja) AS Pensja, AVG (p.pensja) AS Srednia,
MIN (p.pensja) AS Pensja_min, MAX (p.pensja) AS Pensja_max, COUNT (*) AS
Ilosc
FROM pracownicy p;
Przykład 60: Funkcje kolumnowe.
61. Zastosowanie funkcji kolumnowej COUNT.
Funkcja COUNT może być używana do zliczania wierszy zawierających powtarzającą się wartość. W poniższym przykładzie zapytanie zlicza liczbę działów i stanowisk w firmie.
SELECT COUNT(DISTINCT p.dzial) AS Liczba_dzialow, COUNT(DISTINCT
p.stanowisko) AS Liczba_stanowisk
FROM pracownicy p;
Przykład 61: Zastosowanie funkcji kolumnowej COUNT.
62. Funkcje kolumnowe z wyborem wierszy.
Stosowanie funkcji kolumnowych można przeprowadzić również na pewnym podzbiorze
wierszy, stosując klauzulę WHERE. Funkcje kolumnowe dotyczą wtedy tylko tych wierszy które wybiera warunek występujący w klauzuli WHERE.
SELECT SUM (p.pensja) AS pensja, AVG (p.pensja) AS srednia,
MIN (p.pensja) AS pensja_min, MAX (p.pensja) AS pensja_max, COUNT (*) AS
ilosc
FROM pracownicy p
WHERE p.dzial = 'Obslugi Klienta';
Przykład 62: Funkcje kolumnowe z wyborem wierszy.
63. Funkcje grupujące - klauzula GROUP BY
Klauzula GROUP BY grupuje wiersze o tej samej wartości wyszczególnionych kolumn.
Funkcje agregujące w klauzuli SELECT operują na każdej grupie osobno.
SELECT p.stanowisko, SUM (p.pensja) AS pensja, AVG (p.pensja) AS srednia,
MIN (p.pensja) AS pensja_min, MAX (p.pensja) AS pensja_max, COUNT (*) AS
ilosc
FROM pracownicy p
GROUP BY p.stanowisko
ORDER BY p.stanowisko;
Przykład 63: Funkcje grupujące - klauzula GROUP BY
64. Funkcje grupujące - klauzula HAVING.
Klauzulę HAVING używamy razem z klauzulą GROUP BY w celu ograniczenia
wyświetlanych grup. Warunek szukania musi zawierać funkcję agregującą. Po zgrupowaniu wierszy przez klauzulę GROUP BY, klauzula HAVING wyświetla tylko te wiersze spośród zgrupowanych, które spełniają warunki wyszczególnione w klauzuli HAVING.
SELECT p.nazwisko, SUM (w.cena_jedn)
FROM pracownicy p, wypozyczenia w
WHERE p.nr_prac = w.nr_prac_wyd
GROUP BY p.nazwisko
HAVING SUM (w.cena_jedn) > 400
ORDER BY p.nazwisko;
Przykład 64: Funkcje grupujące - klauzula HAVING.
70. Łączenie tabel wynikowych (UNION, INTERSECT, EXCEPT)
Język SQL umożliwia wykonywanie operacji sumy, przekroju oraz różnicy na zbiorach.
Pozwalają one połączyć wyniki dwóch lub więcej zapytań w jedną tabele wynikową.
• Suma dwóch tabel A i B to tabela zawierająca wiersze występujące w tabeli A, w tabeli B albo w obu tabelach jednocześnie. Do wykonania operacji sumy stosujemy
słowo kluczowe UNION pomiędzy dwoma poleceniami SELECT.
• Przekrój dwóch tabel A i B to tabela zawierające wiersze, które są jednocześnie w tabeli A i w tabeli B. Do wykonania operacji przekroju stosujemy słowo kluczowe
INTERSECT pomiędzy dwoma poleceniami SELECT.
• Różnica dwóch tabel A i B to tabela, zawierająca wszystkie wiersze występujące w tablicy A, które nie występują w tablicy B. Do wykonania operacji różnicy stosujemy słowo kluczowe EXCEPT pomiędzy dwoma poleceniami SELECT.
Jeżeli zastosujemy po nazwie operacji słowo kluczowe ALL to wynik operacji będzie zawierał powtarzające się wiersze, jeśli takie występują.
70a. Zastosowanie operacji UNION.
Operacja UNION łączy dwa lub więcej polecenia SELECT w jedną tabelę wynikową.
Zapytania SELECT muszą zwracać tę samą liczbę kolumn. Kolumny pokrywające muszą
mieć tę samą szerokość i typ danych. Nazwy kolumn mogą być różne. Operacja UNION
łączy dwa ( lub więcej) zestawy wyników w jeden i jednocześnie usuwa duplikaty.
Zapytanie zwraca dane o imieniu i nazwisku wszystkich klientów i pracowników, których nazwiska kończą się na „ski”. Ponieważ duplikaty są usuwane tylko jedna osoba o nazwisku Jan Kowalski będzie na liście.
SELECT imie, nazwisko
FROM klienci
WHERE nazwisko LIKE '%ski'
UNION
SELECT imie, nazwisko
FROM pracownicy
WHERE nazwisko LIKE '%ski';
Przykład 70a: Zastosowanie operacji UNION.
71. Zastosowanie operacji UNION - zmiana porządku sortowania.
Operacja UNION wyświetla wyniki uporządkowane rosnąco ale w obrębie tabeli. Jeśli chcemy zmienić porządek sortowania dla całej sumu musimy klauzulę ORDER BY umieścić na końcu.
SELECT imie, nazwisko
FROM klienci
WHERE nazwisko LIKE '%ski'
UNION
SELECT imie, nazwisko
WHERE nazwisko LIKE '%ski'
ORDER BY nazwisko DESC;
Przykład 71: Zastosowanie operacji UNION - zmiana porządku sortowania.
72. Zastosowanie operacji UNION ALL.
Różnica pomiędzy operacją UNION a UNION ALL polega na tym, że wynik łączenia
zapytań operacją UNION ALL zawiera powtarzające się wiersze. Operacja UNION ALL
działa szybciej niż UNION.
SELECT imie, nazwisko
FROM klienci
WHERE nazwisko LIKE '%ski'
UNION ALL
SELECT imie, nazwisko
FROM pracownicy
WHERE nazwisko LIKE '%ski'
ORDER BY nazwisko;
Przykład 72: Zastosowanie operacji UNION ALL.
73. Zastosowanie operacji INTERSECT.
Operacja INTERSECT (różnica zbiorów pracownicy i klienci) wyświetli nam nazwiska i imiona osób które występują jednocześnie w tabeli pracownicy i klienci.
SELECT nazwisko, imie
FROM pracownicy
INTERSECT
SELECT nazwisko, imie
FROM klienci
ORDER BY nazwisko, imie
Przykład 73: Zastosowanie operacji INTERSECT.
74. Zastosowanie operacji EXCEPT.
Operacja EXCEPT (różnica zbiorów pracownicy i klienci) wyświetli nam nazwiska i imiona osób które występują w tabeli pracownicy a nie występują w tabeli klienci.
SELECT nazwisko, imie
FROM pracownicy
EXCEPT
SELECT nazwisko, imie
FROM klienci
ORDER BY nazwisko, imie
Przykład 73: Zastosowanie operacji EXCEPT.
Sekcja: Podzapytania w języku SQL
80. Rodzaje podzapytań w języku SQL.
Język SQL umożliwia tworzenie wielopoziomowych zapytań umożliwiających w strukturalny sposób wybieranie danych z bazy. Podzapytania możemy stosować w różnych klauzulach.
Przeanalizujemy teraz zastosowanie pełnego zapytania SELECT umieszczonego w innym zapytaniu SELECT. Wynik takiego wewnętrznego zapytania pomaga w określeniu
końcowego wyniku, obliczanego jako wynik zapytania zewnętrznego. Zapytania wewnętrzne możemy wykorzystywać w klauzulach WHERE i HAVING zewnętrznego zapytania
SELECT. Nazywamy je wtedy podzapytaniami lub zapytaniami zagnieżdżonymi. Poziom
zagnieżdżania może być dowolny. Należy pamiętać jednak, ze każdy poziom zagnieżdżenia spowalnia wykonanie zapytania. Zapytania wewnętrzne mogą występować również w
poleceniach INSERT, UPDATE i DELETE.
Możemy wyodrębnić w języku SQL trzy rodzaje podzapytań:
• Podzapytania skalarne zwracające jedną wartość (jedna kolumna, jeden wiersz). Mogą być zawsze stosowane gdy wymagana jest jedna wartość.
• Podzapytania krotkowe zwracające kilka wierszy i tylko jedną kolumnę.
• Podzapytania tabelowe zwracające jedną lub więcej kolumn i wiele wierszy.
81. Rozwiązanie problemu za pomocą dwóch zapytań.
Chcemy wyszukać pracowników, którzy otrzymują wynagrodzenie w kwocie wyższej niż średnia. Sprawdzamy za pomocą pierwszego zapytania jaka jest średnia pensja w naszym przedsiębiorstwie. Następnie za pomocą drugiego zapytania szukamy pracowników
zarabiających powyżej średniej.
-- pierwsze zapytanie wyliczenie średniej
SELECT AVG (p.pensja)
-- drugie zapytanie zwracające pensje pracowników większe niż średnia
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko, p.pensja
FROM pracownicy p
WHERE p.pensja > 1530;
Przykład 81: Rozwiązanie problemu za pomocą dwóch zapytań.
82. Podzapytanie z funkcją agregującą.
To samo możemy osiągnąć stosując w klauzuli WHERE podzapytanie zwracające wartość średnią pensji w przedsiębiorstwie. Należy pamiętać aby podzapytanie ująć w nawiasy ().
Stosując podzapytania należy pamiętać, że w przypadku dużych baz czas wykonania
wielopoziomowego zapytania może być znaczny.
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko, p.pensja
FROM pracownicy p
WHERE p.pensja > (SELECT AVG(p.pensja)FROM pracownicy p);
Przykład 81: Podzapytanie z funkcją agregującą.
83. Podzapytanie z zastosowaniem IN.
Słowo kluczowe IN pozwala na zidentyfikowanie wszystkich elementów ze zbioru A, które występują w zbiorze B.
Poniższe zapytanie wyświetla listę samochodów (zbiór A), których zostały choć raz wypożyczone klientom. Zapytanie wybiera te samochody, które znajdują się w tabeli wypożyczenia (zbiór B).
SELECT s.nr_samochodu, s.marka, s.model
FROM samochody s
WHERE s.nr_samochodu
IN (SELECT w.nr_samochodu FROM wypozyczenia w)
ORDER BY nr_samochodu;
Przykład 83: 83. Podzapytanie z zastosowaniem IN.
84. Podzapytanie z zastosowaniem NOT IN.
Słowo kluczowe NOT IN pozwala na zidentyfikowanie wszystkich elementów ze zbioru A, które nie występują w zbiorze B.
Poniższe zapytanie wyświetla listę samochodów (zbiór A), które nigdy nie były wypożyczone klientom . Zapytanie wybiera te samochody, które nie znajdują się w tabeli wypożyczenia (zbiór B).
SELECT s.nr_samochodu, s.marka, s.model
FROM samochody s
WHERE s.nr_samochodu
NOT IN (SELECT w.nr_samochodu FROM wypozyczenia w)
ORDER BY nr_samochodu;
Przykład 84: Podzapytanie z zastosowaniem NOT IN.
85. Podzapytanie z zastosowaniem równości.
W zapytaniu chcemy wyszukać wszystkich pracowników pracujących w oddziale (tabela miejsca) mieszczących się w określonym mieście (np. Warszawa). W poniższym przykładzie wewnętrzne zapytanie zwraca nam nr_miejsca oddziału znajdującego się w Warszawie.
Należy pamietać, że w tym przykładzie zapytanie wewnętrzne może zwrócić tylko jeden wynik, gdyż używamy w warunku klausuli WHERE znaku równości.
SELECT p.nr_prac, p.imie,p.nazwisko,p.dzial
FROM pracownicy p
WHERE nr_miejsca=(SELECT nr_miejsca FROM miejsca WHERE miasto='Warszawa');
Przykład 85: Podzapytanie z zastosowaniem równości.
86. Podzapytanie z zastosowaniem ALL.
Słowo ALL może być używane z podzapytaniami, które dają w wyniku pojedyńczą kolumnę liczb. Jeśli przed podzapytaniem występuje słowo kluczowe ALL, warunek będzie prawdziwy gdy spełniają go wszystkie wartości otrzymane jako wynik podzapytania.
W poniższym przykładzie chcemy otrzymać listę pracowników, których pensja jest wyższa od wszystkich średnich pensji w ramach działów.
Zapytanie będzie wykonywane w dwóch krokach. Najpierw wykonywane jest pod-zapytanie, które znajduje średnią pensję w każdym dziale. Następnie każda pensja pracownika, porównywana jest z listą średnich pensji. Wyświetleni zostaną pracownicy, których pensja jest wyższa od wszystkich średnich pensji obliczonych w pod-zapytaniu.
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko, p.pensja
FROM pracownicy p
WHERE p.pensja > ALL ( SELECT AVG (p.pensja) FROM pracownicy p GROUP BY
p.dzial);
Przykład 86: Podzapytanie z zastosowaniem ALL.
87. Podzapytanie z zastosowaniem ANY.
Słowo ANY (SOME) może być używane z podzapytaniami, które dają w wyniku pojedyńczą kolumnę liczb. Jeśli przed podzapytaniem występuje słowo kluczowe ANY, warunek będzie prawdziwy o ile spełnia go chociaż jedna wartość otrzymane jako wynik podzapytania.
W poniższym przykładzie chcemy otrzymać listę pracowników, których pensja jest wyższa od dowolnej średnej pensji w ramach działów.
Zapytanie będzie wykonywane w dwóch krokach. Najpierw wykonywane jest pod-zapytanie, które znajduje średnią pensję w każdym dziale. Następnie każda pensja pracownika, porównywana jest z listą średnich pensji. Wyświetleni zostaną pracownicy, których pensja jest wyższa od dowolnej średniej pensji obliczonejh w pod-zapytaniu.
SELECT p.imie, p.nazwisko, p.dzial, p.stanowisko, p.pensja
FROM pracownicy p
WHERE p.pensja > ANY ( SELECT AVG (p.pensja) FROM pracownicy p GROUP BY
p.dzial);
Przykład 87: Podzapytanie z zastosowaniem ANY.