Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_Оператор SELECT_2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
84.48 Кб
Скачать

Дополнительные возможности использования подзапросов, возвращающих единичное значение Использование exists

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

EXISTS (<подзапрос>)

Пример. Выдать список всех покупателей, которые получали товар со склада

SELECT P.POKUP FROM POKUPATELI P

WHERE EXISTS (SELECT R.POKUP FROM RASHOD R WHERE R.POKUP = P.POKUP)

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

Если в условии поиска нужно указать, что из таблицы требуется выбрать лишь те записи, для которых подзапрос возвращает только одно значение, указывается предложение

SINGULAR (<onepaтор_select >)

Пример. Выдать список всех покупателей, купивших только один товар (результат на

SELECT P.* FROM POKUPATELI P

WHERE SINGULAR (SELECT * FROM RASHOD R WHERE R.POKUP = P.POKUP)

Использование подзапросов, возвращающих множество значений Использование all, some

Если в условиях поиска необходимо указать, что сравниваемое значение (значение столбца, результат вычисления выражения) должно находиться в определенных отношениях со всеми значениями из множества значений, возвращаемых подзапросом, применяют предложение типа

<Сравниваемое значение> {[NOT] {ALL | SOME | ANY} (<подзапрос>)

где подзапрос может возвращать более одного значения. Оператор определяет операцию сравнения (>, >=, < и т.д.). Отношение сравниваемого значения и значений, возвращаемых подзапросом, устанавливается словами ALL и SOME (ANY).

ALL определяет, что условие поиска истинно, когда сравниваемое значение находится в отношении, определяемом оператором, со всеми значениями, возвращаемыми подзапросом.

Например:

WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)

определяет, что текущее значение столбца STOLBEZ должно быть больше всех значений в столбце POLE из таблицы TABLIZA.

SOME (вместо него можно указать ANY) что условие поиска истинно, когда сравниваемое значение находится в отношении, определяемом оператором, хотя бы с одним значением, возвращаемым подзапросом.

Пример. Перечислить все факты отгрузки товаров со склада, в которых количество единиц отгружаемого товара превышает среднее значение.

SELECT * FROM RASHOD R1

WHERE R1.KOLVO > ALL (SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

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

SELECT * FROM RASHOD R1

WHERE Rl.KOLVO > SOME (SELECT AVG(R2.KOLVO) FROM RASHOD R2 GROUP BY POKUP )

Использование having и агрегатных функций для вложенных подзапросов

Если в условиях поиска для вложенного запроса нужно указать агрегатную функцию, используется HAVING..

Пример. Определить покупателя, у которого средняя покупка больше средней покупки других покупателей, и среднее число покупки этого покупателя.

SELECT R1.POKUP, AVG(Rl.KOLVO) FROM RASHOD R1

GROUP BY R1.POKUP

HAVING AVG(R1.KOLVO) >= ALL (SELECT AVG(R2.KOLVO) FROM RASHOD R2 GROUP BY R2 . POKUP)

Пример. Определить адрес покупателя, который приобрел наибольшее количество товаров.

SELECT P.* FROM POKUPATELI P

WHERE P.POKUP = (SELECT RR.POKUP FROM RASHOD RR GROUP BY RR.POKUP

HAVING SUM(RR.KOLVO) >= ALL (SELECT SUM(RRR.KOLVO) FROM RASHOD RRR GROUP BY RRR.POKUP))

Пример. Перечислить все товары, которые приобрел покупатель, купивший наибольшее количество товаров.

SELECT DISTINCT R.TOVAR FROM RASHOD R

WHERE R.POKUP = (SELECT RR.POKUP FROM RASHOD RR

GROUP BY RR.POKUP

HAVING SUM(RR.KOLVO) >= ALL (SELECT SUM(RRR.KOLVO)

FROM RASHOD RRR GROUP BY RRR.POKUP))

Пример. Перечислить стоимость единиц товаров, которые приобрел покупатель, купивший наибольшее количество товаров

SELECT DISTINCT R.TOVAR, T.ED_IZM, T.ZENA FROM RASHOD R, TOVARY T

WHERE T.TOVAR = R.TOVAR AND R.POKUP = (SELECT RR.POKUP

FROM RASHOD RR GROUP BY RR.POKUP

HAVING SUM(RR.KOLVO) >= ALL

(SELECT SUM(RRR.KOLVO)

FROM RASHOD RRR GROUP BY RRR.POKUP ))