Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
345
Добавлен:
02.04.2015
Размер:
493.06 Кб
Скачать

Использование подзапросов в предложении having

Подзапросы можно использовать не только в предложениях WHERE, определяющих условия выбора строк, но и в условии выбора групп строк, задаваемых предложениемHAVING.

Пример 25.Для получения списка отделов, в которых средняя зарплата больше, чем в 5-м отделе, можно исполнить запрос:

SELECT отдел, Avg(зарплата) AS [средняя зарплата]

FROM Сотрудники

GROUP BY отдел

HAVING Avg(зарплата) > (SELECT Avg(зарплата)

FROM Сотрудники

WHERE отдел = 5 );

С помощью подзапроса определяется средняя зарплата в 5-м отделе, значение которой далее используется для сравнения со средней зарплатой в каждом отделе.

Вложенность подзапросов

Подзапросы могут быть вложенными один в другой, например:

Пример 26.

SELECT фамилия, имя, должность, зарплата

FROM Сотрудники

WHERE зарплата > (SELECT Max(зарплата)

FROM Сотрудники

WHERE отдел = (SELECT отдел

FROM отделы

WHERE [название отдела] = “специальный”));

Допускается до 255 уровней вложенности подзапросов.

Основные правила при формировании вложенных подзапросов

  • Вложенный подзапрос должен быть заключен в скобки и располагаться в правой части условия внешнего по отношению к нему запроса.

  • Подзапрос не может иметь предложения ORDERBY, которое может появиться только в конце основного запроса

  • Число столбцов в SELECT- списке вложенного подзапроса, их порядок и типы данных должны быть такими же, как в левой части условия родительского запроса.

  • Вложенные подзапросы всегда выполняются от внутренних к внешним.

Подзапросымогут:

  • возвращать одну и более строк,

  • использовать групповые функции и предложение GROUPBY,

  • соединять таблицы,

  • выбирать данные из таблицы, которая присутствует в основном запросе,

  • использовать операции над множествами.

Таблицам, как и полям, можно давать другие имена-псевдонимы.

Операторы exists и not exists

Эти операторы часто используется в условии для взаимосвязанных запросов и определяют наличие или отсутствие возвращаемого подзапросом значения. Если подзапрос обнаруживает хотя бы одну строку, удовлетворяющую условию поиска, оператор EXISTSвозвращает значениеTRUE, в противном случае -FALSE.

Оператор NOTEXISTSможет оказаться более корректным, чем оператор сравненияNOTIN, когда подзапрос находит пустые значения. УсловиеNOTINвозвращает значениеNULL, когда в списке сравниваемых значений появляется пустое значение, что в большинстве случаев имеет смыслFALSE.

Пример 27.Например, если мы хотим найти поставщиков, которые ничего не поставляют, запрос вида:

SELECT *

FROM поставщики

WHERE номерп NOT IN (SELECT номерп FROM поставки);

может не вернуть ни одной строки, в то время как запрос:

SELECT *

FROM поставщики e

WHERE NOT EXISTS (SELECT номерп FROM поставки WHERE номерп = e.номерп);

вернет корректный результат.

Пример 28.Выдать сведения о деталях (номер, имя и цену), для которых есть поставки. Эта задача может быть решена с помощью подчиненного запроса:

SELECT D.номерд AS [номер детали], D.имяд AS [имя детали], D.цена AS [цена детали]

FROM детали AS D

WHERE (((Exists (SELECT *

FROM поставки AS P

WHERE D.номерд=P.номерд))));

Пример 29.Отобрать все поставки для деталей, не дороже 200 руб.

Эту задачу также можно решить с помощью подчиненного запроса:

SELECT поставки.*

FROM поставки

WHERE ((поставки.номерд In (SELECT номерд

FROM детали

WHERE цена < 200)));

Пример 30.Выдать сведения о сотрудниках, зарплата которых больше средней зарплаты в их отделе. Это так называемый взаимосвязанный запрос:

SELECT *

FROM Сотрудники e

WHERE зарплата > (SELECT avg(зарплата)FROM Сотрудники m

WHERE m.отдел = e.отдел)

ORDER BY отдел;

Соседние файлы в папке Материалы для лабораторных Базы данных