Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Предложение GROUP BY




Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству. Это дает вам возможность объединять поля и агрегатные функции в едином предложении SELECT. Группировка является обязательной, если в операторе SELECT вы используете и агрегатные функции, и обычные столбцы. При этом группировка должна выполняться по всем неагрегатным столбцам.

Существует два основных правила группировки.

- Каждый столбец, включенный в неагрегатный список оператора SELECT, должен появиться в предложении GROUP BY.

- Оператор SELECT может содержать только одно предложение GROUP BY.

Это важнейшие правила группировки. Мы должны их помнить и использовать в любом нашем операторе, выполняющем группировку. Иначе получим ошибку, борьба с которой может занять слишком много нашего драгоценного времени

Предложение GROUP BY располагается после предложения WHERE и перед предложением ORDER BY.

Например, предположим что вы хотите найти сколько каких имен содержится в нашем списке, при этом упорядочивая вывод по найденному количеству (по направлению от большего к меньшему), если количество будет повторяться, отсортируем список по имени:[29]

SELECT COUNT (*), PR_NAME2

FROM PERSON

GROUP BY PR_NAME2

ORDER BY 1 DESC, PR_NAME2

Получим следующий список, упорядоченный по результатам расчета функции COUNT

Листинг 14.Количество каждого имени в списке людей

COUNT PR_NAME2
  Елена
  Наталья
  Татьяна
  Светлана
  Марина
  Ирина
  Оксана
  Ольга
  Екатерина
  Юлия
  Сергей
  Александр
  Анна
  Алексей
  Дмитрий
  Надежда
  Олег
  Вера
  Людмила
  Мария
  Владимир
  Ксения
  Лариса
  Максим
  Анастасия
  Вячеслав
  Евгений
  Илья
  Любовь
  Михаил
  Семен
  Станислав
  Эдуард
  Алевтина
  Алмаз
  Альбина
  Амина
  Ангелина
  Антонина
  Валентина
  Валерий
  Василий
  Виктория
  Галина
  Гульнара
  Евгения
  Кирил
  Константин
  Лиана
  Лилия
  Марианна
  Назгуль
  Николай
  Нина
  Павел
  Петр
  Руслан
  Тарас
  Эльвира
  Эмма
  Юлиана
  Юлий
  Явар

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

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

Предложение HAVING определяет критерии используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Для GROUP BY ключевое слово HAVING играет ту же роль, что и WHERE для ORDER BY. Другими словами, WHERE задает условия для значений из выбранных столбцов, а HAVING задает условия для групп, создаваемых с помощью GROUP BY.

Ключевое слово HAVING в операторе SELECT должно следовать за выражением ключевого слова GROUP BY и тоже предшествовать ключевому слову ORDER BY, если последнее используется. Синтаксис:

[GROUP BY <список столбцов> [HAVING <условия поиска>]]

Основным требованием к составу предложения HAVING является то, что имена столбцов в этом предложении обязательно должны присутствовать в списке GROUP BY или быть параметрами агрегатной функции.

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

Найдем сколько каких имен содержится в нашем списке показывая только те имена, которые повторяются более двух раз:[30]

SELECT COUNT (*) AS "Количество", PR_NAME2

FROM PERSON

GROUP BY PR_NAME2

HAVING COUNT (*) > 2

ORDER BY 1 DESC, PR_NAME2

 

Листинг 15. Количество каждого имени в списке людей при условии что это количество превышает 2.

Количество PR_NAME2
  Елена
  Наталья
  Татьяна
  Светлана
  Марина
  Ирина
  Оксана
  Ольга
  Екатерина
  Юлия
  Сергей
  Александр
  Анна
  Алексей
  Дмитрий
  Надежда
  Олег
  Вера
  Людмила
  Мария
  Владимир
  Ксения
  Лариса
  Максим

Мы получили все те данные, которые нам были нужны.

В процессе обработки запроса система выполняет такие действия.

1. Отбираются те строки, которые соответствуют условию поиска в предложении WHERE, если таковое имеется. В нашем примере это предложение отсутствует.

2. Выбранные строки объединяются в группы на основании значения имени (PR_NAME2).

3. Для каждой группы рассчитываются значения агрегатных функций. При этом для каждой группы создается одна результирующая строка.

4. Полученные в результате строки упорядочиваются в соответствии с предложением ORDER BY (в нашем случае — по количеству строк в группе).

Соединение таблиц

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

Соединение таблиц в операторе SELECT является одним из наиболее мощных и элегантных средств реляционных баз данных.

Существует небольшое количество вариантов соединений, JOIN. Соединения задаются в списке имен таблиц:

FROM <ссылка на таблицу> [, <ссылка на таблицу>]...

Здесь не очень удачно названная мною конструкция <ссылка на таблицу> имеет приблизительно такой синтаксис:

<ссылка на таблицу>::= { <соединяемая таблица> |

<имя таблицы> |

<имя представления> |

<имя процедуры> [(<значение> [,<значение>]...)]}

[<псевдоним>]

Мы в этом предложении пока только использовали вариант указания имени одной-единственной таблицы. Сейчас начнем рассматривать соединяемые таблицы.

<соединяемая таблица>::= <ссылка на таблицу> <тип соединения>

<ссылка на таблицу> ON <условия поиска> | (<ссылка на таблицу>)

<тип соединения>::= [INNER] JOIN

| {LEFT | RIGHT | FULL} OUTER JOIN

Есть внешние (OUTER) левые, правые и полные соединения, а есть внутренние (INNER) соединения. Если вид соединения не указывается, то по умолчанию предполагается внутреннее соединение.

Рассмотрим на примерах использование всех видов соединений

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...