Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Использование подзапросов

Часто невозможно решить поставленную задачу путем использования одного запроса. Это особенно актуально в тех случаях, когда при использовании условия поиска в предложении WHERE значение, с которым надо сравнивать, заранее не определено и должно быть вычислено в момент выполнения оператора SELECT. Другой причиной, использования вложенных подзапросов, является то, что во многих случаях значение, с которым надо сравнивать, должно представлять собой не одно, а несколько значений (множество значений).

Внутренний подзапрос представляет собой также оператор SELECT и кодирование его предложений подчиняется тем же правилам, что и для основного оператора SELECT. В общем случае оператор SELECT с подзапросом имеет вид

 

SELECT...

FROM...

WHERE <Сравниваемое значение> <оператор> SELECT...

FROM...

WHERE...

В данном случае внешний (второй) оператор SELECT использует результат выполнения внутреннего (первого) оператора для определения содержания окончательного результата всей операции. Внутренние запросы могут быть помещены в предложения WHERE и HAVING внешнего оператора SELECT – в этом случае они получают название подзапросов, или вложенных запросов. Кроме того, внутренние операторы могут использоваться в операторах INSERT, UPDATE и DELETE. Существует три типа подзапросов:

· Скалярный подзапрос возвращает значение, выбираемое из пересечения одного столбца с одной строкой, - т.е. единственное значение. В принципе, скалярный подзапрос может использоваться везде, где требуется указать единственное значение.

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

· Табличный подзапрос возвращает значения одного или больше столбцов таблицы, размещенные в более чем одной строке. Табличный подзапрос может использоваться везде, где допускается указывать таблицу – например, как операнд предиката IN.

Подзапрос представляет собой инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается внешним оператором. Подзапрос может указываться непосредственно после операторов сравнения (т.е. операторов =, <, >, >=, <=, <>) в предложениях WHERE и HAVING. Текст подзапроса должен быть заключен в скобки.

 

ПРИМЕР (Скалярный подзапрос)

 

Выведите на экран все даты возврата книг для читателя с номером читательского билета 28.

 

SELECT ReturnDate, FactReturnDate

FROM BookGiveOutRecord

WHERE ReaderCode = (SELECT Code

FROM Readers

WHERE ReaderCardNumber = 28)

 

Внутренний оператор SELECT (SELECT Code FROM Readers WHERE ReaderCardNumber = 28) предназначен для определения кода читателя с номером читательского билета 28. После этого выполняется внешний подзапрос, предназначенный для выборки подобных сведений. Иначе говоря, внутренний оператор SELECT возвращает таблицу, состоящую из единственного значения - Code. Оно представляет собой 2.

В результате внешний оператор SELECT приобретает следующий вид:

 

SELECT ReturnDate, FactReturnDate

FROM BookGiveOutRecord

WHERE ReaderCode = 2

 

Результаты выполнения этого запроса представлены в таблице 12.1.

Таблица 12.1.

ReturnDate FactReturnDate
25-SEP-04 24-sep-04

 

ПРИМЕР (Скалярный подзапрос с агрегатной функцией)

 

Составьте список инвентарных номеров книг, цена которых выше средней, указав насколько их цена превышает среднюю цену книг по библиотеке.

 

SELECT InventaryNumber, Cost – (SELECT AVG (Cost)

FROM BookInventaryNumbers) AS Cost_diff

FROM BookInventaryNumbers

WHERE Cost > (SELECT AVG (Cost)

FROM BookInventaryNumbers)

 

Необходимо отметить, что нельзя прямо предложение ‘WHERE Cost > AVG (Cost)’, поскольку применять обобщающие функции в предложениях WHERE запрещено. Для достижения желаемого результата следует создать подзапрос, вычисляющий среднее значение цены книг, а затем использовать его во внешнем операторе SELECT, предназначенном для выборки сведений о тех книгах, цена которых превышает это среднее значение. Иначе говоря, подзапрос возвращает значение средней цены книг по библиотеке, равное 25.30 гривень. Результат выполнения этого скалярного подзапроса используется во внешнем операторе SELECT как для вычисления отклонения цены от среднего уровня, так и для отбора сведений о книгах. Поэтому внешний оператор SELECT приобретает следующий вид:

 

SELECT InventaryNumber, Cost – 25.30 AS Cost_diff

FROM BookInventaryNumbers

WHERE Cost > 25.30

 

Результаты выполнения запроса представлены в таблице 12.2.

Таблица 12.2.

InventaryNumber Cost_diff
  8.71
  31.48

 

К подзапросам применяются следующие правила и ограничения:

1. В подзапросах не должна использоваться фраза ORDER BY, хотя она может присутствовать во внешнем запросе.

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

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

4. Если подзапрос является одним из двух операндов, участвующих в операции сравнения, то запрос должен указываться в правой части этой операции. Например, приведенный ниже вариант записи запроса из предыдущего примера является некорректным, поскольку подзапрос размещен в левой части операции сравнения со значением столбца Cost:

 

SELECT InventaryNumber, Cost

FROM BookInventaryNumbers

WHERE (SELECT AVG (Cost) FROM BookInventaryNumbers) < Cost

 

Часто невозможно обойтись одним подзапросом. Тогда в подзапросе используют вложенный подзапрос.

<== предыдущая лекция | следующая лекция ==>
Четвертая и пятая нормальные формы | Использование предложений ALL, SOME, ANY
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 470; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.