background image

Mariusz Wyszomierski – Wyższa Szkoła Informatyki Stosowanej i 
Zarządzania

background image

W danym wyrażeniu operacje są wykonywane zgodnie z 

priorytetem operatorów, począwszy od operatorów o 

najwyższym priorytecie. 

Jeśli operatory o jednakowym priorytecie występują jeden 

obok drugiego, obowiązuje kolejność od lewej do prawej. 

1.

Wszystkie operatory porównywania i operatory SQL mają 

jednakowy, najwyższy priorytet:

= ,   !=,     <,       >,     <=,      >=,       BETWEEN   …   AND 

…,       IN,     LIKE,     IS NULL.

2.

NOT - odwrócenie wyniku porównania, np. 

WHERE NOT ZAROBKI>2 000

3.

AND, przedostatni operator w hierarchii. 

4.

OR, operator o najniższym priorytecie. 

background image

Zaleca się stosowanie nawiasów we wszystkich 

przypadkach, gdzie kolejność wykonywania przez program 

skomplikowanych złożeń operatorów nie jest łatwa do 

przewidzenia. 

Aby np. wybrać wszystkich pracowników na stanowisku 

MANAGER ze wszystkich departamentów wraz ze wszystkimi 

pracownikami zatrudnionymi na stanowisku SPRZEDAWCA w 

departamencie 10, napiszemy dla pewności: 

SELECT * 

FROM   PRACOWNICY 

WHERE  STANOWISKO = 'MANAGER' 

 OR

(STANOWISKO = ‘SPRZEDAWCA' AND DEPARTAMENT = 10);

 

W rzeczywistości nawiasy są tu niepotrzebne, ponieważ 

operator AND jest silniejszy od operatora OR, są one 

wpisane jedynie dla większej czytelności.

background image

Warunki złożone zbudowane są z 
warunków prostych powiązanych 
spójnikami logicznymi AND i OR.

background image

Główne zapytania do bazy to:

SELECT - pobranie z bazy danych, 

INSERT - umieszczenie danych w bazie, 

UPDATE - zmiana danych, 

DELETE - usunięcie danych z bazy. 

background image

W prawdziwych aplikacjach bazodanowych nie wystarczy 

pobieranie danych z jednego źródła (tabeli). Język SQL umożliwia 

nam wybranie danych z wielu tabel na raz.

Przy pobieraniu danych z więcej niż jednej tabeli  musimy nadać 

każdej tabeli alias, a następnie odwoływać się do pól tej tabeli 

przez nadany alias. 

SELECT 

   [alias tabeli 1].[nazwa kolumny],

   [alias tabeli 2].[nazwa kolumny],

   [alias tabeli 3].[nazwa kolumny],

… 

     

FROM 

   [nazwa tabeli 1] [alias tabeli 1], 

   [nazwa tabeli 2] [alias tabeli 2],

   [nazwa tabeli 3] [alias tabeli 3],

background image

Id

Imie

Nazwisk
o

1

Agata

Nowak

2

Michał

Kowalski

3

Cezary

Dąbrowsk
i

4

Magdale
na

Krzyżak

Id

IdKlien

ta

Tresc

1

2

Siema 

stary…

2

4

Jest 

problem…

3

2

Ok do 

zobacz..

4

1

Będę za 15 

min

Pobranie imienia

Klienci

Smsy

SELECT 
   

  Imie,  

 

WHERE

k.Id=s.IdKlienta

FROM 
   

Klienci  , Smsy 

Nazwisko,    Id,    Tresc


nazwiska

, id smsa

oraz treści wysłanej wiadomości:

k

s

k.

k.

s.

s.

Imie

Nazwisko

Id

Tresc

Michał

Kowalski

1

Siema 
stary…

Magdale
na

Krzyżak

2

Jest 
problem…

Michał 

Kowalski

3

Ok do 
zobacz..

Agata

Nowak

4

Będę za 15 
min

Wynik zapytania:

background image

Id

Imie

Nazwisk
o

1

Agata

Nowak

2

Michał

Kowalski

3

Cezary

Dąbrowsk
i

4

Magdale
na

Krzyżak

Id

IdKlien
ta

Tresc

1

2

Siema 
stary…

2

4

Jest 
problem…

3

2

Ok do 
zobacz..

4

1

Będę za 15 
min

Klienci

Sms
y

SELECT 
   

k.Imie, k.Nazwisko, s.Id, s.Tresc

FROM 
   

Klienci k, Smsy s

   

WHERE

k.Id=s.IdKlienta

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

Wynik zapytania:

background image

Id

Imie

Nazwisk
o

1

Agata

Nowak

2

Michał

Kowalski

3

Cezary

Dąbrowsk
i

4

Magdale
na

Krzyżak

Id

IdKlien
ta

Tresc

1

2

Siema 
stary…

2

4

Jest 
problem…

3

2

Ok do 
zobacz..

4

1

Będę za 15 
min

Klienci

Sms
y

SELECT 
   

k.Imie, k.Nazwisko, s.Id, s.Tresc

FROM 
   

Klienci k, Smsy s

   

Wynik zapytania:

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

Agata

Nowak

2

Jest 

problem…

Michał

Kowalski

2

Jest 

problem…

Cezary

Dąbrowski 2

Jest 

problem…

Magdale

na

Krzyżak

2

Jest 

problem…

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

background image

Id

Imie

Nazwisk
o

1

Agata

Nowak

2

Michał

Kowalski

3

Cezary

Dąbrowsk
i

4

Magdale
na

Krzyżak

Id

IdKlien
ta

Tresc

1

2

Siema 
stary…

2

4

Jest 
problem…

3

2

Ok do 
zobacz..

4

1

Będę za 15 
min

Klienci

Sms
y

SELECT 
   

k.Imie, k.Nazwisko, s.Id, s.Tresc

FROM 
   

Klienci k, Smsy s

   

Wynik zapytania:

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

Agata

Nowak

2

Jest 

problem…

Michał

Kowalski

2

Jest 

problem…

Cezary

Dąbrowski 2

Jest 

problem…

Magdale

na

Krzyżak

2

Jest 

problem…

Agata

Nowak

3

Ok. do 

zobacz…

Michał

Kowalski

3

Ok. do 

zobacz…

Cezary

Dąbrowski 3

Ok. do 

zobacz…

Magdale

na

Krzyżak

3

Ok. do 

zobacz…

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

Agata

Nowak

2

Jest 

problem…

Michał

Kowalski

2

Jest 

problem…

Cezary

Dąbrowski 2

Jest 

problem…

Magdale

na

Krzyżak

2

Jest 

problem…

background image

Id

Imie

Nazwisk
o

1

Agata

Nowak

2

Michał

Kowalski

3

Cezary

Dąbrowsk
i

4

Magdale
na

Krzyżak

Id

IdKlien
ta

Tresc

1

2

Siema 
stary…

2

4

Jest 
problem…

3

2

Ok do 
zobacz..

4

1

Będę za 15 
min

Klienci

Sms
y

SELECT 
   

k.Imie, k.Nazwisko, s.Id, s.Tresc

FROM 
   

Klienci k, Smsy s

   

Wynik zapytania:

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

Agata

Nowak

2

Jest 

problem…

Michał

Kowalski

2

Jest 

problem…

Cezary

Dąbrowski 2

Jest 

problem…

Magdale

na

Krzyżak

2

Jest 

problem…

Agata

Nowak

3

Ok. do 

zobacz…

Michał

Kowalski

3

Ok. do 

zobacz…

Cezary

Dąbrowski 3

Ok. do 

zobacz…

Magdale

na

Krzyżak

3

Ok. do 

zobacz…

..

..

Imie

Nazwisko

Id

Tresc

Agata

Nowak

1

Siema 

stary…

Michał

Kowalski

1

Siema 

stary…

Cezary

Dąbrowski 1

Siema 

stary…

Magdale

na

Krzyżak

1

Siema 

stary…

Agata

Nowak

2

Jest 

problem…

Michał

Kowalski

2

Jest 

problem…

Cezary

Dąbrowski 2

Jest 

problem…

Magdale

na

Krzyżak

2

Jest 

problem…

Agata

Nowak

3

Ok. do 

zobacz…

Michał

Kowalski

3

Ok. do 

zobacz…

Cezary

Dąbrowski 3

Ok. do 

zobacz…

Magdale

na

Krzyżak

3

Ok. do 

zobacz…

Iloczyn kartezjański – otrzymaliśmy wszystkie
Kombinacje między wierszy z dwóch tabel 

Należy zawsze pamiętać o warunku WHERE
Łączącym tabele (klucz główny z kluczem obcym)

background image

Funkcje agregujące działają na 
zbiorze rekordów - jako argument 
funkcji podajemy pojedynczą kolumnę

Funkcja agregująca zwraca zawsze 
pojedynczą wartość, obliczoną na 
podstawie zbioru wartości, 
odczytywanych z kolumny podanej 
jako argument funkcji

background image

COUNT() – zwraca liczbę rekordów

SUM() – zwraca sumę rekordów

MIN() – zwraca wartość minimalną

MAX() – zwraca wartość maksymalną

AVG() – zwraca wartość średnią

Warto wiedzieć: funkcje agregujące pomijają przy obliczeniach wartości puste (NULL)

Specjalnym użyciem funkcji count() jest: 
COUNT(*) 

Zwraca ona liczbę wszystkich rekordów w tabeli

Sprawdzenie ile klientów nie podało telefonu:

SELECT COUNT(*)-COUNT(telefon)
FROM Klienci;

background image

Id Marka

Model

Speed

1

HONDA

Accord

217

2

HONDA

Civic

204

3

MAZDA

323

199

4

AUDI

A4

260

5

MAZDA

MX-5

210

6

MAZDA

RX-8

240

7

HONDA

Crx

229

8

AUDI

TT

280

9

AUDI

A6

236

10 MAZDA

MX-6

234

Samochody

SELECT MAX(Speed) as TopSpeed,
       AVG(Speed) as SredniaSpeed,
       MIN(Speed) as MinSpeed 
FROM 
       Samochody;
   

Wynik zapytania:

TopSpeed

SredniaSpee

d

MinSpeed

280

230.9

199

Id Marka

Model

Speed

1

HONDA

Accord

217

2

HONDA

Civic

204

3

MAZDA

323

199

4

AUDI

A4

260

5

MAZDA

MX-5

210

6

MAZDA

RX-8

240

7

HONDA

Crx

229

8

AUDI

TT

280

9

AUDI

A6

236

10 MAZDA

MX-6

234

Podane dane są tylko przykładowe 

background image

Fraza GROUP BY - służy do otrzymywania 
wartości sumarycznych dla 
poszczególnych grup.

Po słowie kluczowym GROUP BY występuje 

wyrażenie grupujące 

- zestaw nazw 

kolumn, które definiują grupowanie.

Nazwy te muszą wystąpić we frazie 
SELECT.

background image

Id Marka

Model

Speed

1

HONDA

Accord

217

2

HONDA

Civic

204

3

MAZDA

323

199

4

AUDI

A4

260

5

MAZDA

MX-5

210

6

MAZDA

RX-8

240

7

HONDA

Crx

229

8

AUDI

TT

280

9

AUDI

A6

236

10 MAZDA

MX-6

234

Samochody

SELECT Marka,
       MAX(Speed) as TopSpeed,
       AVG(Speed) as SredniaSpeed,
       MIN(Speed) as MinSpeed 
FROM 
       Samochody

GROUP BY
       Marka;
   

Wynik zapytania:

Marka

TopSpeed SredniaSpe

ed

MinSpe
ed

AUDI

280

258.6

236

Id Marka

Model

Speed

1

HONDA

Accord

217

2

HONDA

Civic

204

3

MAZDA

323

199

4

AUDI

A4

260

5

MAZDA

MX-5

210

6

MAZDA

RX-8

240

7

HONDA

Crx

229

8

AUDI

TT

280

9

AUDI

A6

236

10 MAZDA

MX-6

234

Marka

TopSpeed SredniaSpe

ed

MinSpe
ed

AUDI

280

258.6

236

HONDA

229

216.6

204

Marka

TopSpeed SredniaSpe

ed

MinSpe
ed

AUDI

280

258.6

236

HONDA

229

216.6

204

MAZDA

240

220.75

199

Podane dane są tylko przykładowe 

background image

Id Data

Miasto

IloscOpado

w

1

10-05-

25

Warszawa

5

2

10-05-

26

Warszawa

6

3

10-05-

25

Łódź

7

4

10-05-

26

Łódź

11

5

10-05-

25

Gdańsk

13

6

10-05-

26

Gdańsk

15

7

10-05-

25

Zakopane

0

8

10-05-

26

Zakopane

14

9

10-05-

25

Szczecin

0

1

0

10-05-

26

Szczecin

0

Wybrać miasta gdzie suma opadów 
jest większa równa 15mm

SELECT 

Miasto,

       

SUM(IloscOpadow) as SumaOpadow

FROM 

Opady

WHERE SumaOpadow >= 15

GROUP BY  Miasto;
   

Opady

Nie wolno używać funkcji agregujących 
w klauzuli WHERE!

background image

Id Data

Miasto

IloscOpado

w

1

10-05-

25

Warszawa

5

2

10-05-

26

Warszawa

6

3

10-05-

25

Łódź

7

4

10-05-

26

Łódź

11

5

10-05-

25

Gdańsk

13

6

10-05-

26

Gdańsk

15

7

10-05-

25

Zakopane

0

8

10-05-

26

Zakopane

14

9

10-05-

25

Szczecin

0

1

0

10-05-

26

Szczecin

0

Wybrać miasta gdzie suma opadów 
jest większa równa 15mm

SELECT 

Miasto,

       

SUM(IloscOpadow) as SumaOpadow

FROM 

Opady

GROUP BY  Miasto

HAVING    SUM(IloscOpadow)>=15   

Opady

Klauzula HAVING pozwala określić kryteria
wybrania pogrupowanych rekordów.

W klauzuli HAVING mogą się znaleźć
 tylko wyrażenia grupujące oraz 
funkcje agregujące!

HAVING  Miasto=’Warszwa’ or Miasto=’Łódź’ 

HAVING  SUM(IloscOpadow)>=15

background image

Najprościej mówiąc, podzapytanie jest to 

zapytanie zagnieżdżone w innym zapytaniu SQL

Podzapytania mogą występować w klauzuli  

WHERE oraz HAVING, rzadziej, ale również mogą 

występować w klauzulach SELECT oraz FROM

Podzapytanie musi być objęte nawiasami 

zapytanie nadrzędne  (zewnętrzne )– 

zawierające podzapytanie

zapytanie podrzędne (wewnętrzne) – 

podzapytanie

background image

Podzapytanie  nie skorelowane (niepowiązane) - wykonuje się tylko 
raz
, przed zapytaniem zewnętrznym, a jego wyniki są przekazywane do 
zapytania zewnętrznego.
Charakterystyczne dla zapytań niepowiązanych jest to, że zapytanie 
wewnętrzne można wykonać jako osobną instrukcję. 
Podzapytanie  skorelowane (powiązane) - wymaga danych z 
zapytania zewnętrznego, zanim może być wykonane. Dane zwrócone 
przez podzapytanie powiązane wprowadzane są z powrotem do 
zapytania zewnętrznego, a podzapytanie wykonywane jest tyle razy, 
ile wierszy 
zwróciło zapytanie zewnętrzne.

background image

Interpreter SQL wykonuje zapytania 
począwszy od najbardziej 
zagłębionego podzapytania, aby móc 
użyć jego wyniku w zapytaniu 
zewnętrznym

background image

Id Data

Miasto

IloscOpado

w

1

10-05-

25

Warszawa

5

2

10-05-

26

Warszawa

6

3

10-05-

25

Łódź

7

4

10-05-

26

Łódź

11

5

10-05-

25

Gdańsk

13

6

10-05-

26

Gdańsk

15

7

10-05-

25

Zakopane

0

8

10-05-

26

Zakopane

14

9

10-05-

25

Szczecin

0

1

0

10-05-

26

Szczecin

0

Opady

Wybrać miasto z największą ilością opadów:

SELECT

Miasto,
IloscOpadow

FROM

Opady

WHERE 

IloscOpadow =
(SELECT MAX(IloscOpadow) 
FROM opady)

Najpierw wykonuje się podzapytanie

SELECT

Miasto,
IloscOpadow

FROM

Opady

WHERE 

IloscOpadow = 15

Wynik zapytania:

Miasto

Ilosc opadow

Gdańsk

15

Pokazane w przykładzie podzapytanie zwraca
tylko jeden wiersz z jedną wartością.

background image

Wybrać miasto z największą ilością opadów – porównać wyniki ze StacjiMeto1 i StacjiMeteo2:

SELECT

Miasto,
IloscOpadow

FROM

StacjaMeteo1

WHERE 

(IloscOpadow,Data) =
(SELECT 

MAX(IloscOpadow),
Data 

 FROM StacjaMeteo2)

Wynik zapytania:

Miasto

Ilosc opadow

Gdańsk

15

Jak radzić sobie z podzapytaniem , które zwraca jeden wiersz, ale dwie wartości?

15, 10-05-26

background image

Teraz zajmiemy się podzapytaniem zwracającym wiele wierszy.

SELECT * 
FROM  Zamowienia 
WHERE  klient_id =

(SELECT klient_id 
 FROM Klienci
 WHERE nazwisko = ‘Kowalski');

SELECT * 
FROM  Zamowienia 
WHERE  klient_id 

IN

(SELECT klient_id 
 FROM Klienci
 WHERE nazwisko = ‘Kowalski');

• Podzapytanie zwróci nam ID klientów o nazwisku  „Kowalski”.

• Może się tak zdarzyć, że w bazie będzie kilku klientów, wtedy zapytanie zwróci kilka wierszy.
• 

Warunek WHERE klient_id=(zbiór ID) 

jest nie dopuszczalny!

• Nie można porównywać jednej wartości ze zbiorem wartości.

• W wypadku porównywania zawierającego wiele wierszy należy używać operatorów:
    IN, NOT IN, EXISTS, NOT EXISTS, ANY, ALL

   

background image

WHERE

 zmienna

 IN (

zbiór wartości…

)

sprawdza czy 

zmienna

 znajduje się w 

zbiorze wartości

WHERE

 zmienna 

NOT IN (

zbiór wartości…

sprawdza czy 

zmienna

 NIE znajduje się w 

zbiorze wartości

WHERE EXISTS(podzapytanie)

warunek jest spełniony, gdy podzapytanie zwróci 
jakikolwiek wiersz

WHERE NOT EXISTS(podzapytanie)

warunek jest spełniony, gdy podzapytanie nie zwróci 
żadnej wartości

background image

WHERE

 zmienna

 [>,<,…] ANY (

zbiór wartości…

)

warunek ten jest spełniony jeżeli 

wyrażenie

 jest zgodne z 

co najmniej jedną wartością zawartą w 

zbiorze wartości

.

 

SELECT nazwisko 
FROM

pracownicy

WHERE  pensja > 

ANY

  

(SELECT pensja
FROM pracownicy
WHERE id_zesp = 7);

Wybieramy nazwiska pracowników, których pensja jest większa 
od pensji któregokolwiek z pracowników zespołu 7

To jest równoznaczne z wybraniem pracowników, których pensja jest większa
od minimalnej pensji w zespole 7

background image

WHERE

 zmienna

 [>,<,…] ALL (

zbiór wartości…

)

warunek ten jest spełniony jeżeli 

wyrażenie

 jest zgodne  

ze wszystkimi wartościami zawartymi w 

zbiorze wartości

.

 

SELECT nazwisko 
FROM

pracownicy

WHERE  pensja > 

ALL

  

(SELECT pensja
FROM pracownicy
WHERE id_zesp = 7);

Wybieramy nazwiska pracowników, których pensja jest większa 
od pensji, wszystkich pracowników z zespołu 7

To jest równoznaczne z wybraniem pracowników, których pensja jest większa
od maksymalnej pensji w zespole 7

background image

Cechą charakterystyczną podzapytań skorelowanych 

jest odwołanie wewnątrz podzapytania, do atrybutu z 

relacji, którą przegląda zapytanie zewnętrzne. To 

odwołanie nosi nazwę korelacji.

Podzapytanie skorelowane wykonywane jest dla 

każdego wiersza wyniku zapytania zewnętrznego i 

może być z nim porównywane.

Podzapytanie powiązane, można łatwo rozpoznać po 

tym, że kolumna (kolumny) wyniku podzapytania jest 

porównywana z kolumną (kolumnami) wyniku 

zapytania zewnętrznego.

Niezależne wykonanie wewnętrznego zapytania 

(podzapytania) jest w tym przypadku niemożliwe.

background image

Wybrać nazwiska pracowników zarabiających więcej niż średnia płaca 
w grupie do której należą.

SELECT nazwisko 
FROM  pracownicy p
WHERE  pensja >

(SELECT AVG(pensja) 
 FROM pracownicy
 WHERE grupa = p.grupa);

Ponieważ zarówno w zapytaniu zewnętrznym, jak i w podzapytaniu
operujemy na tej samej tabeli PRACOWNICY, konieczne jest zdefiniowanie
aliasu  („

p

”) dla tabeli PRACOWNICY, przeglądanej w zapytaniu zewnętrznym.

Korelacja jest realizowana przez  porównanie kolumny
GRUPA w podzapytaniu (GRUPA = 

P.GRUPA

).

background image

SELECT nazwisko 
FROM 

pracownicy p

WHERE  pensja >

(SELECT AVG(pensja) 
 FROM 

pracownicy

 WHERE grupa = 

p.grupa

);

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

pracownicy 

1. Zapytanie zewnętrzne 

wybiera pierwszy rekord

2. Podzapytanie

 wylicza średnią pensję dla grupy 

SPRZEDAWCA (3000 zł)

3. Sprawdzany jest warunek czy pensja 

Nowackiego (2000 zł) jest większa od średniej pensji
grupy do której należy (3000 zł)

4. Odpowiedź brzmi nie, także pierwszy rekord

nie wejdzie do wyniku

5. Teraz  pobierany jest kolejny rekord

z tablicy 

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

background image

SELECT nazwisko 
FROM 

pracownicy p

WHERE  pensja >

(SELECT AVG(pensja) 
 FROM 

pracownicy

 WHERE grupa = 

p.grupa

);

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

pracownicy 

1. Zapytanie zewnętrzne 

wybiera drugi rekord

2. Podzapytanie

 wylicza średnią pensję dla grupy 

SPRZEDAWCA (3000 zł)

3. Sprawdzany jest warunek czy pensja 

Kowalskiego (4000zł) jest większa od średniej pensji
grupy do której należy (3000 zł)

4. Odpowiedź brzmi TAK, także drugi rekord

wejdzie do wyniku

5. Teraz  pobierany jest kolejny rekord

z tablicy 

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

background image

SELECT nazwisko 
FROM 

pracownicy p

WHERE  pensja >

(SELECT AVG(pensja) 
 FROM 

pracownicy

 WHERE grupa = 

p.grupa

);

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

pracownicy 

1. Zapytanie zewnętrzne 

wybiera trzeci rekord

2. Podzapytanie

 wylicza średnią pensję dla grupy 

MENAGER (4000 zł)

3. Sprawdzany jest warunek czy pensja 

Górskiego (3000zł) jest większa od średniej pensji
grupy do której należy (4000 zł)

4. Odpowiedź brzmi NIE, także ten rekord

nie wejdzie do wyniku

5. Następnie  pobierany jest kolejny rekord

z tablicy 

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

background image

SELECT nazwisko 
FROM 

pracownicy p

WHERE  pensja >

(SELECT AVG(pensja) 
 FROM 

pracownicy

 WHERE grupa = 

p.grupa

);

pracownicy p

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

pracownicy 

1. Zapytanie zewnętrzne 

wybiera czwarty rekord

2. Podzapytanie

 wylicza średnią pensję dla grupy 

MENAGER (4000 zł)

3. Sprawdzany jest warunek czy pensja 

Wesołowskiego (5000zł) jest większa od średniej pensji
grupy do której należy (4000 zł)

4. Odpowiedź brzmi TAK, także ten rekord

wejdzie do wyniku

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

IdPr

ac

Grupa

Nazwisko

Pensja

1

Sprzedawc

a

Nowacki

2000

2

Sprzedawc

a

Kowalski

4000

3

Menager

Górski

3000

4

Menager

Wesołows

ki

5000

background image

Zapytanie zewnętrzne przejrzało 

cztery

 rekordy

Podzapytanie zostało wykonane 

czterokrotnie

Do zbioru wynikowego trafiły dwa 
rekordy, które spełniły warunek

background image

SELECT  

id_zesp

,

nazwa

FROM 

zespoly z 

WHERE NOT EXISTS 

(SELECT * 
FROM pracownicy
WHERE 

id_zesp=

z.id_zesp

);

Zapytanie ma na celu wybranie zespołów,
nie posiadających pracowników.

1. Zapytanie zewnętrzne 

wybiera po 

kolei
wszystkie zespoły z tabeli ZESPOLY

2. Dla każdego wybranego zespołu  

wywoływane jest 

podzapytanie

 

szukające w tabeli PRACOWNICY 
osób, które należą do wybranego 
przez 

zapytanie zewnętrzne 

zespołu 

(

z.id_zesp

).

3. Jeżeli 

podzapytanie

 nie znajdzie 

takich osób (zwróci zbiór pusty) to 
warunek
NOT EXISTS zostanie spełniony i 
grupa wybrana przez 

zapytanie 

zewnętrzne 

zostanie dodana do 

zbioru wynikowego.

background image

Klauzula GRANT służy do nadawania 

uprawnień użytkownikom

Klauzula REVOKE służy do 

odbierania uprawnień użytkownikom

Użytkownik ma pełne prawa do 

obiektów, które utworzył. Tych praw 

nie można mu odebrać.

background image
background image

GRANT 

lista_przywilejów

 

ON nazwa_obiektu 

TO lista_użytkowników 

[WITH GRANT OPTION]; 

Nazwy przywilejów:

SELECT– odczytanie danych z tabeli
INSERT [nazwy kolumny] – wstawianie danych do tabeli
UPDATE [nazwy kolumny] – modyfikowanie danych w tabeli
DELETE – usunięcie danych z tabeli
REFERENCE – odwoływanie się do innych tabel
EXECUTE  

 pozwala użytkownikowi na uruchomienie procedur. 

CREATE – tworzenie nowych tabel i baz danych
DROP – usuwanie tabel oraz baz danych
ALTER – uaktualnienie struktury tabeli
ALL PRIVILEGES – wszystkie dostępne uprawnienia 

background image

GRANT lista_przywilejów 

ON 

nazwa_obiektu

 

TO lista_użytkowników 

[WITH GRANT OPTION]; 

Obiektem może być tabela, baza, perspektywa, sesja (połączenie z bazą danych), trigger,
sekwencja lub procedura

background image

GRANT lista_przywilejów 

ON nazwa_obiektu 

TO 

lista_użytkowników

 

[WITH GRANT OPTION]; 

PUBLIC – nadanie praw wszystkim 
użytkownikom
lub 

Podajemy nazwy użytkowników, którym chcemy 
nadać prawa
lub

background image

GRANT lista_przywilejów 

ON nazwa_obiektu 

TO lista_użytkowników 

[WITH GRANT OPTION];

 

[WITH GRANT OPTION]

 

– dodanie tej instrukcji na końcu zapytania 

umożliwi nadawanie wcześniej przyznanych praw do wybranego obiektu 
innym użytkownikom

background image

ADMIN

BIZNES

STUDENT

Ma wszystkie
przywileje

ADMIN:
GRANT  SELECT
ON 

klienci

TO 

BIZES

SELECT

background image

ADMIN

BIZNES

STUDENT

Ma wszystkie
przywileje

ADMIN:
GRANT  INSERT
ON 

klienci

TO 

BIZES

WITH GRANT OPTION

SELECT

INSERT

background image

ADMIN

BIZNES

STUDENT

Ma wszystkie
przywileje

BIZNES:
GRANT  INSERT
ON 

klienci

TO 

STUDENT

SELECT

INSERT

INSERT

background image

ADMIN

BIZNES

STUDE
NT

Ma wszystkie
przywileje

ADMIN:
GRANT INSERT
ON 

klienci

TO 

STUDENT

SELECT

INSERT

INSERT

background image

Podobne jak w przypadku GRANT w klauzuli REVOKE 

mogą wystąpić ALL PRIVILEGES oraz PUBLIC.

Jeżeli „Janek” otrzymał takie samo prawo od wielu 

użytkowników to odebranie praw przez jednego 

użytkownika nie powoduje odebrania tego prawa.

Dopiero, gdy wszystkie osoby, od których otrzymał 

dane prawo odbiorą mu je, wtedy zostanie ono 

utracone.

Jeśli użytkownik przekazał prawo, które uzyskał z 

klauzulą GRANT OPTION, to odebranie mu tej opcji 

powoduje, że prawo, które przekazał innym, jest im 

odbierane.

background image

ADMIN

BIZNES

STUDE
NT

Ma wszystkie
przywileje

BIZNES:
REVOKE INSERT
ON 

klienci

FROM  STUDENT

SELECT

INSERT

INSERT

STUDENT ma nadal przywilej INSERT,
Ponieważ dostał go również od ADMINa.

background image

ADMIN

BIZNES

STUDE
NT

Ma wszystkie
przywileje

ADMIN:
REVOKE INSERT
ON 

klienci

FROM  BIZNES

SELECT

INSERT

INSERT

background image

ADMIN

BIZNES

STUDE
NT

Ma wszystkie
przywileje

ADMIN:
REVOKE INSERT
ON 

klienci

FROM  STUDENT

SELECT

INSERT

Dopiero teraz STUDENT został
pozbawiony przywileju INSERT

background image

ADMIN

BIZNES

STUDENT

Ma wszystkie
przywileje

ADMIN:
GRANT  SELECT
ON 

klienci

TO 

PUBLIC

SELECT

SELECT

PUBLIC – jest to tzw. rola czyli
grupa użytkowników.  Do tej 
grupy należą wszyscy 
użytkownicy. Każdy nowo 
utworzony użytkownik należy 
również do roli PUBLIC.


Document Outline