MySQL 4.1 позволяет вкладывать одни запросы в другие, используя результирующий набор внутреннего запроса внешним запросом. Как результат, вместо выполнения двоих (или более) отдельных запросов, вы выполняете один запрос, содержащий один (или более) подзапросов.
Рассмотрим следующий пример, в котором используется вложенный подзапрос для получения перечня всех счетов, остаток которых превышает средний остаток на всех счетах.
Использование подзапросов
Здесь MySQL начинает обрабатывать внутренний запрос и сначала определяет из записей таблицы средний остаток на всех счетах. Затем он переходит на внешний для вложенного запроса уровень и замещает полученным результирующим набором вложенного запроса представленное в предложении WHERE выражение. Это сделано для того, чтобы получить список обладателей счетов, остаток на которых больше среднего.
О подзапросах подробнее можно узнать в главе 11, "Подзапросы".
Управление поведением оператора select
Для управления поведением оператора SELECT предназначено несколько ключевых слов.
■ Ключевое слово DISTINCT исключает из результирующего набора записи, содержащие повторяющиеся значения.
■ Ключевое слово SQL_CALC_FOUND_ROWS сообщает MySQL о необходимости подсчитать общее количество строк, соответствующих запросу (не принимая во внимание значение LIMIT, которое может быть установлено). Это общее количество можно получить с помощью функции FOUND_ROWS () .
■ Ключевые слова SQL_CACHE и SQL_NO_CACHE сообщают MySQL о необходимости кэшировать полученные результирующие наборы.
■ Ключевое слово SQL_BUFFER_RESULT приводит к сохранению результирующих наборов во временной таблице. Применение такого буфера устраняет необходимость блокировать на время передачи результатов клиенту таблицы, используемые запросом, обеспечивая тем самым беспрепятственное использование их другими процессами.
■ Ключевые слова SQL_BIG_RESULT и SQL_SMALL_RESULT используются для того, чтобы показать ожидаемый размер результирующего набора, позволяя тем самым определить наиболее оптимальный способ сортировки и хранения возвращенных записей (соответственно, на диске или во временных таблицах, которые хранятся в оперативной памяти).
■ Ключевое слово SQL_HIGH_PRIORITY поднимает приоритет запроса наряду с другими параллельно выполняющимися операторами UPDATE, INSERT или DELETE, приводя тем самым к более быстрому (но ненамного) выполнению запросов на сильно загруженных серверах баз данных. 

На той же странице
Ключевое слово SQL_CALC_FOUND_ROWS может пригодиться в приложениях, которые выводят содержимое таблиц базы данных на нескольких страницах (или экранах). Оно позволяет осуществлять подсчет общего числа найденных записей, даже если полученный результат будет содержать только малое подмножество этого общего числа.
Если, например, вы хотите отобразить на экране только пять записей из таблицы account, и при этом вы хотите вывести общее число записей, ваш запрос должен выглядеть следующим образом:
mysql> SELECT SQL_CALC_FOUND_ROWS accountName FROM account LIMIT 5;
Использование подзапросов
Этот метод возвращает не только подмножество из пяти записей, но также подсчитывает общее число записей, выбранных запросом, которое можно получить с помощью функции FOUND_ROWS ().
Секрет скорости
Правильное использование ключевых слов SQL_CACHE, SQL_BUFFER_RESULT, SQL_BIG_RESULT, SQL_SMALL_RESULT и SQL_HIGH_PRIORITY поможет вам суще­ственно повысить скорость транзакций с сервером MySQL.