1
Porządkowanie wyników
●
Do uporządkowania wyniku służy klauzula
ORDER BY
●
Lista kolumn oddzielona przecinkami
●
SELECT pracownikNr, imie FROM Personel ORDER BY imie;
●
Alternatywnie zamiast nazwy można używać numerów
kolumn
●
Numery kolumn są zgodne z kolejnością występowania
nazwy kolumny w klauzuli
SELECT
●
SELECT pracownikNr, imie FROM Personel ORDER BY 2, 1;
●
Numery kolumn stosujemy wyłącznie, gdy kolumna nie
ma określonej nazwy
(kolumny wyliczane)
i nie ma
określonej nazwy zastępczej
(klauzula AS)
2
●
Klauzula
ORDER BY
zawsze znajduje się na końcu
zapytania
SQL
●
Sortowanie może odbywać się w porządku rosnącym
ASC
(wartość domyślna) lub malejącym
DESC
●
Typ sortowania jest umieszczony bezpośrednio po
nazwie kolumny w klauzuli
ORDER BY
●
SELECT pracownikNr, imie FROM Personel ORDER BY imie
DESC, pracownikNr;
●
Sortowanie może odbywać się po kilku kolumnach
●
SELECT pracownikNr, imie FROM Personel ORDER BY imie,
pracownikNr;
3
Sortowanie po kilku kolumnach
●
Umieszczenie kilku kolumn w klauzuli
ORDER BY
pozwala na sortowanie złożone
●
SELECT pracownikNr, imie FROM Personel ORDER BY imie,
pracownikNr;
●
Pierwszy element z listy nazywamy
głównym kluczem
sortowania
●
Wyznacza kolejność uporządkowania całej tabeli
wynikowej
●
Jeżeli wartości głównego klucza sortowania są
identyczne przeprowadzane jest sortowanie względem
kolejnej kolumny z listy
●
Podrzędny klucz sortowania
4
●
SELECT nieruchomoscNr, typ, pokoje, czynsz
●
FROM Nieruchomosc
●
ORDER BY typ, czynsz DESC;
nieruchomoscNr
typ
pokoje
czynsz
PG16
mieszkanie
4
450
PL94
mieszkanie
4
400
PG36
mieszkanie
3
375
PG4
mieszkanie
3
350
PA14
dom
6
650
PG21
dom
5
600
5
Funkcje agregujące
●
COUNT
–
zwraca liczbę wartości występujących w kolumnie
●
SUM –
zwraca sumę wartości występujących w kolumnie
●
AVG –
średnia wartości występujących w kolumnie
●
MIN, MAX –
minimalna i maksymalna wartość w kolumnie
●
Funkcje obliczane są na podstawie jednej kolumny tabeli i
zwracają jedną wartość
●
Funkcje COUNT, MIN, MAX
można stosować do każdego
rodzaju pól
●
SUM i AVG
tylko do pól liczbowych
●
Funkcja
COUNT
nie pomija wartości
NULL
6
●
Funkcje agregujące mogą być zastosowane wyłącznie
na liście SELECT oraz HAVING
●
W ilu nieruchomościach czynsz jest wyższy niż 350
zł ?
●
SELECT
COUNT(*)
AS
Liczba
FROM
Nieruchomość WHERE czynsz > 350;
●
Klauzula
WHERE
czynsz
>
350
powoduje
ograniczenie liczby wierszy
●
Funkcja COUNT(*) powoduje zliczenie wszystkich
wierszy dla których klauzula WHERE jest prawdziwa
liczba
5
7
●
Ile nieruchomości odwiedzono w maju 2001 roku ?
●
SELECT COUNT(DISTINCT nieruchomoscNr) AS Liczba
FROM Wizyta WHERE dataWizyty BETWEEN '1.05.2001'
AND '31.05.2001';
●
Klauzula WHERE ogranicza datę wizyty do miesiąca maj 2001
roku
●
Funkcja Count() zlicza całkowitą liczbę wizyt w danej
nieruchomości (nieruchomoscNr)
●
Ponieważ jedna nieruchomość może być odwiedzana kilka razy
klauzula DISTINCT eliminuje nieruchomości występujące
wielokrotnie
●
Zastosowanie klauzuli DISTINCT przed nazwą kolumny pozwala
wyeliminować powtórzenia przed przystąpieniem do obliczania funkcji
●
Nie wpływa na wynik działania funkcji MIN(), MAX()
●
Może być użyta tylko raz w zapytaniu
8
●
Oblicz, ilu jest dyrektorów i jaka jest ich sumaryczna pensja
●
SELECT Count(pracownikNr) AS Liczba,
SUM(pensja) AS Suma FROM Personel WHERE
stanowisko='dyrektor';
●
Oblicz najmniejszą, największą i średnią pensję
pracownika
●
SELECT Min(pensja) AS Minimum, Max(pensja) AS
Maksimum, AVG(pensja) AS 'Średnia' FROM
Personel;
Minimum
Maksimum
Średnia
9000.00
30000.00
17000.00
Liczba
Suma
2
54000.00
9
GROUP BY
●
Zapytanie
zawierające
klauzulę
GROUP
BY
nazywamy zapytaniem grupującym
●
Wyniki zapytania SELECT dzielone są na grupy i dla
każdej
grupy
zwracany
jest
jeden
wiersz
podsumowania
●
Kolumny wymienione w klauzuli GROUP BY
nazywamy kolumnami grupowania
●
Dla każdego elementu z listy SELECT musi istnieć
możliwość jednoznacznego wyznaczenia wartości w
grupach
10
Ograniczenia klauzuli GROUP BY
●
W klauzuli
SELECT
mogą się znaleźć
●
Nazwy kolumn grupowania
●
Funkcje agregujące
●
Stałe
●
Wyrażenia
zawierające
kombinacje
powyższych
elementów
●
Wszystkie nazwy na liście
SELECT
muszą występować w
klauzuli
GROUP BY
●
Wyjątek stanowią nazwy kolumn stosowane w
funkcjach agregujących
●
W klauzuli
GROUP BY
mogą pojawić się kolumny nie
występujące w klauzuli
SELECT
11
●
Oblicz dla każdego biura liczbę zatrudnionych w nim
pracowników oraz ich sumaryczną pensję
●
SELECT biuroNr, COUNT(pracownikNr) AS Liczba,
Sum(Pensja) AS Suma FROM Personel GROUP BY
biuroNr ORDER BY biuroNr;
●
Kolumny
pracownikNr
oraz pensja występują w
klauzuli
SELECT
jako argumenty funkcji agregujących
●
Kolumna biuorNr musi wystąpić w klauzuli
GROUP BY
biuroNr
Liczba
Suma
B003
3
54000.00
B005
2
39000.00
B007
1
9000.00
12
●
Pracownicy są dzieleni na grupy według biur
●
W ramach każdej grupy pracownicy mają ten samu
numer biura
●
Dla każdej grupy jest wyliczana liczba pracowników
oraz suma wartości z kolumny pensja
●
Wynik jest porządkowany według rosnących wartości
numerów biur
13
Wybór grup
●
W celu wybrania grup stosuje się klauzulę
HAVING
●
Kolumny występujące w klauzuli
HAVING
muszą
się pojawić na liście
GROUP BY
●
Argumenty funkcji agregujących
●
Dla każdego biura zatrudniającego więcej niż jednego
pracownika, podaj liczbę pracowników biura oraz sumę ich
zarobków
●
SELECT biuroNr, COUNT(pracownikNr) AS Liczba,
SUM(pensja) AS Suma FROM Personel GROUP BY
biuroNr HAVING COUNT(pracownikNr) > 1 ORDER
BY biuroNr;
14
Podzapytania
●
Podzapytania są to zapytania SELECT umieszczone
w innym zapytaniu SELECT
●
Zapytanie wewnętrzne
pomaga określić wynik
zapytania zewnętrznego
●
Zapytania wewnętrzne można wykorzystać w
klauzulach
WHERE
i
HAVING
zapytania
zewnętrznego
●
INSERT, UPDATE, DELETE
15
Rodzaje podzapytań
●
Podzapytania skalarne
●
Zwracają jedną kolumnę i jeden wiersz – jedną wartość
●
Mogą być stosowane zawsze gdy wymagana jest
pojedyncza wartość
●
Podzapytanie krotkowe
●
Zwracają kilka kolumn i jeden wiersz (projekcja – jeden
atrybut)
●
Podzapytania tabelowe
●
Zwracają jedną lub więcej kolumn i wiele wierszy
●
Podzapytanie stosowane jest gdy potrzebna jest relacja
16
Podzapytania na liście kolumn klauzuli SELECT
●
Zapytanie skalarne – zwraca wyłącznie jeden rekord
●
Podzapytanie musi być otoczone nawiasami
●
Podaj między pensją każdego pracownika a wartością
średnią pensji wszystkich pracowników
●
SELECT imie, nazwisko, pensja FROM Personel;
–
Dane o pracowniku i jego pensji
●
SELECT AVG(pensja) FROM Personel;
–
Średnia wartość pensji wszystkich pracowników
●
SELECT imie, nazwisko, pensja
-
(SELECT
AVG(pensja) FROM Personel)
AS 'Różnica'
FROM
Personel
;
17
●
Jeżeli w podzapytaniu odwołujemy się do tej samej tabeli
co zapytanie zewnętrzne należy zastosować nazwy
zastępcze
SELECT
biuroNr
,
(SELECT COUNT(pracownikNr) AS Liczba FROM Personel p
WHERE p.biuroNr =
b.biuroNr
)
,
(SELECT SUM(pensja) AS Suma FROM Personel p WHERE
p.biuroNr =
b.biuroNr
)
FROM Biuro b
ORDERED BY biuroNr;
18
Podzapytania w klauzuli WHERE
●
Podzapytanie typu skalarnego i krotkowego
●
Może być stosowane po operatorach:
●
=, <, >, <=, >=, <>, IN, ANY, ALL, SOME
●
Podaj wszystkich pracowników, których pensja
jest wyższa od średniej
●
SELECT pracownikNr, imie, nazwisko, pensja
FROM Personel WHERE pensja > ( SELECT
AVG(pensja) FROM Personel);
19
Zasady tworzenia podzapytań
●
W podzapytaniach nie wolno stosować klauzuli ORDER
BY
●
Może być zastosowana w najbardziej zewnętrznym
zapytaniu
SELECT
●
Lista SELECT podzapytania musi składać się z
pojedynczej nazwy kolumny lub wyrażenia
●
Wyjątek stanowią podzapytania z operatorem EXIST
●
Nazwy kolumn w podzapytaniu odnoszą się do tabeli z
klauzuli FROM podzapytania
●
Odwołanie do kolumny zapytania zewnętrznego wymaga
poprzedzenia jej nazwą tabeli
●
Jeżeli podzapytanie jest jednym z dwóch argumentów, to
musi występować po prawej stronie porównania
20
●
SELECT * FROM Personel WHERE pensja <
( SELECT AVG(pensja) FROM Personel
ORDER BY
imie
);
●
Błędna klauzula ORDER BY w podzapytaniu
●
SELECT * FROM Personel WHERE (
SELECT
AVG(pensja) FROM Personel
< pensja ) ORDER BY
imie;
●
Podzapytanie z lewej strony operatora <
●
SELECT * FROM Personel WHERE pensja <
(
SELECT
AVG(pensja),
MIN(pensja)
FROM
Personel);
●
Dwie nazwy kolumn w podzapytaniu
●
Podzapytanie zwraca rekord składający się z dwóch
atrybutów
21
Zastosowanie IN
●
Operator IN pozwala sprawdzić czy szukana wartość
atrybutu znajduje się w określonym zbiorze
●
Podaj wszystkie nieruchomości nadzorowane przez
pracowników zatrudnionych w biurze przy '163 Main St'
●
Biuro znajdujące się przy wskazanej ulicy może zatrudniać wielu
pracowników
●
Każdy pracownik może nadzorować kilka nieruchomości
●
Niezbędne informacje znajdują się w tabeli Nieruchomosc
SELECT * FROM Nieruchomosc WHERE Pracownik IN
( SELECT pracownikNr FROM Personel WHERE BiuroNr =
( SELECT biuroNr FROM Biuro WHERE ulica = '163 Main St')
)
;
22
ANY/SOME - ALL
●
Operatory mogą być stosowane z podzapytaniami,
które dają w wyniku pojedynczą kolumnę rekordów
●
ALL –
warunek będzie prawdziwy, gdy spełniają go
wszystkie wartości otrzymane w podzapytaniu
●
ANY –
warunek prawdziwy, gdy spełnia go dowolna (jedna
lub kilka) wartość otrzymana za pomocą podzapytania
●
Znajdź wszystkich pracowników, którzy mają pensje wyższą niż
przynajmniej jeden pracownik biura o numerze B003
SELECT * FROM Personel
WHERE pensja >
( SELECT Min(pensja) FROM Personel
WHERE biuroNr = 'B003' );
23
SELECT * FROM Personel
WHERE pensja >
SOME (SELECT pensja FROM Personel
WHERE biuroNr = 'B003');
●
Zapytanie wewnętrzne daje w wyniku zbiór {12000, 18000, 24000}
●
Zapytanie zewnętrzne pozwala wybrać tych pracowników, których
pensja jest większa niż przynajmniej jedna wartość z tego zbioru
●
Znajdź wszystkich tych pracowników, którzy mają pensję wyższa niż
pensja każdego z pracowników biura o numerze B003
SELECT * FROM Personel
WHERE pensja
>
ALL ( SELECT pensja FROM Personel
WHERE biuroNr > 'B003' );
●
Pensja szukanego pracownika musi być większa od każdej pensji
zawartej w zbiorze {12000, 18000, 24000}
24
EXIST – NOT EXIST
●
Słowa kluczowe
EXIST
,
NOT EXIST
można stosować
jedynie z podzapytaniami
●
Wartością wyrażenia jest
prawda
lub
fałsz
●
Predykat EXIST jest prawdziwy wtedy i tylko wtedy,
gdy w tabeli będącej wynikiem podzapytania istnieje
przynajmniej
jeden wiersz
●
Jeżeli wynikiem podzapytania jest tabela pusta
otrzymujemy fałsz
●
NOT EXIST jest predykatem o znaczeniu przeciwnym
●
Sprawdzany jest tylko fakt istnienia lub braku wierszy
●
Podzapytanie może zwracać dowolną liczbę kolumn
25
●
Znajdź wszystkich pracowników zatrudnionych w
biurach w Londynie
SELECT * FROM Personel p
WHERE EXIST
( SELECT * FROM Biuro b
WHERE
p.biuroNr
= b.biuroNr AND miasto =
'Londyn');
●
Warunek
p.biuroNr
=
b.biuroNr
zapewnia, że dla
danego pracownika rozważamy jedynie wiersz z
danymi biura w którym zatrudniony jest pracownik
●
Pominięcie tego warunku spowoduje wybranie
wszystkich wierszy z relacji Personel