DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info.gz) Correlated subqueries

Info Catalog (mysql.info.gz) EXISTS and NOT EXISTS subqueries (mysql.info.gz) Subqueries (mysql.info.gz) Unnamed views
 
 13.1.8.7 Correlated Subqueries
 ..............................
 
 A _correlated subquery_ is a subquery that contains a reference to a
 table that also appears in the outer query.  For example:
 
      SELECT * FROM t1 WHERE column1 = ANY
             (SELECT column1 FROM t2 WHERE t2.column2 = t1.column2);
 
 Notice that the subquery contains a reference to a column of `t1', even
 though the subquery's `FROM' clause doesn't mention a table `t1'. So,
 MySQL looks outside the subquery, and finds `t1' in the outer query.
 
 Suppose that table `t1' contains a row where `column1 = 5' and `column2
 = 6'; meanwhile, table `t2' contains a row where `column1 = 5' and
 `column2 = 7'. The simple expression `... WHERE column1 = ANY (SELECT
 column1 FROM t2)' would be `TRUE', but in this example, the `WHERE'
 clause within the subquery is `FALSE' (because `(5,6)' is not equal to
 `(5,7)'), so the subquery as a whole is `FALSE'.
 
 *Scoping rule:* MySQL evaluates from inside to outside.  For example:
 
      SELECT column1 FROM t1 AS x
        WHERE x.column1 = (SELECT column1 FROM t2 AS x
          WHERE x.column1 = (SELECT column1 FROM t3
            WHERE x.column2 = t3.column1));
 
 In this statement, `x.column2' must be a column in table `t2' because
 `SELECT column1 FROM t2 AS x ...' renames `t2'. It is not a column in
 table `t1' because `SELECT column1 FROM t1 ...' is an outer query that
 is _farther out_.
 
 For subqueries in `HAVING' or `ORDER BY' clauses, MySQL also looks for
 column names in the outer select list.
 
 For certain cases, a correlated subquery is optimized. For example:
 
      VAL IN (SELECT KEY_VAL FROM TBL_NAME WHERE CORRELATED_CONDITION)
 
 Otherwise, they are inefficient and likely to be slow. Rewriting the
 query as a join might improve performance.
 
Info Catalog (mysql.info.gz) EXISTS and NOT EXISTS subqueries (mysql.info.gz) Subqueries (mysql.info.gz) Unnamed views
automatically generated byinfo2html