Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ УПРАВЛЕНИЕ ДАННЫМИ 2012.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
2.54 Mб
Скачать

4.5. Вложенные запросы

Вывести номера продавцов, заключивших более одной сделки (запрос приведен на Лист. 30, результат - Табл. 43):

Лист. 30. Вложенный подзапрос в Where

SELECT distinct А.N_Продавца

FROM Сделки AS А

WHERE 1<(

SELECT count(*)

FROM Сделки B

WHERE B.N_Продавца=А.N_Продавца);

Табл. 43. Результат вложенного подзапроса в Where

24 Вложенный в Where

N_Продавца

1

Вывести номера продавцов и максимальную из средних стоимостей их сделок по дням. (запрос приведен на Лист. 31, результат – в Табл. 44):

Лист. 31. Вложенный подзапрос в From

SELECT N_Продавца, max(Средняя_стоимость)

FROM (SELECT N_Продавца, Дата, avg(Стоимость) AS Средняя_стоимость

FROM Сделки GROUP BY N_Продавца, Дата)

GROUP BY N_Продавца;

Табл. 44. Результат запроса с вложенным подзапросом в From

26 Вложенный в From

N_Продавца

Expr1001

1

360

2

840

3

550

Ошибка №10. Вложенные подзапросы помогают поэтапно конструировать запрос в сложных случаях, но злоупотреблять ими не стоит. Так, например, этот запрос легко делается с использованием Having без вложенного подзапроса. См. сравнение одинаковых по результату запросов в Табл. 45.

Табл. 45. Одинаковые по результату запросы с подзапросами и без

Запрос

Комментарий

SELECT N_Продавца, AVG(Стоимость)

FROM Сделки

GROUP BY N_Продавца

HAVING AVG(Стоимость)>100;

Обычный запрос с group by и having.

SELECT N_Продавца, Средняя_стоимость

FROM (Сделки N_Продавца, AVG(Стоимость) as Средняя_стоимость

FROM Сделки

GROUP BY N_Продавца)

WHERE Средняя_стоимость > 100;

Having нет, есть вложенный в from подзапрос с group by.

SELECT A.N_Продавца

FROM Сделки A

WHERE 100 < (SELECT AVG(B.Стоимость)

FROM Сделки B

WHERE B.N_Продавца = А. N_Продавца);

Нет having и group by, есть вложенный подзапрос в where и псевдонимы к одной таблице

Вывести номера продавцов и разницу между средней стоимостью их сделок и средней стоимостью всех сделок (запрос приведен на Лист. 32, результат - Табл. 46):

Лист. 32. Вложенный подзапрос в Select

SELECT N_Продавца, avg(Стоимость) – (SELECT avg(стоимость) FROM Сделки)

FROM Сделки

GROUP BY N_Продавца;

Табл. 46. Результат запроса с вложенным подзапросом в Select

27 Вложенный в Select

N_Продавца

Разница_между_средними_стоимостями

1

-140,666666666667

2

356

3

66

Вывести номера продавцов и среднюю стоимость их сделок, если средняя стоимость сделок этих продавцов больше средней стоимости по их отделу (запрос приведен на Лист. 33, результат - Табл. 47):

Лист. 33. Вложенный подзапрос в Having

SELECT B.Имя, avg(А.Стоимость)

FROM Сделки AS А, Продавцы AS B

WHERE А.N_Продавца=B.N

GROUP BY B.Отдел, А.N_Продавца, B.Имя

HAVING avg(А.Стоимость) > ( SELECT avg(C.Стоимость) FROM Сделки C, Продавцы D WHERE C.N_Продавца = D.N AND D.Отдел = B.Отдел);

Табл. 47 Результат запроса с вложенным подзапросом в Having

25 Вложенный в Having

Имя

Средняя_стоимость

Сидоров

550

Ошибка №11. Группу во внешнем запросе однозначно идентифицирует А.N_Продавца, но мы в операторе GROUP BY также привели поля из таблицы B. «B.Имя» необходимо вывести на экран, без его указания в GROUP BY его пришлось бы выводить с агрегирующей функцией. «B.Отдел» используется во вложенном подзапросе, поэтому без указания в GROUP BY его тоже пришлось бы приводить в подзапросе с агрегирующей функцией.