Reklama
Wizyt
Dzisiaj: 278Wszystkich: 520555

Podzapytania

Technikum » SBD » SQL » Podzapytania

 

Zapytanie definiowane przy użyciu instrukcji SELECT może zostać umieszczone wewnątrz innej instrukcji SELECT. Tak zagnieżdżone zapytanie nazywamy podzapytaniem. Możemy używać również nazw zapytanie zagnieżdżone lub zapytanie wewnętrzne. Ponieważ serwery bazodanowe najpierw wykonują zapytania wewnętrzne, wyniki tych właśnie zapytań mogą być używane jako warunki logiczne kolejnych zapytań. Zagnieżdżanie zapytań można stosować w instrukcjach SELECT, INSERT, UPDATE i DELETE w klauzuli WHERE lub FROM. Każde podzapytanie klauzuli WHERE lub FROM jest umieszczane wewnątrz nawiasów okrągłych i może zawierać dowolną liczbę podzapytań.

Najczęściej wynikiem zapytania typu SELECT jest tabela składająca się z kolumn i wierszy, więc można na niej wykonywać kolejne zapytania typu SELECT.

Przy takim założeniu ogólna postać zapytania może wyglądać tak:

          SELECT kolumna1, kolumna2, kolumna3, ...
          FROM Tabela1

          WHERE kolumna1 =
               (SELECT kolumnaA1
               FROM TabelaA1
               WHERE warunek_podzapytania AS nazwa)

 

 

Podzapytania klauzuli WHERE


Zapytania wewnętrzne używane w klauzuli WHERE mogą zwracać pojedynczą wartość, listę wartości lub dane tabelaryczne (zawierające kilka kolumn).


Przykład

Na podstawie numeru faktury chcemy odczytać nazwisko i imię klienta, dla którego faktura została wystawiona.


Wynik zapytania wewnętrznego jest pojedynczą wartością. Zwraca id_klienta, dla którego została wystawiona faktura o numerze 2. Zapytanie zewnętrzne zwraca imię i nazwisko klienta o wskazanym id_klienta.

Jeżeli takie same nazwy kolumn powtarzają się w kilku tabelach, w podzapytaniach powinny być one poprzedzone nazwami tabel — pozwoli to uniknąć błędów serwera.
Jeżeli zapytanie wewnętrzne zwraca tylko jedną wartość, to w zapytaniu zewnętrznym w klauzuli WHERE można użyć operatorów: =, <, >, <=, >=, <>.
Gdyby zwróciło listę wartości, użycie tych operatorów byłoby nielogiczne. Serwer bazodanowy nie potrafiłby jednoznacznie określić ich znaczenia. Jeżeli zaistnieje taka sytuacja, to do porównania należy użyć operatora IN. Zwróci on prawdę, jeżeli chociaż jedna wartość z listy spełnia zdefiniowany warunek.


Przykład

Na podstawie daty wysłania chcemy odczytać tytuł i cenę książek wysłanych do klientów 1 czerwca 2012 roku.



Zapytanie wewnętrzne może wywoływać funkcje grupujące.


Przykład

Chcemy odczytać tytuły książek, których cena dwukrotnie przekracza średnią cenę książek zapisanych w bazie danych.

 

 

Podzapytania klauzuli FROM


Wynikiem zapytania typu SELECT jest tabela zawierająca określone w zapytaniu kolumny, zatem możliwe jest wykonanie na niej kolejnego zapytania typu SELECT. W ten sposób tworzone są podzapytania w klauzuli FROM. Tabeli zwróconej przez podzapytanie użyte w klauzuli FROM należy przypisać nazwę.


Tabele pochodne

Jeżeli zapytanie wewnętrzne zwraca wartości w postaci danych tabelarycznych, to tworzone są tabele pochodne. Są one dostępne tylko w zapytaniu, w którym zostały utworzone.


Przykład


W podanym przykładzie w wyniku wykonania zapytania wewnętrznego otrzymaliśmy wybrane wiersze i kolumny z tabeli Ksiazki. Tak powstałej tabeli pochodnej została nadana nazwa (alias) Li. W zapytaniu zewnętrznym zawartość tej tabeli jest odczytywana w podobny sposób jak zawartość zwykłej tabeli.

Tabele pochodne są stosowane w celu uproszczenia zapytań i poprawienia ich czytelności.

 

Operatory zapytań wewnętrznych


Podzapytania zwracające w zapytaniu wewnętrznym listę wartości wymagają zastosowania w klauzuli WHERE specjalnych operatorów. Są to operatory:

  • IN sprawdza, czy chociaż jedna wartość z listy spełnia zdefiniowany warunek. Lista wartości musi składać się z jednej kolumny.
  • EXISTS służy do sprawdzenia, czy w wyniku wykonania zapytania wewnętrznego zostały zwrócone jakiekolwiek wartości.
  • ANY, SOME są synonimami i działają dokładnie tak samo. Sprawdzają wartość wybranego wiersza wyniku podzapytania.
  • ALL sprawdza wartość wszystkich wierszy wyniku podzapytania.

 

Operator EXISTS

Operator EXISTS zwraca tylko prawdę lub fałsz. Jeżeli w wyniku wykonania zapytania wewnętrznego zostały zwrócone jakiekolwiek wartości, operator EXISTS zwraca prawdę, a jeżeli nie zostały zwrócone żadne wartości, zwraca fałsz.


Przykład


W wyniku wykonania zapytania zostanie zwrócona lista klientów, którzy złożyli zamówienia na książki.


Przykład


W podanym przykładzie operator EXISTS został użyty do wyszukania powtarzających się danych klientów. Dane te mogły przez pomyłkę zostać kilkakrotnie wpisane do bazy. W celu stwierdzenia braku danych operator EXISTS może zostać zastosowany razem z operatorem NOT.
W przykładzie poniżej dodanie operatora NOT spowoduje wyświetlenie listy klientów, którzy nie złożyli żadnego zamówienia na książki.


Przykład

 


Operator ANY lub SOME

Operator ANY zwraca prawdę, jeśli którakolwiek ze zwróconych wartości wyniku zapytania wewnętrznego spełnia poprzedzający je warunek.


Przykład


Podzapytanie zwróci nazwiska klientów, dla których faktury zostały wystawione w dniu złożenia zamówienia.

 

Operator ALL

Operator ALL zwraca prawdę, jeżeli wszystkie ze zwróconych wartości wyniku zapytania wewnętrznego spełniają poprzedzający je warunek.


Przykład

 

Podzapytanie zwróci tytuły książek, które są tańsze od najniższych kosztów wysyłki. Najprawdopodobniej niewielu klientom opłaca się zamawiać książki, których koszt wysyłki przekracza cenę książki.

 

Podzapytania w instrukcjach modyfikujących dane

Podzapytania mogą być definiowane w instrukcjach modyfikujących dane, takich jak: INSERT, UPDATE, DELETE.


Przykład

W bazie danych zostanie utworzona nowa tabela Archiwum, która będzie zawierała imiona i nazwiska klientów oraz informacje o złożonych zamówieniach.




Powstałą tabelę wypełnimy danymi z tabel Klient i Zamowienia. Możemy to zrealizować za pomocą instrukcji INSERT z odpowiednio zdefiniowanym podzapytaniem.



Przykład

Skoro w utworzonej tabeli nazwiska klientów powtarzają się tyle razy, ile razy zamawiali oni książki, można tak zmodyfikować polecenie, aby w tabeli zostały umieszczone nazwiska i imiona klientów z liczbą zamówień złożonych przez każdego z nich (w tym celu w tabeli Archiwum należy dodać pole Liczba zamówień). W podzapytaniu trzeba użyć grupowania oraz funkcji agregujących.

 

Podzapytania skorelowane


Używane do tej pory podzapytania proste były wykonywane tylko jeden raz. W podzapytaniach skorelowanych następuje odwołanie się w zapytaniu wewnętrznym do wyniku zapytania zewnętrznego. W związku z tym zapytanie wewnętrzne wykonywane jest osobno dla każdego wiersza zwróconego przez zapytanie zewnętrzne.


Przykład

Mamy sprawdzić, które książki mają cenę wyższą niż średnia cena książek wydanych w tym samym roku.


Dla każdej książki rozpatrywanej w zapytaniu zewnętrznym zostanie wyliczona w zapytaniu wewnętrznym średnia cena książek wydanych w tym samym roku co analizowana książka. W zapytaniu wewnętrznym tabela Ksiazki otrzymała nazwę Ks, aby warunek w klauzuli WHERE zapytania wewnętrznego miał sens.

 

Reklama