Rozdział 11. ♦ Więcej o SQL 333
| 9 j Płyty | 3 | 19.00 |
Do tabeli zostały wprowadzone dodatkowe kolumny: Grupa, określająca grupę towarową, oraz Cena — określająca cenę towarów. Spróbujmy się teraz dowiedzieć, które z towarów mają cenę wyższą niż średnia cena w ich grupie? Jak to zrobić? Dla każdego towaru trzeba wyliczyć średnią cenę grupy i porównać ją z ceną z kolumny Cena. Nie wystarczy zatem prosta instrukcja warunkowa; trzeba wykorzystać podzapytanie skorelowane. Będzie ono miało postać:
SELECT Id. Nazwa. Cena. Grupa FROM TOWARY WHERE Cena >
(SELECT AVG(Cena)
FROM Towary AS Towary2 WHERE Towary.Grupa=Towary2.Grupa ):
Dla każdego towaru analizowanego w zapytaniu głównym w zapytaniu skorelowanym wyliczana jest średnia cena grupy towarów, do której ten towar należy. Ponieważ oba zapytania operują na tej samej tabeli, w zapytaniu skorelowanym tablica Towary została przemianowana na Towary2, tak aby warunek w klauzuli WHERE miał sens (inaczej warunek miałby postać Towary.Grupa-Towary.Grupa i zapytanie nie mogłoby być poprawnie wykonane). Wynik działania powyższego zapytania złożonego został przedstawiony na rysunku 11.26.
Rysunek 11.26.
Wynik działania zapytania zawierającego podzapytanie skorelowane
mysq1> SELECT Id, Nazwa, Cena, Grupa -> FROM TOWARY -> WHERE Cena >
-> (SELECT AVG(Cena)
-> FROM Towary AS Towary2
-> ^WHERE Towary.Grupa=Towary2.Grupa
I Id |
Nazwa |
Cena | Grupa I |
2 |
3.00 | 1 | | |
7 |
4.00 | 1 | | |
Płyty |
19.00 1 3 | | |
4 row< |
in set (0.00 sec) |
Podzapytanie może być użyte również w klauzuli FROM. Wynikiem podzapytania musi być w takim wypadku tablica, z której dane pobierane są przez zapytanie zewnętrzne. Ogólnie konstrukcja taka ma postać:
SELECT kolumny_zapy tani a FROM
(SELECT kolumnyjodzapytania FROM tabjice
WHERE warunki jiodzapytania ) AS nazwa
WHERE warunki_zapytania