
- •Агрегатные функции
- •Группировка
- •Умножение таблиц самих на себя
- •I способ
- •II способ
- •Операция in
- •Запросы на создание таблиц
- •Запросы на удаление таблиц
- •Запросы на изменение таблиц
- •Запросы на добавление новых записей (строк)
- •Запросы на удаление записей (строк)
- •Запросы на изменение записей (строк)
- •Ограничения
- •Именованные ограничения
SQL-запросы. Теория и задания для проверки
SELECT поля через запятую
FROM таблицы через запятую
WHERE условие отбора строк
Таблица
ZAKAZY
Nzakaza (*) |
Nzakazchika |
DataZakaza |
Tsena |
1 |
1 |
12.10.2008 |
1000 |
2 |
2 |
16.10.2008 |
2000 |
3 |
2 |
29.09.2008 |
5000 |
4 |
3 |
20.10.2008 |
1500 |
5 |
1 |
22.10.2008 |
2500 |
_____________________________________________________________________________
Пример:
SELECT Nzakaza, Tsena
FROM ZAKAZY
Результат запроса:
Nzakaza (*) |
Tsena |
1 |
1000 |
2 |
2000 |
3 |
5000 |
4 |
1500 |
5 |
2500 |
_____________________________________________________________________________
SELECT * FROM ZAKAZY
Результат запроса:
Nzakaza (*) |
Nzakazchika |
DataZakaza |
Tsena |
1 |
1 |
12.10.2008 |
1000 |
2 |
2 |
16.10.2008 |
2000 |
3 |
2 |
29.09.2008 |
5000 |
4 |
3 |
20.10.2008 |
1500 |
5 |
1 |
22.10.2008 |
2500 |
________________________________________________________________________________
SELECT Nzakaza, DataZakaza, Tsena
FROM ZAKAZY
WHERE DataZakaza>=’15.10.2008’
Результат запроса:
Nzakaza (*) |
DataZakaza |
Tsena |
2 |
16.10.2008 |
2000 |
4 |
20.10.2008 |
1500 |
5 |
22.10.2008 |
2500 |
SELECT Nzakaza, DataZakaza, Tsena
FROM ZAKAZY
WHERE (DataZakaza>=’15.10.2008’) and (Tsena >=2000)
Результат запроса:
Nzakaza (*) |
DataZakaza |
Tsena |
2 |
16.10.2008 |
2000 |
5 |
22.10.2008 |
2500 |
Логические операции: and or not
Запросы на выборку из нескольких таблиц
Таблица
ZAKAZCHIKI
Nzakazchika (*) |
FIO |
Adres |
1 |
Иванов А.Д. |
М |
2 |
Родин Н.Р. |
СПб |
3 |
Михайлова Г.С. |
СПб |
Перемножение таблиц
ZAKAZY*ZAKAZCHIKI
Запрос SELECT * FROM ZAKAZY,ZAKAZCHIKI
Результат запроса:
ZAKAZY |
ZAKAZCHIKI
|
|||||
Nzakaza |
Nzakazchika |
DataZakaza |
Tsena |
Nzakazchika |
FIO |
Adres |
1 |
1 |
12.10.2008 |
1000 |
1 |
Иванов А.Д. |
М |
2 |
2 |
16.10.2008 |
2000 |
1 |
Иванов А.Д. |
М |
3 |
2 |
29.09.2008 |
5000 |
1 |
Иванов А.Д. |
М |
4 |
3 |
20.10.2008 |
1500 |
1 |
Иванов А.Д. |
М |
5 |
1 |
22.10.2008 |
2500 |
1 |
Иванов А.Д. |
М |
1 |
1 |
12.10.2008 |
1000 |
2 |
Родин Н.Р. |
СПб |
2 |
2 |
16.10.2008 |
2000 |
2 |
Родин Н.Р. |
СПб |
3 |
2 |
29.09.2008 |
5000 |
2 |
Родин Н.Р. |
СПб |
4 |
3 |
20.10.2008 |
1500 |
2 |
Родин Н.Р. |
СПб |
5 |
1 |
22.10.2008 |
2500 |
2 |
Родин Н.Р. |
СПб |
1 |
1 |
12.10.2008 |
1000 |
3 |
Михайлова Г.С. |
СПб |
2 |
2 |
16.10.2008 |
2000 |
3 |
Михайлова Г.С. |
СПб |
3 |
2 |
29.09.2008 |
5000 |
3 |
Михайлова Г.С. |
СПб |
4 |
3 |
20.10.2008 |
1500 |
3 |
Михайлова Г.С. |
СПб |
5 |
1 |
22.10.2008 |
2500 |
3 |
Михайлова Г.С. |
СПб |
ZAKAZY |
ZAKAZCHIKI
|
|||||
Nzakaza |
Nzakazchika |
DataZakaza |
Tsena |
Nzakazchika |
FIO |
Adres |
1 |
1 |
12.10.2008 |
1000 |
1 |
Иванов А.Д. |
М |
2 |
2 |
16.10.2008 |
2000 |
1 |
Иванов А.Д. |
М |
3 |
2 |
29.09.2008 |
5000 |
1 |
Иванов А.Д. |
М |
4 |
3 |
20.10.2008 |
1500 |
1 |
Иванов А.Д. |
М |
5 |
1 |
22.10.2008 |
2500 |
1 |
Иванов А.Д. |
М |
1 |
1 |
12.10.2008 |
1000 |
2 |
Родин Н.Р. |
СПб |
2 |
2 |
16.10.2008 |
2000 |
2 |
Родин Н.Р. |
СПб |
3 |
2 |
29.09.2008 |
5000 |
2 |
Родин Н.Р. |
СПб |
4 |
3 |
20.10.2008 |
1500 |
2 |
Родин Н.Р. |
СПб |
5 |
1 |
22.10.2008 |
2500 |
2 |
Родин Н.Р. |
СПб |
1 |
1 |
12.10.2008 |
1000 |
3 |
Михайлова Г.С. |
СПб |
2 |
2 |
16.10.2008 |
2000 |
3 |
Михайлова Г.С. |
СПб |
3 |
2 |
29.09.2008 |
5000 |
3 |
Михайлова Г.С. |
СПб |
4 |
3 |
20.10.2008 |
1500 |
3 |
Михайлова Г.С. |
СПб |
5 |
1 |
22.10.2008 |
2500 |
3 |
Михайлова Г.С. |
СПб |
Запрос
SELECT *
FROM ZAKAZY,ZAKAZCHIKI
WHERE ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika
Результат запроса:
ZAKAZY |
ZAKAZCHIKI
|
|||||
Nzakaza |
Nzakazchika |
DataZakaza |
Tsena |
Nzakazchika |
FIO |
Adres |
1 |
1 |
12.10.2008 |
1000 |
1 |
Иванов А.Д. |
М |
5 |
1 |
22.10.2008 |
2500 |
1 |
Иванов А.Д. |
М |
2 |
2 |
16.10.2008 |
2000 |
2 |
Родин Н.Р. |
СПб |
3 |
2 |
29.09.2008 |
5000 |
2 |
Родин Н.Р. |
СПб |
4 |
3 |
20.10.2008 |
1500 |
3 |
Михайлова Г.С. |
СПб |
Запрос
SELECT Nzakaza, DataZakaza, Tsena, ZAKAZCHIKI.Nzakazchika, FIO, Adres
FROM ZAKAZY,ZAKAZCHIKI
WHERE ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika
Результат запроса:
Nzakaza |
DataZakaza |
Tsena |
Nzakazchika |
FIO |
Adres |
1 |
12.10.2008 |
1000 |
1 |
Иванов А.Д. |
М |
5 |
22.10.2008 |
2500 |
1 |
Иванов А.Д. |
М |
2 |
16.10.2008 |
2000 |
2 |
Родин Н.Р. |
СПб |
3 |
29.09.2008 |
5000 |
2 |
Родин Н.Р. |
СПб |
4 |
20.10.2008 |
1500 |
3 |
Михайлова Г.С. |
СПб |
Задание: Вывести ФИО и адрес заказчика, который приобрел заказ N3
Запрос:
SELECT FIO, Adres
FROM ZAKAZY,ZAKAZCHIKI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI. Nzakazchika) and (Nzakaza=3)
Результат запроса:
FIO |
Adres |
Родин Н.Р. |
СПб |
Задание: Вывести все сведения о заказах, которые приобрел Иванов А.Д. во второй половине октября 2008 года.
Запрос:
SELECT Nzakaza, DataZakaza, Tsena
FROM ZAKAZY,ZAKAZCHIKI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika) and
(FIO=’Иванов А.Д.’) and (DataZakaza>=’16.10.2008’) and
(DataZakaza<=’31.10.2008’)
Результат запроса:
Nzakaza |
DataZakaza |
Tsena |
5 |
22.10.2008 |
2500 |
Таблица
PRODAVTSI
Nprod (*) |
FIO |
Adres |
Reiting |
1 |
Лосева А.К. |
М |
100 |
2 |
Титов Д.Б. |
СПб |
55 |
Скорректированная таблица ZAKAZY
Nzakaza (*) |
Nzakazchika |
Nprod |
DataZakaza |
Tsena |
1 |
1 |
1 |
12.10.2008 |
1000 |
2 |
2 |
2 |
16.10.2008 |
2000 |
3 |
2 |
1 |
29.09.2008 |
5000 |
4 |
3 |
2 |
20.10.2008 |
1500 |
5 |
1 |
1 |
22.10.2008 |
2500 |
Перемножение 3-х таблиц:
SELECT *
FROM ZAKAZY, ZAKAZCHIKI, PRODAVTSI
Перемножение 3-х таблиц с указанием условий связи между таблицами:
SELECT *
FROM ZAKAZY, ZAKAZCHIKI, PRODAVTSI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika) and
(ZAKAZY.Nprod= PRODAVTSI. Nprod)
Nzakaza |
Nzakazchika |
Nprod |
DataZakaza |
Tsena |
Nzakazchika |
FIO |
Adres |
Nprod |
FIO |
Adres |
Reiting |
1 |
1 |
1 |
12.10.2008 |
1000 |
1 |
Иванов А.Д. |
М |
1 |
Лосева А.К. |
М |
100 |
5 |
1 |
1 |
22.10.2008 |
2500 |
1 |
Иванов А.Д. |
М |
1 |
Лосева А.К. |
М |
100 |
2 |
2 |
2 |
16.10.2008 |
2000 |
2 |
Родин Н.Р. |
СПб |
2 |
Титов Д.Б. |
СПб |
55 |
3 |
2 |
1 |
29.09.2008 |
5000 |
2 |
Родин Н.Р. |
СПб |
1 |
Лосева А.К. |
М |
100 |
4 |
3 |
2 |
20.10.2008 |
1500 |
3 |
Михайлова Г.С. |
СПб |
2 |
Титов Д.Б. |
СПб |
55 |
Задание: Вывести все сведения о заказах в тех случаях, когда заказчик и продавец из одного и того же города.
Запрос:
SELECT *
FROM ZAKAZY, ZAKAZCHIKI, PRODAVTSI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika) and
(ZAKAZY.Nprod= PRODAVTSI. Nprod) and
(ZAKAZCHIKI.Adres= PRODAVTSI.Adres)
Результат запроса:
ZAKAZY |
ZAKAZCHIKI |
PRODAVTSI |
|||||||||
Nzakaza |
Nzakazchika |
Nprod |
DataZakaza |
Tsena |
Nzakazchika |
FIO |
Adres |
Nprod |
FIO |
Adres |
Reiting |
1 |
1 |
1 |
12.10.2008 |
1000 |
1 |
Иванов А.Д. |
М |
1 |
Лосева А.К. |
М |
100 |
5 |
1 |
1 |
22.10.2008 |
2500 |
1 |
Иванов А.Д. |
М |
1 |
Лосева А.К. |
М |
100 |
2 |
2 |
2 |
16.10.2008 |
2000 |
2 |
Родин Н.Р. |
СПб |
2 |
Титов Д.Б. |
СПб |
55 |
4 |
3 |
2 |
20.10.2008 |
1500 |
3 |
Михайлова Г.С. |
СПб |
2 |
Титов Д.Б. |
СПб |
55 |
Тот же запрос с отбором нужных столбцов:
SELECT Nzakaza, DataZakaza, Tsena
FROM ZAKAZY, ZAKAZCHIKI, PRODAVTSI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika) and
(ZAKAZY.Nprod= PRODAVTSI. Nprod) and
(ZAKAZCHIKI.Adres= PRODAVTSI.Adres)
Результат запроса:
Nzakaza |
DataZakaza |
Tsena |
1 |
12.10.2008 |
1000 |
5 |
22.10.2008 |
2500 |
2 |
16.10.2008 |
2000 |
4 |
20.10.2008 |
1500 |
________________________________________________________________
Задание
Написать запросы и отобразить результаты запросов
Вывести ZAKAZY * PRODAVTSI – все строки и столбцы
Вывести ZAKAZY * PRODAVTSI с указанием связи между таблицами по полю Nprod
Вывести ФИО и рейтинг продавца, продавшего заказ N4
Вывести номера и даты заказов, сделанных в октябре
Вывести ФИО заказчиков, покупавших заказы у продавцов из Москвы.
Агрегатные функции
Агрегатные функции работают с несколькими записями сразу – это могут быть все записи одной группы или все записи таблицы.
Агрегатные функции:
sum - сумма
avg - среднее арифметическое
min - минимум
max - максимум
count – количество строк
Параметр агрегатной функции – поле, для которого выполняется операция.
Задание: Вывести суммарную стоимость всех заказов
ZAKAZY
Nzakaza (*) |
Nzakazchika |
Nprod |
DataZakaza |
Tsena |
1 |
1 |
1 |
12.10.2008 |
1000 |
2 |
2 |
2 |
16.10.2008 |
2000 |
3 |
2 |
1 |
29.09.2008 |
5000 |
4 |
3 |
2 |
20.10.2008 |
1500 |
5 |
1 |
1 |
22.10.2008 |
2500 |
Требуемая величина: 1000+2000+5000+1500+2500 = 12000
Запрос:
SELECT sum(Tsena)
FROM ZAKAZY
Результат запроса:
sum(Tsena) |
12000 |
Задание: Вывести дату последнего заказа (дата этого заказа – максимальная, т.е. самая последняя)
Запрос:
SELECT max(DataZakaza)
FROM ZAKAZY
Результат запроса:
max(DataZakaza) |
22.10.2008 |
Задание: Вывести общее количество заказов
Запрос:
SELECT count(*)
FROM ZAKAZY
Результат запроса:
count(*) |
5 |
Группировка
Группировка используется для ответов на запросы следующего вида:
- вывести суммарную стоимость заказов для каждого заказчика
- вывести дату первого заказа, сделанного каждым заказчиком
- вывести ФИО заказчиков, сделавших по 3 и более заказов
и т.д.
Группировка по полю Nzakazchika для таблицы ZAKAZY:
Nzakaza (*) |
Nzakazchika |
Nprod |
DataZakaza |
Tsena |
1 |
1 |
1 |
12.10.2008 |
1000 |
5 |
1 |
1 |
22.10.2008 |
2500 |
2 |
2 |
2 |
16.10.2008 |
2000 |
3 |
2 |
1 |
29.09.2008 |
5000 |
4 |
3 |
2 |
20.10.2008 |
1500 |
Задание: Вывести суммарную стоимость заказов для каждого заказчика
Запрос:
SELECT Nzakazchika, sum(Tsena)
FROM ZAKAZY
GROUP BY Nzakazchika
!!! При использовании группировки в секции SELECT можно указывать только те поля, по которым проводится группировка
Результат запроса:
Nzakazchika |
sum(Tsena) |
1 |
3500 |
2 |
7000 |
3 |
1500 |
Задание: вывести дату первого заказа, сделанного каждым заказчиком
Запрос:
SELECT Nzakazchika, min(DataZakaza)
FROM ZAKAZY
GROUP BY Nzakazchika
Результат запроса:
Nzakazchika |
min(DataZakaza) |
1 |
12.10.2008 |
2 |
29.09.2008 |
3 |
20.10.2008 |
Задание: вывести дату первого заказа, сделанного заказчиком N2
Запрос:
SELECT min(DataZakaza)
FROM ZAKAZY
WHERE Nzakazchika=2
GROUP BY Nzakazchika
или
SELECT min(DataZakaza)
FROM ZAKAZY
WHERE Nzakazchika=2
Результат запроса:
min(DataZakaza) |
29.09.2008 |
Задание: вывести ФИО заказчиков и количество сделанных ими заказов
Запрос:
SELECT FIO, count(*)
FROM ZAKAZY, ZAKAZCHIKI
WHERE ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika
GROUP BY FIO
Результат запроса:
FIO |
Count(*) |
Иванов А.Д. |
2 |
Родин Н.Р. |
2 |
Михайлова Г.С. |
1 |
Задание: вывести количество заказов, сделанных Ивановым А.Д.
Запрос:
SELECT count(*)
FROM ZAKAZY, ZAKAZCHIKI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika) and
(FIO=” Иванов А.Д.”)
GROUP BY FIO
или
SELECT count(*)
FROM ZAKAZY, ZAKAZCHIKI
WHERE (ZAKAZY.Nzakazchika= ZAKAZCHIKI.Nzakazchika) and
(FIO=” Иванов А.Д.”)
Count(*) |
2 |
Условия отбора для групп
Задание: вывести номера заказчиков и суммарную стоимость сделанных ими заказов для тех заказчиков, у которых стоимость всех заказов не менее 2000 руб.
SELECT Nzakazchika, sum(Tsena)
FROM ZAKAZY
GROUP BY Nzakazchika
HAVING sum(Tsena)>=2000
Результат запроса:
Nzakazchika |
sum(Tsena) |
1 |
3500 |
2 |
7000 |
Задания:
(без запроса!!!) Изобразить таблицу ZAKAZY, сгруппированную по номеру продавца. Обозначить границы между группами.
------ остальные задания: запрос и результат запроса ----
Вывести дату самого первого (раннего) заказа (по всей таблице ZAKAZY)
Вывести суммарную стоимость всех заказов для каждого (номера) продавца
Вывести дату последнего (самого позднего) заказа для каждого (номера) продавца
Вывести количество заказов для каждого (номера) продавца
Вывести количество заказов для продавца с номером 2
Вывести максимальную стоимость заказа для каждого продавца (по ФИО)
Вывести количество заказов для продавца Титова Д.Б.
Вывести суммарную стоимость всех заказов для заказчиков из СПб
Вывести номера продавцов и количество проданных ими заказов для тех продавцов, у которых количество заказов <=2
Вывести номера заказчиков и среднюю стоимость сделанных ими заказов для тех заказчиков, у которых дата последнего заказа не раньше 21.10.08
Вывести количество заказов для каждой взаимодействующей пары продавец-заказчик (группировка по нескольким полям)