background image

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)

background image

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;

background image

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

background image

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

background image

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 COUNTMINMAX 

można stosować do każdego 

rodzaju pól

SUM i AVG 

tylko do pól liczbowych

Funkcja

 COUNT 

nie pomija wartości

 NULL

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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;

background image

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

background image

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

background image

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

;

background image

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;

background image

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);

background image

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

background image

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

background image

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')

)

;

background image

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' );

background image

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}

background image

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

background image

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


Document Outline