Подзапросы


Содержание лекционного занятия:

  • Подзапрос
  •  Объединение запросов. Оператор UNION. Оператор UNION ALL
  • Упорядочение и группировка данных в составных запросах

Подзапрос представляет собой запрос, выполняемый в рамках другого запроса. Подзапросы служат для получения данных, которые затем используются другим запросом.

Запрос, содержащий подзапрос, называется сложным. В процессе его выполнения сначала выполняется подзапрос, а затем — основной запрос. При создании слож­ного запроса необходимо следовать следующему набору правил:

  • подзапросы должны заключаться в круглые скобки;
  •  предложение ORDER BY может быть использовано только в основном запросе;
  • подзапросы, возвращающие более одной записи, могут использоваться только с многозначными операторами;
  • в основном запросе нельзя использовать оператор BETWEEN.

Ниже приведен синтаксис оператора SELECT с подзапросом:

SELECT {* | ALL | DISTINCT поле1. поле2     полеИ}

FROM таблица1 {,  таблица2    таблицаN}

WHERE условие (SELECT поле1,  поле2,…    полеN}

FROM поле1 {, поле2,…  , полеN}

WHERE условие)

Для иллюстрации технологии составления подзапроса воспользуемся следующим примером. Выберем из таблицы Продажи информацию о продажах товара с наиме­нованием Delphi 5:

SELECT [Код клиента]. Заказано. Продано. Цена

FROM Продажи

WHERE [Код TOBapa]=(SELECT [Код товара]

FROM Товары

WHERE Наименование='Delphi 5')

Поскольку в таблице Продажи не содержится наименований товара, то сначала с по­мощью подзапроса мы обращаемся к таблице Товары и определяем код товара за­данного наименования, а затем в основном запросе выбираем интересующие нас поля из таблицы Продажи, в которых код товара совпадает с полученным в резуль­тате выполнения подзапроса. Результат показан на рис.33.

Рис. 33. Пример использования подзапроса

В подзапросе, так же как и в основном запросе, можно использовать подзапросы. Максимальный уровень вложенности подзапросов определяется конкретной реали­зацией SQL.

Объединение запросов

Язык SQL позволяет объединять несколько запросов с помощью специальных операторов. Запросы, включающие в себя несколько операторов SELECT, принято называть составными.

Составные запросы формируют один набор данных на основе результатов, по­лученных при выполнении каждого запроса, входящего в объединение. Во мно­гих случаях составные запросы целесообразно использовать вместо простых запросов со сложным условием выборки. Это связано с тем, что разбиение слож­ного условия на несколько простых запросов делает текст запроса более по­нятным. Как правило, проще написать составной запрос, состоящий из не­скольких простых запросов, чем простой запрос со сложным условием отбора данных.

Для объединения запросов наиболее часто используются операторы UNION и UNION ALL (предусмотренные стандартом ANSI).

В стандарте ANSI определены и другие операторы объединения, такие как EXCEPT и INTERSECT, которые расширяют возможности составных запросов.

При объединении запросов независимо от типа используемых операторов объеди­нения необходимо следовать следующим правилам:

·       каждый из запросов, входящих в объединение, должен возвращать одинаковое количество полей (в том числе вычисляемых);

·       типы полей, возвращаемых в результате выполнения каждого запроса, должны совпадать.

Оператор UNION

При использовании оператора UNION результаты выполнения отдельных запросов объединяются. При этом дублирующие друг друга записи исключаются из резуль­тирующего набора данных.

Для примера выберем из таблицы Товары список товаров, цена которых меньше 200 или больше 2000. Такую выборку можно сделать путем объединения логиче­ских операторов в предложении WHERE с помощью оператора 0R или путем объе­динения запросов:

SELECT *

FROM Товары

WHERE Цена<200

UNION

SELECT *

FROM Товары

WHERE Цена>=2000

Здесь первый запрос отбирает товары, цена которых меньше 200, а второй — това­ры, цена которых превышает 2000. С помощью оператора UNION результаты, воз­вращаемые отдельными запросами, объединяются в один набор данных (рис.34).

Рис. 34. Результат объединения запросов с помощью оператор UNION

Оператор UNION ALL

Оператор UNION ALL аналогичен оператору UNION, за исключением того, что в ре­зультирующую выборку включаются дублирующие записи. Если в предыдущем примере (см. рис. 11.34) заменить оператор UNION оператором UNION ALL, то резуль­тат не изменится, так как в нем не содержится дублирующих записей. Однако если задать запрос таким образом, чтобы одни и те же записи попали в результаты обо­их запросов, входящих в объединение, то в результирующей выборке они также будут присутствовать два раза. Например, при выполнении следующего запроса результат будет содержать 23 записи, хотя в таблице Товары содержатся всего лишь 16 записей:

SELECT *

FROM Товары

WHERE Цена>100

UNION ALL

SELECT *

FROM Товары

WHERE Цена<1000

Это объясняется тем, что часть записей выбрана и в первом, и во втором запросе (это те товары, цена которых больше 100, но меньше 1000), поэтому в результиру­ющей выборке содержится несколько одинаковых записей (рис.35).

Рис.35. Объединение запросов с помощью оператора UNION ALL

Упорядочение и группировка данных в составных запросах

В составном запросе для упорядочения данных можно использовать предложение ORDER BY. Независимо от того, сколько запросов входит в объединение, допускает­ся только одно предложение ORDER BY. Для задания полей, по которым произво­дится сортировка, в этом предложении разрешается указывать как имена полей, так и их порядковые номера в списке оператора SELECT.

В отличие от предложения ORDER BY, предложение GROUP BY можно задействовать в каждом из запросов, входящих в объединение. Вместе с предложением GROUP BY допускается применение оператора HAVING. Предложение GROUP BY можно исполь­зовать и для группировки результатов выполнения составного запроса.

Вопросы для самоконтроля:

  1. В каких случаях непосредственное выполнение операторов является наиболее эффективным?
  2. Когда используется подготавливаемое выполнение?

Рекомендуемая литература:

  1. Миловзоров В.К. Элементы информационных систем. – М.: Высшая школа,1989.
  2. Морозов В.К. Основы теории информационных систем. – М.: Высшая школа, 1994.