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

Ограничения на запросы с группировкой

Столбцы группировки, указанные в предложении GROUP BY, должны быть разными столбцами таблиц, перечисленных в предложении FROM. Нельзя группировать строки на основании значения вычисляемого выражения.

Следует учитывать также ограничения на элементы списка возвращаемых столбцов. Все элементы этого списка должны иметь одно значение для каждой группы строк. Это означает, что возвращаемым столбцом может быть:

1) константа;

2) агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;

3) столбец группировки, который, по определению, имеет одно и то же значение во всех строках группы;

4) выражение, включающее в себя перечисленные выше элементы.

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

SELECT NOM,FIO,SUMD,COUNT(ID) FROM PERSON,HAVE_D WHERE PERSON.NOM=HAVE_D.NOM GROUP BY NOM

В этом запросе список возвращаемых столбцов содержит помимо столбца группировки NOM также столбцы FIO и SUMD, не указанные в предложении GROUP BY. Чтобы не нарушать ограничение, необходимо просто включить эти два столбца в предложение GROUP BY:

SELECT NOM,FIO,SUMD,COUNT(ID) FROM PERSON,HAVE_D WHERE PERSON.NOM=HAVE_D.NOM

GROUP BY NOM,FIO,SUMD

Условия поиска групп

Точно так же, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING можно применить для отбора групп строк. Например, ранее рассмотренный запрос для определения среднедушевого дохода жителей каждой квартиры можно модифицировать с помощью предложения HAVING, чтобы получить информацию только о квартирах, в которых проживает более одного человека:

SELECT ADR,AVG(SUMD) FROM PERSON GROUP BY ADR HAVING COUNT(*)>1

Запрос выполняется в такой последовательности. Вначале предложение GROUP BY разделяет жителей на группы по адресам. После этого предложение HAVING исключает все группы, в которых количество строк равно единице. И наконец, предложение SELECT вычисляет среднедушевой доход для каждой из оставшихся групп и генерирует таблицу результатов запроса.

Ограничения на условия поиска групп

Условие поиска, используемое в предложении HAVING, применяется не к отдельным строкам, а к группе в целом. Это значит, что в условие поиска может входить:

1) константа;

2) агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;

3) столбец группировки, который, по определению, имеет одно и то же значение во всех строках группы;

4) выражение, включающее в себя перечисленные выше элементы.

На практике условие поиска в предложении HAVING всегда должно включать в себя как минимум одну агрегатную функцию. Если это не так, то условие поиска можно переместить в предложение WHERE. Чтобы определить, где следует указать условие поиска - в предложении WHERE или HAVING, необходимо помнить, как применяются эти предложения:

1) предложение WHERE применяется к отдельным строкам, поэтому выражения, содержащиеся в нем, должны вычисляться для отдельных строк;

2) предложение HAVING применяется к группам строк, поэтому выражения, содержащиеся в нем, должны вычисляться для групп строк.