20
Język SQL zapytania zagnieżdżon e (podzapytan ia)

Język SQL – zapytania zagnieżdżone (podzapytania)

  • Upload
    adeola

  • View
    55

  • Download
    0

Embed Size (px)

DESCRIPTION

Język SQL – zapytania zagnieżdżone (podzapytania). Zapytania zagnieżdżone. Język SQL pozwala na zagnieżdżanie zapytań (podzapytania) Oznacza to, że wynik jednego zapytania może być wykorzystany przez inne zapytanie, będące jego nadzapytaniem - PowerPoint PPT Presentation

Citation preview

Page 1: Język SQL –  zapytania zagnieżdżone (podzapytania)

Język SQL – zapytania zagnieżdżone(podzapytania)

Page 2: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zapytania zagnieżdżone

Język SQL pozwala na zagnieżdżanie zapytań Język SQL pozwala na zagnieżdżanie zapytań (podzapytania) (podzapytania)

Oznacza to, że wynik jednego zapytania może być Oznacza to, że wynik jednego zapytania może być wykorzystany przez inne zapytanie, będące jego wykorzystany przez inne zapytanie, będące jego nadzapytaniemnadzapytaniem

Inaczej – jedno zapytanie może w klauzuli Inaczej – jedno zapytanie może w klauzuli wherewhere zawierać inne, zagnieżdżone zapytanie. zawierać inne, zagnieżdżone zapytanie.

Page 3: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zapytania zagnieżdżone – przykład 1

Podaj towary z działu, którego kierownikiem jest KowalskiPodaj towary z działu, którego kierownikiem jest Kowalski

select nazwaselect nazwafrom towaryfrom towarywhere dzial = (select dzial where dzial = (select dzial

from dzialyfrom dzialy where kierownik = ‘Kowalski’)where kierownik = ‘Kowalski’)

podzapytanie zwraca numer działu, którego kierownikiem jest Kowalski;wartość ta jest następnie wykorzystana w nadzapytaniu w warunku where

Page 4: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zapytania zagnieżdżone c.d.

Standardowym zastosowaniem zapytań Standardowym zastosowaniem zapytań zagnieżdżonych jest testowanie przynależności do zagnieżdżonych jest testowanie przynależności do zbioru, porównywanie zbiorów, oraz sprawdzanie zbioru, porównywanie zbiorów, oraz sprawdzanie liczebności zbioru.liczebności zbioru.

Operatory należenia do zbioru:Operatory należenia do zbioru:ININ (należy) (należy)NOT INNOT IN (nie należy) (nie należy)

Page 5: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zapytania zagnieżdżone – przykład 2

Podaj towary z działów, których kierownikiem jest KowalskiPodaj towary z działów, których kierownikiem jest Kowalski

select nazwaselect nazwafrom towaryfrom towarywhere dzial where dzial inin (select dzial (select dzial

from dzialyfrom dzialy where kierownik = ‘Kowalski’)where kierownik = ‘Kowalski’)

Jeżeli Kowalski jest kierownikiem więcej niż jednego działu, podzapytanie zwróci zbiór wartości.Dlatego zamiast znaku = musimy zastosować operator in

Page 6: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zapytania zagnieżdżone – przykład 3

select nazwisko, imie from pracownicy

where pesel in (select peselp

from obsada

where rok_akad = '2003L')

Pracownicy, którzy mają zajęcia na wydziale w semestrze letnim w roku akademickim 2003

Page 7: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadania

Podaj nazwiska pracowników, którzy Podaj nazwiska pracowników, którzy pracują w dziale ‘SYSTEMY pracują w dziale ‘SYSTEMY EKSPERCKIE’EKSPERCKIE’

Podaj nazwiska pracowników, którzy Podaj nazwiska pracowników, którzy pracują na Piotrowie.pracują na Piotrowie.

Podaj nazwę działu, w którym nie pracuje Podaj nazwę działu, w którym nie pracuje żaden pracownik.żaden pracownik.

Page 8: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadania

Podaj nazwiska pracowników, którzy Podaj nazwiska pracowników, którzy pracują na tym samym stanowisku co pracują na tym samym stanowisku co Hapke.Hapke.

Podaj nazwisko najlepiej zarabiającego Podaj nazwisko najlepiej zarabiającego pracownika.pracownika.

Podaj nazwiska pracowników zarabiających Podaj nazwiska pracowników zarabiających powyżej średniej.powyżej średniej.

Page 9: Język SQL –  zapytania zagnieżdżone (podzapytania)

Klauzula SOME F <F <porównanieporównanie> > some some r r t t rr :: ( (F <F <porównanieporównanie> > tt))

gdziegdzie < <porównanieporównanie> > toto: :

056

(5< some ) = true

05

0

) = false

5

05(5 some ) = true (bo 0 5)

(read: 5 < some tuple in the relation)

(5< some

) = true(5 = some

(= some) inJednakże, ( some) not in

Page 10: Język SQL –  zapytania zagnieżdżone (podzapytania)

Klauzula ALLF <F <porównporówn> > all all r r t t rr (F < (F <porównporówn> >

t)t)056

(5< all ) = false

610

4

) = true

5

46(5 all ) = true (bo 5 4 i 5 6)

(5< all

) = false(5 = all

( all) not inJednakże, (= all) in

Page 11: Język SQL –  zapytania zagnieżdżone (podzapytania)

Klauzula ALL - przykład

select nazwa

from towary

where cena >= ALL (select cena

from towary

where rodzaj = ‘AGD’)

Wybierz towary, których cena jest wyższa od każdej z cen towarów AGD

(można oczywiście w tym przypadku zastąpić MAX)

Page 12: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadania

Podaj nazwiska i stanowiska pracowników, którzy Podaj nazwiska i stanowiska pracowników, którzy pracują na stanowiskach nie obsadzonych w dziale pracują na stanowiskach nie obsadzonych w dziale 20 (wykorzystaj ALL).20 (wykorzystaj ALL).

Sprawdź, czy istnieją pracownicy zatrudnieni Sprawdź, czy istnieją pracownicy zatrudnieni wcześniej od wszystkich pracowników Systemów wcześniej od wszystkich pracowników Systemów Rozproszonych (wykorzystaj ALL).Rozproszonych (wykorzystaj ALL).

Sprawdź, czy BRZEZINSKI zarabia więcej od Sprawdź, czy BRZEZINSKI zarabia więcej od któregokolwiek z innych profesorów (wykorzystaj któregokolwiek z innych profesorów (wykorzystaj SOME; jeżeli tak – wypisz ‘TAK’).SOME; jeżeli tak – wypisz ‘TAK’).

Page 13: Język SQL –  zapytania zagnieżdżone (podzapytania)

Podzapytania skorelowane

Dotychczasowe przykłady dotyczyły Dotychczasowe przykłady dotyczyły podzapytań podzapytań nieskorelowanychnieskorelowanych – były one – były one obliczane tylko raz, były niezależne od obliczane tylko raz, były niezależne od nadzapytanianadzapytania

Podzapytania Podzapytania skorelowaneskorelowane – zależą od tego, – zależą od tego, jakie wartości są przetwarzane w jakie wartości są przetwarzane w nadzapytaniu, wykonywane są wielokrotnie nadzapytaniu, wykonywane są wielokrotnie dla zmieniających się wartościdla zmieniających się wartości

Page 14: Język SQL –  zapytania zagnieżdżone (podzapytania)

Przykład Podaj nazwę najdroższego towaru od Podaj nazwę najdroższego towaru od

każdego z dostawców.każdego z dostawców.

select nazwafrom towary T1where cena = (select max(cena)

from towary T2 where T2.dostawca = T1.dostawca)

Podzapytanie zwraca najwyższą cenę u danego dostawcy.Wynik podzapytania zależy od tego kto jest dostawcą towaru aktualnie analizowanego w nadzapytaniu

Page 15: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadania

Dla każdego działu podaj nazwisko najmniej Dla każdego działu podaj nazwisko najmniej zarabiającego pracownika.zarabiającego pracownika.

Podaj nazwiska pracowników, którzy zarabiają Podaj nazwiska pracowników, którzy zarabiają więcej od swojego szefa.więcej od swojego szefa.

Podaj nazwiska pracowników, których płaca nie Podaj nazwiska pracowników, których płaca nie mieści się w ‘widełkach’ płacowych na ich mieści się w ‘widełkach’ płacowych na ich stanowisku.stanowisku.

Podaj nazwę działu, w którym pracuje najlepiej Podaj nazwę działu, w którym pracuje najlepiej zarabiający pracownik.zarabiający pracownik.

Page 16: Język SQL –  zapytania zagnieżdżone (podzapytania)

Test istnienia

Konstrukcja Konstrukcja existsexists zwraca wartość zwraca wartość truetrue jeżeli argument zwracany jako wartość jeżeli argument zwracany jako wartość podzapytania jest niepustypodzapytania jest niepusty..

existsexists r r r r ØØ not existsnot exists r r r r = = ØØ

Page 17: Język SQL –  zapytania zagnieżdżone (podzapytania)

Test istnienia - przykład

Podaj działy, w których nie ma towarów.Podaj działy, w których nie ma towarów.

select *from dzialy dwhere not exists (select *

from towary t where t.dzial = d.dzial)

Page 18: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadania – wykorzystaj exists/not exists

Podaj działy, w których nie pracuje żaden Podaj działy, w których nie pracuje żaden pracownik.pracownik.

Podaj nazwiska pracowników, którzy mają Podaj nazwiska pracowników, którzy mają chociaż jednego podwładnego.chociaż jednego podwładnego.

Podaj działy, w których chociaż jeden Podaj działy, w których chociaż jeden profesor zarabia powyżej 1000.profesor zarabia powyżej 1000.

Page 19: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadanka ekstra Podaj nazwiska trzech najlepiej zarabiających Podaj nazwiska trzech najlepiej zarabiających

pracowników (z możliwością uogólnienia na pracowników (z możliwością uogólnienia na nn pracowników)pracowników)

Znajdź dział zatrudniający najwięcej pracowników.Znajdź dział zatrudniający najwięcej pracowników. Sprawdź, czy istnieje pracownik, który ma Sprawdź, czy istnieje pracownik, który ma

podwładnych w każdym z działów (oprócz 50 podwładnych w każdym z działów (oprócz 50 oczywiście).oczywiście).

w razie braku pomysłów – wskazówki na następnym w razie braku pomysłów – wskazówki na następnym slajdzie...slajdzie...

Page 20: Język SQL –  zapytania zagnieżdżone (podzapytania)

Zadanka ekstra - wskazówki być jednym z trzech najlepiej zarabiających to być jednym z trzech najlepiej zarabiających to

znaczy, że co najwyżej dwie osoby zarabiają znaczy, że co najwyżej dwie osoby zarabiają lepiej; Wykorzystaj podzapytanie zliczające te lepiej; Wykorzystaj podzapytanie zliczające te osoby; wynik podzapytania można przyrównać do osoby; wynik podzapytania można przyrównać do liczbyliczby

nie można zrobić max(count(_)); wykorzystaj ALLnie można zrobić max(count(_)); wykorzystaj ALL „„pracownik, który ma podwładnych w każdym z pracownik, który ma podwładnych w każdym z

działów” to inaczej: „nie istnieje dział, który nie działów” to inaczej: „nie istnieje dział, który nie zatrudnia podwładnych danego pracownika”; zatrudnia podwładnych danego pracownika”; wykorzystaj „not exists”wykorzystaj „not exists”