336 PHP i MySQL dla każdegc
Załóżmy teraz, że chcielibyśmy z pierwszej wersji tabeli Zam_Tymczas usunąć wszystkie wpisy, które w kolumnie Wartość mają wartość mniejszą niż średnia arytmetyczna ze wszystkich zamówień z tabeli Zamówienia. Tym razem podzapytanie trzeba wykorzystać w instrukcji DELETE. Podzapytanie znajdzie się oczywiście w klauzuli WHERE. Cala instrukcja będzie miała postać:
DELETE FROM ZAM.TYMCZAS WHERE Wartość < (
SELECT AVG(Wartosc)
FROM Zamówienia
Po jej wykonaniu w tabeli ZAM_TYMCZAS pozostaną jedynie następujące wiersze:
1 Imię | Nazwisko | Wartość 1
| Jan |
| Kowalski | |
15.88 | |
j Andrzej |
| Nowak |
22.35 | |
| Andrzej |
j Nowak |
22.35 | |
| Janusz |
| Malinowski | |
18.48 | |
| Adam |
j Kowalski j |
15.26 | |
W analogiczny sposób wykorzystuje się podzapytania w instrukcji UPDATE. Należy jednak pamiętać, że zarówno w przypadku DELETE, jak i UPDATE w podzapytaniu nie może znajdować się odwołanie do tabeli uaktualnianej w zapytaniu głównym. Nie można zatem wykonać przykładowej instrukcji:
UPDATE Zamówienia
SET Wartość - Wartość * 0.95
WHERE Wartość > (
SELECT AVG(Wartość)
FROM Zamówienia AS Zam
):
gdyż zostanie zgłoszony błąd widoczny na rysunku 11.28.
mysql> UPDATE Zamówienia
-> SET Wartość = Wartość * 0.9S -> WHERE Wartość > (
-> SELECT AVG(WartOSc)
-> FROM Zamówienia AS Zam
ERROR 1093 (HY000): You OH clause
can't specify target table 'zamówienia1 for update
FR
Rysunek 11.28. Próba wykorzystania tej samej tabeli w podzapytaiu w instrukcji UPDATE