Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диго С.М. Базы данных проектирование и использование.doc
Скачиваний:
720
Добавлен:
14.05.2016
Размер:
12.04 Mб
Скачать

Предложение having

В оператор SELECT, содержащий предложение GROUP BY, могут быть включены как предложение WHERE, так и HAVING. Пред­ложение WHERE используется для исключения записей из группи­ровки, a HAVING - для применения фильтра к записям после груп­пировки.

Предложение HAVING имеет следующий синтаксис:

[HAVING условиеГруппировки]

Ниже приведен пример запроса, показывающего число сотрудни­ков на кафедрах с численностью более пяти человек:

SELECT [код кафедры], Count(ФИО) AS [число_сотрудников]

FROM сотрудник

GROUP BY [код кафедры]

HAVING Count(ФИО)>5;

Предложение HAVING может содержать до 40 выражений, свя­занных логическими операторами AND и OR.

Предложение order by

Предложение ORDER BY используется для сортировки записей, полученных в результате запроса, в порядке возрастания или убыва­ния на основе значений указанного поля (или полей).

Предложение ORDER BY выглядит следующим образом:

[ORDER BY попе J [ASC | DESC ][, поле_2 [ASC | DESC ]][, ...]]],

где поле_1, поле_2 - имена полей, по которым сортируются записи, ASC - упорядочение по возрастанию, DESC - упорядочение по убы­ванию. По умолчанию используется порядок сортировки по возра­станию (от А до Я и от 0 до 9).

Для сортировки по убыванию (от Я до А и от 9 до 0) следует доба­вить зарезервированное слово DESC после имени каждого поля, ко­торое нужно отсортировать в убывающем порядке.

Предложение ORDER BY может содержать несколько полей. Сна­чала записи сортируются по первому полю в списке ORDER BY.

Затем записи, имеющие совпадающие значения в первом поле, сор­тируются по второму полю и т.д.

В приведенном ниже операторе SQL записи сортируются по убы­ванию окладов, а внутри группы одинаковых окладов - по возраста­нию ФИО:

SELECT Фамилия, Оклад

FROM Сотрудники

ORDER BY Оклад DESC, Фамилия;

Нельзя осуществлять сортировку по полям типа MEMO или объек­та OLE.

Предложение ORDER BY обычно является последним элемен­том инструкции SQL.

7.9.2. Подчиненные запросы sql

Подчиненный запрос - это оператор SELECT, вложенный в опе­раторы SELECT, SELECT..INTO, INSERT...INTO, DELETE или UPDATE либо в другой подчиненный запрос.

Вложенный запрос в общем случае возвращает какое-то множе­ство записей. Для отбора этих записей во внешнем запросе могут быть использованы:

сравнение [ANY | ALL | SOME] (оператор);

выражение [NOT] IN (оператор);

[NOT] EXISTS (оператор),

где

сравнение - выражение и оператор сравнения, сравнивающий это выражение с результатом выполнения подчиненного запроса;

выражение - выражение, которое должно быть найдено в наборе записей, являющихся результатом выполнения подчиненного запроса;

оператор - правильный оператор SELECT, заключенный в круглые скоб­ки, который и является вложенным запросом.

Подчиненный запрос обычно используется в предложении WHERE или HAVING.

Предикаты ANY или SOME являются синонимами. Они исполь­зуются для отбора в главном запросе записей, которые удовлетворя­ют сравнению с какой-либо из записей, отобранных в подчиненном запросе.

В операторе подчиненного запроса SELECT нельзя задавать зап­рос на объединение или перекрестный запрос.

Ниже в виде вложенного запроса представлен запрос «Список сотрудников, имеющих детей»:

SELECT сотрудник.ФИО

FROM сотрудник

WHERE сотрудник.код_сотрудника=АNY (SELECT код_сотрудника

FROM дети);

Этот же запрос может быть представлен с использованием преди­ката IN:

SELECT фио

FROM сотрудник

WHERE код_сотрудника IN

(SELECT код_сотрудника

FROM дети);

Список сотрудников, не имеющих детей, можно выдать, исполь­зуя запрос

SELECT фио

FROM сотрудник

WHERE код_сотрудника NOT IN

(SELECT код_сотрудника

FROM дети);

или запрос с использованием предиката ALL:

SELECT сотрудник.фио

FROM сотрудник

WHERE сотрудник.код _сотрудника <>ALL (SELECT код_сотрудника

FROM дети);

Тот же запрос с использованием встроенного оператора JOIN мо­жет быть представлен в виде

SELECT сотрудник.фио

FROM сотрудник LEFT JOIN дети

ON сотрудник.код_сотрудника = дети.код_сотрудника

WHERE ((дети.фио_ребенка) IS NULL);