
- •Лабораторная работа «Оператор select»
- •Предложение having - наложение ограничений на группировку записей
- •Использование between
- •Использование in (список значений)
- •Использование starting
- •Использование containing
- •Использование функции upper
- •Использование like
- •Использование функции cast
- •Использование подзапросов
- •Дополнительные возможности использования подзапросов, возвращающих единичное значение Использование exists
- •Использование singular
- •Использование подзапросов, возвращающих множество значений Использование all, some
- •Использование having и агрегатных функций для вложенных подзапросов
- •Внешние соединения
- •Union - объединение результатов выполнения нескольких операторов select
- •Использование is null
- •Использование операции сцепления строк
- •Работа с разными бд в одном запросе
Дополнительные возможности использования подзапросов, возвращающих единичное значение Использование 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 ))