Построение нетривиальных запросов

Содержание

Слайд 2

Понятие подзапроса Внутренний подзапрос представляет собой также оператор SELECT, а кодирование

Понятие подзапроса

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

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

Подзапрос – это инструмент создания временной таблицы, содержимое которой извлекается и

Подзапрос – это инструмент создания временной таблицы, содержимое которой извлекается и обрабатывается

внешним оператором. Текст подзапроса должен быть заключен в скобки. К подзапросам применяются следующие правила и ограничения:
- фраза ORDER BY не используется, хотя и может присутствовать во внешнем подзапросе;
- список в предложении SELECT состоит из имен отдельных столбцов или составленных из них выражений – за исключением случая, когда в подзапросе присутствует ключевое слово EXISTS;
- по умолчанию имена столбцов в подзапросе относятся к таблице, имя которой указано в предложении FROM. Однако допускается ссылка и на столбцы таблицы, указанной во фразе FROM внешнего запроса, для чего применяются квалифицированные имена столбцов (т.е. с указанием таблицы);
- если подзапрос является одним из двух операндов, участвующих в операции сравнения, то запрос должен указываться в правой части этой операции.
Слайд 4

Существует два типа подзапросов: Скалярный подзапрос возвращает единственное значение. Табличный подзапрос

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

или нескольких столбцов таблицы, размещенные в более чем одной строке.
Слайд 5

Например: Определить дату продажи максимальной партии товара. SELECT Дата, Количество FROM

Например: Определить дату продажи максимальной партии товара.
SELECT Дата, Количество
FROM Сделка
WHERE Количество=(SELECT

Max(Количество) FROM Сделка)
Во вложенном подзапросе определяется максимальное количество товара. Во внешнем подзапросе – дата, для которой количество товара оказалось равным максимальному. Нельзя использовать предложение
 WHERE Количество=Max(Количество), поскольку применять обобщающие функции в предложениях WHERE запрещено. Для достижения желаемого результата следует создать подзапрос, вычисляющий максимальное значение количества, а затем использовать его во внешнем операторе SELECT, предназначенном для выборки дат сделок, где количество товара совпало с максимальным значением.
Слайд 6

Н.: Определить клиентов, совершивших сделки с максимальным количеством товара. SELECT Клиент.Фамилия

Н.: Определить клиентов, совершивших сделки с максимальным количеством товара.
SELECT Клиент.Фамилия
FROM Клиент

INNER JOIN Сделка
ON
Клиент.КодКлиента=Сделка.КодКлиента
WHERE Сделка.Количество=
(SELECT Max(Сделка.Количество)
FROM Сделка)
Слайд 7

Использование ключевых слов ANY и ALL Ключевые слова ANY и ALL

Использование ключевых слов ANY и ALL
Ключевые слова ANY и ALL могут использоваться с подзапросами, возвращающими один

столбец чисел.
Если подзапросу будет предшествовать ключевое слово ALL, условие сравнения считается выполненным, только когда оно выполняется для всех значений в результирующем столбце подзапроса.
Если записи подзапроса предшествует ключевое слово ANY, то условие сравнения считается выполненным, когда оно выполняется хотя бы для одного из значений в результирующем столбце подзапроса.
Если в результате выполнения подзапроса получено пустое значение, то для ключевого слова ALL условие сравнения будет считаться выполненным, а для ключевого слова ANY – невыполненным. Ключевое слово SOME является синонимом слова ANY.
Слайд 8

Найти фирму, которая приобрела товаров на самую большую сумму. SELECT Клиент.Фирма,

Найти фирму, которая приобрела товаров на самую большую сумму.
SELECT Клиент.Фирма, Sum(Товар.Цена*Сделка.Количество)


AS Общ_стоимость
FROM Товар INNER JOIN
(Клиент INNER JOIN Сделка
ON Клиент.КодКлиента=Сделка.КодКлиента)
ON Товар.КодТовара=Сделка.КодТовара
GROUP BY Клиент.Фирма
HAVING Sum(Товар.Цена*Сделка.Количество)>=
ALL(SELECT Sum(Товар.Цена*Сделка.Количество)
FROM Товар INNER JOIN Сделка
ON Товар.КодТовара=Сделка.КодТовара
GROUP BY Сделка.КодКлиента)
Вложенный подзапрос подсчитывает общую стоимость покупок каждого клиента. Внешний подзапрос также подсчитывает общую стоимость покупок каждого клиента и определяет тех, для кого эта сумма, по сравнению с другими покупателями, оказалась больше или точно такой же.
Слайд 9

Н: Определить клиентов, совершивших сделки с максимальным количеством товара. SELECT Клиент.Фамилия,

Н: Определить клиентов, совершивших сделки с максимальным количеством товара.
SELECT Клиент.Фамилия,

Сделка.Количество
FROM Клиент INNER JOIN Сделка
ON Клиент.КодКлиента=Сделка.КодКлиента
WHERE Сделка.Количество>=ALL(SELECT Количество
FROM Сделка)
Слайд 10

Использование операций EXISTS и NOT EXISTS Ключевые слова EXISTS и NOT

Использование операций EXISTS и NOT EXISTS

Ключевые слова EXISTS и NOT EXISTS предназначены для использования только

совместно с подзапросами. Результат их обработки представляет собой логическое значение TRUE или FALSE. Для ключевого слова EXISTS результат равен TRUE в том и только в том случае, если в возвращаемой подзапросом результирующей таблице присутствует хотя бы одна строка. Если результирующая таблица подзапроса пуста, результатом обработки операции EXISTS будет значение FALSE. Для ключевого слова NOT EXISTSиспользуются правила обработки, обратные по отношению к ключевому слову EXISTS. Поскольку по ключевым словам EXISTS и NOT EXISTS проверяется лишь наличие строк в результирующей таблице подзапроса, то эта таблица может содержать произвольное количество столбцов.
Слайд 11

Определить список имеющихся на складе товаров SELECT Название FROM Товар WHERE

Определить список имеющихся на складе товаров
SELECT Название
FROM Товар
WHERE EXISTS (SELECT

КодТовара
FROM Склад
WHERE Товар.КодТовара=Склад.КодТовара)