- •Группировка записей
- •Наложение ограничений на группировку записей
- •Задание сложных условий поиска
- •Использование логических выражений
- •Сравнение столбца с результатом вычисления выражения
- •Использование сцепления строк/конкатенации ||
- •Использование функции cast
- •Использование подзапросов
- •Вложение подзапросов
- •Дополнительные возможности использования подзапросов, возвращающих единственное значение
- •Использование Exist (существование)
- •Использование Singular (единственный)
- •Использование подзапросов возвращающих множество значений
- •Использование Having и агрегатных функций для вложенных запросов
- •Объединение результатов выполнения нескольких запросов (union)
- •Внешние соединения
- •Cтандартные функции языка sql
Группировка записей
Когда требуется получать агрегированные (итоговые) данные не по всему результирующему набору данных (НД), а по каждой из входящих в него групп записей, которые характеризуются одинаковым значением какого-либо столбца, после предложения WHERE вводится предложение GROUP BY
GROUP столбец1, столбец2…
При этом необходимо, чтобы один из столбцов возвращаемых оператором SELECT был представлен агрегатной функцией.
#1 Найти сред цену каждого товара
Select Name_tovar, avg (price)//сред значение столбца цена
From Tovar
Group by name_tovar
#2 Выдать общую стоимость каждого товара
Select Name_tovar, sum (price*kolvo) as TotalCost//столбец с общей стоимотью будет иметь имя TotalCost
From Tovar
Group by name_tovar
#3 Выдать общую стоимость товаров, поступивших на каждую дату, цена которых превышает 1000
Пусть в таблице товар Tovar есть поле дата поступления Data_in
Select data_in, sum (price*kolvo) as TotalCost
From Tovar
Where price >1000
Group by Data_in
Наложение ограничений на группировку записей
Если необходимо выдавать итоговые данные не по всем группам записей, а только по тем из них, которые удовлетворяют некоторому условию, то после GROUP BY указывают
HAVING <агрегатная функция – count,sum,max,min,avg> <отношение – это <=,>=,!= и т.д.> <значение – выражение вычисляемое или константа или вложенный оператор select который вернет одно значение>
В предложении HAVING обязательно должна присутствовать агрегатная функция, которую нельзя использовать в предложении WHERE
#4 Показать даты поступления товаров, на которые (на дату) количество поступившего товара было не меньше 500. В результирующий набор данных включить только те группы записей, по которым число таких поступлений было больше 1.
Select Data_in, count(*)//все записи считаем count – это функция– сколько всего товара, количество поступивших
From tovar
Where kolvo>500
Group by Data_in
Having count(*)>1
Name_tovar |
Data_in |
Kolvo |
|
1 |
23.10.16 |
700 |
|
2 |
25.10.16 |
300 |
|
3 |
23.10.16 |
1020 |
|
4 |
25.10.16 |
650 |
|
В результате запроса получим
Name_tovar |
Data_in |
Kolvo |
|
1 |
23.10.16 |
700 |
|
|
|
|
|
3 |
23.10.16 |
1020 |
|
|
25.10.16 |
650 |
|
На 23.10.16 – 2 записи
На 5.10.16 - 1 запись
Учитываем только те, где число больше 1.
Задание сложных условий поиска
IS NULL
Если требуется выдавать записи столбец которых имеет либо не имеет пустое значение, применяется предложение
<значение-столбец> IS [NOT] NULL
#5 Выдать наименование товаров для которых не указано количество
Select nametovar from Tovar
Where kolvo is null
Использование логических выражений
OR, AND, NOT
#6
Select * from Tovar
Where kolvo>100 and kolvo<=1000 and price=1000
Пусть есть таблица «Расход товара» она связана с таблицей «Товар» по внешнему ключу nametoval. Хранит название товара и его кол-во
Rashod |
ID_rashod |
Kolvo_R Nametovar(fk) Data_R |
