Podzapytanie skorelowane jest podzapytaniem, które odwołuje się do tablicy, która występuje też w zapytaniu zewnętrznym. Na przykład:(patrz listing.10) Należy zauważyć, że zapytanie zawiera odwołanie do kolumn tablicy tab1, pomimo tego, że podzapytanie po słowie FROM nie wspomina ani słowem o tablicy tab1. MySQL patrzy więc na zapytanie zewnętrzne i znajduje tam tab1. Przypuśćmy, że tablica tab1 zawiera wiersz gdzie col1 = 5, a col2 = 6, podczas gdy tablica tab2 zawiera wiersz, w którym col1 = 5 a col2 = 7. Proste wyrażenie ... WHERE col1 = ANY (SELECT col1 FROM tab2) mogłoby zwrócić TRUE, jednak w tym przykładzie wartość wyrażenia po słowie WHERE w podzapytaniu jest równe FALSE (gdyż (5,6) nie jest równe (5,7)), tak więc w powyższym przykładzie cyrażenie jako całość jest równe FALSE. Ważna uwaga: MySQL analizuje wyrażenie zaczynając od wewnątrz (podzapytanie) i kończy analizę na zewnątrz (zapytanie zewnętrzne). Na przykład (patrz listing 2.0): W tym przykładzie wyrażenie x.col2 musi być kolumną w tablicy tab2 ponieważ SELECT col1 FROM tab2 AS x ... "zmienia nazwę" tablicy tab2. Nie jest jednak kolumną w tablicy tab1 gdyż SELECT col1 FROM tab1 ... jest zapytaniem zewnętrznym, które "znajduje się znacznie dalej". W przypadku zapytań ze słowami HAVING lub ORDER BY, MySQL szuka też nazw kolumn w liście kolumn zapytania zewnętrznego.
Listing
SELECT * FROM tab1 WHERE col1 = ANY
(SELECT col1 FROM tab2 WHERE tab2.col2 = tab1.col2);
--Listing 2.0 - wynik równy TRUE
SELECT col1 FROM tab1 AS x WHERE x.col1 = (SELECT col1 FROM tab2 AS x WHERE x.col1 = (SELECT col1 FROM tab3 WHERE x.col2 = tab3.col1));
Ranga: Administrator serwisu Punktów: 0