Определение подчиненных запросов
Вложенные запросы всегда входят в предложение WHERE или HAVING и заключаются в круглые скобки. В предложении WHERE они отбирают из таблицы отдельные строки, а в предложении HAVING - группы строк. Подчиненные запросы имеют ту же структуру, что и инструкция SELECT, содержащая предложение FROM и необязательные предложения WHERE, GROUP BY и HAVING. Однако между вложенным запросом и инструкцией SELECT имеются отличия:
– таблица результатов вложенного запроса всегда состоит из одного столбца, поэтому в предложении SELECT вложенного запроса всегда следует указывать только один возвращаемый столбец;
– во вложенный запрос не может входить предложение ORDER BY, так как результаты вложенного запроса используются только внутри главного запроса и для пользователя остаются невидимыми. Поэтому нет смысла их сортировать.
Чаще всего вложенные запросы используются в предложении WHERE и участвуют в процессе отбора строк. В простейшем случае вложенный запрос возвращает значение, позволяющее проверить истинность или ложность условия отбора.
Рассмотрим следующий пример: вывести список служащих, чей плановый объем продаж составляет менее 10% от планового объема продаж всей компании.
SELECT NAME
FROM SLUZHASCHIE
WHERE QUOTA < (0.1 * (SELECT SUM(TARGET)
FROM OFFISY))
В приведено запросе вложенный запрос вычисляет одну и ту же сумму плановых объемов продаж всех офисов, которая затем умножается на 0,1 (10%). Полученное значение используется в условии отбора при сканировании таблицы SLUZHASCHIE на предмет поиска нужных строк.
Далее рассмотрим более сложный пример, приведенный в предыдущем разделе
SELECT CITY
FROM OFFISY
WHERE TARGET > (SELECT SUM(QUOTA)
FROM SLUZHASCHIE
WHERE SLUZHASCHIE.ID_OFC = OFFISY.ID_OFC)
На Рис. 4.1 приведена схема выполнения этого запроса, в котором вложенный запрос возвращает различные результаты для каждого офиса.
1. Главный запрос извлекает данные из таблицы OFFISY.
2. Условие предложения WHERE обеспечивает отбор офисов, включаемых в таблицу результатов запроса. Это условие поочередно применяется ко всем строкам таблицы OFFISY.
3. В предложении WHERE сравнивается значение текущей строки в столбце TARGET со значением, возвращаемым вложенным запросом.
4. Для каждой строки результирующей таблицы выполняется свой вложенный запрос, вычисляющий сумму плановых объемов продаж для служащих текущего офиса.
5. Результатом выполнения вложенного запроса является одно число, и предложение WHERE сравнивает его значение со значением столбца TARGET, выбирая или отбрасывая текущий офис на основании результата сравнения.
Рис. 4.1 Выполнение вложенного запроса в предложении WHERE |
Дата добавления: 2015-02-03; просмотров: 999;