Podzapytania
Transkrypt
Podzapytania
Podzapytania Podzapytanie jest poleceniem SELECT zagnieżdżonym w innym poleceniu SELECT. Podzapytanie może wystąpić wszędzie tam, gdzie system spodziewa się zbioru wartości, czyli w klauzulach SELECT, FROM, WHERE, HAVING SELECT atrybut_1, atrybut_2,... FROM relacja WHERE atrybut_n operator (SELECT atrybut_1, FROM relacja WHERE warunek Bazy danych - laboratorium, Hanna Kleban Podzapytania Podzapytanie to oddzielna instrukcja SELECT, która wykonywana jest w zapytaniu jako pierwsza i jej wynik w postaci wartości jest przekazywany do warunku w głównym zapytaniu. SELECT nazwaolejku FROM olejki WHERE idskladnikarosliny= (SELECT idskladnikarosliny FROM olejki WHERE nazwaolejku = 'cynamon') 11 Bazy danych - laboratorium, Hanna Kleban Podzapytania Operatorem może być: = ; <>; <; >; <=; >= IN ANY, ALL Bazy danych - laboratorium, Hanna Kleban Podzapytania zwracające jedną wartość Lewa strona predykatu wymaga podzapytaniem po prawej stronie. zgodnego wyniku z Jeżeli w predykacie jest operator logiczny, to podzapytanie musi zwrócić pojedynczą wartość. liczba > (podzapytanie zwraca pojedynczą liczbę) napis = (podzapytanie zwraca pojedynczy napis) Bazy danych - laboratorium, Hanna Kleban Podzapytanie wyznaczające wiele krotek Operator IN można stosować zarówno dla pojedynczych wartości, jak i listy. IN równy dowolnej wartości uzyskanej w wyniku zapytania wewnętrznego NOT IN różne od wszystkich wartości uzyskanych w wyniku zapytania wewnętrznego. Przykład Podaj nazwy olejków, które mają takie samo stężenie jak olejek o nazwie imbir Bazy danych - laboratorium, Hanna Kleban Podzapytanie wyznaczające wiele krotek select nazwaolejku from olejki where idolejku IN (select idolejku from olejkistezenia where stezenie= (select stezenie from olejkistezenia where idolejku = (select idolejku from olejki where nazwaolejku ='imbir'))) Bazy danych - laboratorium, Hanna Kleban 13,15,22,32,36,53 0,849 15 Podzapytania wyznaczające wiele krotek Jeżeli podzapytanie może zwrócić listę wartości, a predykat akceptuje tylko jedną wartość należy zastosować słowo kluczowe ANY lub ALL. ANY – służy do porównania wartości z każdą wartością zwracaną przez podzapytanie. Liczba >ANY (lista wartości) oznacza, że warunek jest spełniony, gdy liczba jest większa niż przynajmniej jeden element listy. Liczba >ALL (lista wartości) oznacza, że warunek jest spełniony, jeżeli liczba jest większa od wszystkich elementów listy. Bazy danych - laboratorium, Hanna Kleban Podzapytania wyznaczające wiele krotek liczba = ALL (lista) – należy ostrożnie stosować operator logiczny = z ALL. Jeżeli lista zawiera różne wartości (5,6) to powyższy predykat jest fałszywy. Przykład Wypisz stężenia i identyfikatory tych olejków, które maja stężenie przynajmniej takie jak stężenie olejków: Cynamon, Eukaliptus, Majeranek. Bazy danych - laboratorium, Hanna Kleban Podzapytania wyznaczające wiele krotek select Stezenie as[Stężenie],IDOlejku from OlejkiStezenia where Stezenie >=any (select Stezenie from OlejkiStezenia where IDOlejku in (select IDOlejku from Olejki where NazwaOlejku in ('Cynamon','Majeranek','Eukaliptus'))) Bazy danych - laboratorium, Hanna Kleban Podzapytania wyznaczające wiele krotek Przykład Wypisz stężenia i identyfikatory tych olejków, które mają stężenia większe od stężeń olejków: Cynamon, Eukaliptus, Majeranek. select Stezenie,IDOlejku from OlejkiStezenia where Stezenie >=all (select Stezenie from OlejkiStezenia where IDOlejku in (select IDOlejku from Olejki where NazwaOlejku in('Cynamon','Majeranek','Eukaliptus'))) Bazy danych - laboratorium, Hanna Kleban Podzapytanie Podzapytania mogą być użyte w więcej niż jednym predykacie. SELECT * FROM ..... WHERE warunek 1 (podzapytanie 1) operator logiczny warunek 2 (podzapytanie 2) Bazy danych - laboratorium, Hanna Kleban Podzapytanie Przykład Podaj nazwy olejków które produkowane sa z tego samego typu lub składnika co olejek cynamon. select nazwaolejku,idskladnikarosliny,idtypurosliny from olejki where idskladnikarosliny= (select idskladnikarosliny from olejki where nazwaolejku = 'cynamon') or idtypurosliny = (select idtypurosliny from olejki where nazwaolejku = 'cynamon') Bazy danych - laboratorium, Hanna Kleban Najczęściej spotykane błędy Lista atrybutów w klauzuli SELECT podzapytania jest niezgodna z listą atrybutów warunku. Podzapytanie zwraca więcej niż jeden wiersz a w warunku użyto operatora przewidzianego do porównania wartości skalarnych. Bazy danych - laboratorium, Hanna Kleban Reguły zagnieżdżeń podzapytań W podzapytaniu nie używamy klauzuli ORDER BY; Klauzula ORDER BY może wystąpić wyłącznie jako ostatnia klauzula najbardziej zewnętrznego zapytania; Liczba oraz typ atrybutów występujących w klauzuli SELECT podzapytania musi być zgodna z liczbą i typem atrybutów użytych w warunku zapytania zewnętrznego, tj. zapytania wyższego poziomu; W podzapytaniu można używać operatorów zbiorowych; Bazy danych - laboratorium, Hanna Kleban Reguły zagnieżdżeń podzapytań Podzapytania są zawsze wykonywane w kolejności od najgłębiej zagnieżdżonego do najbardziej zewnętrznego. Bazy danych - laboratorium, Hanna Kleban Podzapytania skorelowane Podzapytanie skorelowane jest wykonywane dla każdej krotki przeglądanej przez zapytanie zewnętrzne. Podzapytanie skorelowane operuje na wartościach atrybutów przekazanych przez zapytanie zewnętrzne. Podzapytanie skorelowane zawsze posiada odwołanie do atrybutu zapytania zewnętrznego. Bazy danych - laboratorium, Hanna Kleban Podzapytania skorelowane Podzapytaniem skorelowanym wykonywane jest następująco: •pobranie wiersza Wn przez zapytanie zewnętrzne, •wykonanie zapytania wewnętrznego na podstawie wartości z wiersza Wn , •zaakceptowanie bądź odrzucenie wiersza Wn, •pobranie kolejnego wiersza Wn+1 przez zapytanie zewnętrzne i powtórzenie kroków 2-4 Bazy danych - laboratorium, Hanna Kleban Podzapytania skorelowane Przykład Wypisz nazwy oraz identyfikatory olejków, którym przypisane są jakiekolwiek ostrzeżenia SELECT NazwaOlejku,IDOlejku FROM Olejki WHERE EXISTS (SELECT * FROM OlejkiOstrzezenia WHERE IDOlejku=Olejki.IDOlejku) ORDER BY NazwaOlejku Bazy danych - laboratorium, Hanna Kleban