Sekcja: Podstawy SQL 3

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

FROM pracownicy

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)

FROM pracownicy p;

-- 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.