PHP i MySQL dla każdego
Należy zwrócić uwagę na argument nazwa, którym jest nazwa tablicy wynikowej zwróconej przez podzapytanie. Może być ona dowolna, zawsze jednak musi być obecna. Wynika to z faktu, że tablica (tablice) w klauzuli WHERE zawsze musi mieć nazwę, nawet jeśli ma być to jedynie nazwa tymczasowa. Przykładowa konstrukcja tego typu może mieć postać:
SELECT Imię. Nazwisko. Wartość. Data FROM
(SELECT * FROM Zamówienia. Klienci WHERE Zamówieni a.KlientId - Klienci.Id
)
AS ZAMKU
WHERE Wartość > 15:
W podzapytaniu zostało wykonane złączenie tablic Zamówienia i Klienci, i z tak powstałej tablicy zostały wybrane wiersze, w których wartość zamówienia była większa niż 15. Efektem działania całej instrukcji jest tablica o kolumnach Imię, Nazwisko, Wartość i Data, taka jak przedstawiona na rysunku 11.27.
Rysunek 11.27.
Wykorzystania podzapytania w klauzuli FROM
mysql> SELECT Imię, Nazwisko, Wartość, Data -> FROM
-> (SELECT * FROM Zamówienia, Klienci -> WHERE Zamówieni a.Klientld = Klienci.Id -> )
-> AS ZAHKLI -> WHERE Wartość > 15;
I Imię | Nazwisko | Wartość | Data I
I Jan I Kowalski I 15.88 I 2005-02-12 |
Andrzej Nowak 22.35 2005-01-01
Andrzej I Nowak I 22.35 I 2005-02-12 I Janusz | Malinowski 18.48 2005-02-11 |
| Adam | Kowalski | 15.26 | 2005-03-11 |
5 rows in set (0.00 sec)
Zastosowanie podzapytań nie ogranicza się do instrukcji SELECT, mogą być one również wykorzystywane w przypadku instrukcji INSERT, UPDATE oraz DELETE. Przykładowo możemy utworzyć tabelę, która będzie przechowywała imiona i nazwiska klientów oraz wartości dokonanych przez nich zamówień. Być może będzie ona nam potrzebna tymczasowo do pobierania informacji statystycznych. Utworzymy ją za pomocą instrukcji:
CREATE TABLE Zam Tymczas(
Imię VARCHAR(45).
Nazwisko VARCHAR(45),
Wartość DECIMAL(5. 2)
Chcielibyśmy teraz wypełnić ją danymi. Przygotowywanie osobnych instrukcji INSERT dla każdego wiersza byłoby z pewnością bardzo czasochłonne, a jeśli w tabelach Klienci i Zamówienia byłoby dużo danych — wręcz niewykonalne. Dlatego też w takiej sytuacji należy posłużyć się instrukcją typu INSERT wykorzystującą odpowiednio przygotowane podzapytanie. Schematyczna postać takiego zapytania to: