SQL3 3

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


Wyszukiwarka

Podobne podstrony:
sql3
sbd, sql3, ===========================================
sql3
SQL3 Nowy standard jezyka SQL 1998 (1)
SQL3 implementacje
sql3
SQL3 Prezentacja

więcej podobnych podstron