- •Группировка записей
- •Наложение ограничений на группировку записей
- •Задание сложных условий поиска
- •Использование логических выражений
- •Сравнение столбца с результатом вычисления выражения
- •Использование сцепления строк/конкатенации ||
- •Использование функции cast
- •Использование подзапросов
- •Вложение подзапросов
- •Дополнительные возможности использования подзапросов, возвращающих единственное значение
- •Использование Exist (существование)
- •Использование Singular (единственный)
- •Использование подзапросов возвращающих множество значений
- •Использование Having и агрегатных функций для вложенных запросов
- •Объединение результатов выполнения нескольких запросов (union)
- •Внешние соединения
- •Cтандартные функции языка sql
Использование подзапросов
Часто не возможно решить задачу путем использования единственного запроса Select/Например в тех случаях когда при использования условия поиска
Where <сравниваемое значение> <оператор> < значение, с которым сравнивать>
Параметр <значение с которым сравнивать> заранее не определен и должен вычисляться в момент выполнения оператора select, или представляет собой не одно а несколько значений, в этом случае применяются под запросы:
Select …
From…
Where <сравниваемое значение> <оператор> (select….)
Обязательно в круглых скобках
Вложенный оператор также может содержать внутри вложенные запросы
#Выдать дату, на которую приходится максимальный отпуск товара
Таблица Rashod
Select date_R, kolvo_R
from Rashod
Where kolvo_R = (Select max(kolvo_R from Rashod))
#Определить дату когда со склада было отгружено максимальное количество товара и реквизиты покупателя, который этот товар приобрел
Таблицы Pocupateli (P) и Rashod(R) связаны полем ID_pocup
Select R.date_R,R.kolvo_R, P.* from Rashod R, Pocupateli P //псевдоним
Where R.ID_pocup=P.ID_pocup
and (R.kolvo_R =(Select max(Kolvo_R) from Rashod)
ЗАМЕЧАНИЕ Часто ошибкой является применение вложенного оператора select, который вместо единственного значения множество значений.
#Покупателей из ИРКУТСКА может быть много
SELECT R.data_R, R.Tovarname,R.kolvo_R, P.*
FROM Rashod R, Pocupateli P
WHERE R.ID_pocup=P.ID_pocup
And R.ID_pocup= (Select P.ID_pocup from Pocupateli P where Upper (P.Gorod)=’ИРКУТСК’)
#ИСПРАВЛЕНО
SELECT R.data_R, R.Tovarname,R.kolvo_R, P.*
FROM Rashod R, Pocupateli P
WHERE R.ID_pocup=P.ID_pocup
And
R.ID_pocup in (Select P.ID_pocup from Pocupateli P where Upper
(P.Gorod)
’ИРКУТСК’)
Вложение подзапросов
# Составить список отгрузки товаров покупателю, который преобрел максимальную партию какого-либо товара
Select R1.* from Rashod R1
Where R1.pocup_name in
(select R2.pocup_name from Rashod R2
Where R2.kolvo = (select max(R3.kolvo) from Rashod R3))
Дополнительные возможности использования подзапросов, возвращающих единственное значение
Использование Exist (существование)
Если в условии поиска необходимо указать, что из таблицы требуется выбрать только те записи, для которых подзапрос возвращает 1 или более значений, используется предложение
Exist (подзапрос)
#Выдать список всех покупателей, которые хотя бы один раз получали товар со склада.
Select P.pokup_name from pokupateli P
Where exist (select R.pokup_name from Rashod R
Where P.pokup_name= R.pokup_name)//если существует запись об этом объекте в др таблице
Использование Singular (единственный)
Если в условии поиска необходимо указать, что из таблицы выбираются только те записи, для которых подзапрос возвращает только 1 значение, используется предложение
Singular (подзапрос)
#Составить список покупателей купивших только 1 товар
Информация о покупках хранится в таблице Rashod
Select P.pokup_name from pokupateli P
Where Singular (select R.pokup_name from Rashod R
Where P.pokup_name= R.pokup_name)
Использование подзапросов возвращающих множество значений
Использование All или some=any
Если в условии поиска нужно , чтобы сравниваемое значение находилось в определенном отношении со всеми или некоторыми значениями из множества значений, возвращаемых подзапосом, применяют предложение
<сравниваемое значение> [NOT] <оператор> {ALL|SOME|ANY} (<подзапрос>)
Отношение сравниваемого значения и значений, возвращаемых подзапросом устанавливается словами:
ALL – указывает, что условие поиска истинно только тогда, когда сравниваемое значение находится в нужном отношении со всеми значениями, возвращаемыми подзапросом.
SOME(ANY) – условие поиска истинно, когда сравниваемое значение находится в нужном отношении хотя бы с одним значением, возвращаемым подзапросом.
# Определить все факты отгрузки товаров со склада, в которых количество отгруженного товара превышает среднее значение.
Select R1.* from Rashod R1
Where R1.kolvo > ALL
(select R2.kolvo, R2.pokup_name from Rashod R2,
Group by R2.pokup_name)
#Перечислить все факты отгрузки товаров со склада, в которых количество превышает среднее отгрузки, хотя бы одного товара
Select R1.* from Rashod R1
Where R1.kolvo > ANY
(select R2.kolvo, R2.pokup_name from Rashod R2,
Group by R2.pokup_name)
