Предложение 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.Количество каждого имени в списке людей
Предложение 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.
Мы получили все те данные, которые нам были нужны. В процессе обработки запроса система выполняет такие действия. 1. Отбираются те строки, которые соответствуют условию поиска в предложении WHERE, если таковое имеется. В нашем примере это предложение отсутствует. 2. Выбранные строки объединяются в группы на основании значения имени (PR_NAME2). 3. Для каждой группы рассчитываются значения агрегатных функций. При этом для каждой группы создается одна результирующая строка. 4. Полученные в результате строки упорядочиваются в соответствии с предложением ORDER BY (в нашем случае — по количеству строк в группе). Соединение таблиц Вы помните, что в процессе нормализации таблиц вам часто приходилось разделять таблицы на несколько взаимосвязанных таблиц, чтобы устранить избыточность данных. Тогда же я успокоил вас, сказав, что таблицы снова можно будет объединить с помощью операции соединения. Это действительно так. Соединение таблиц в операторе SELECT является одним из наиболее мощных и элегантных средств реляционных баз данных. Существует небольшое количество вариантов соединений, JOIN. Соединения задаются в списке имен таблиц: FROM <ссылка на таблицу> [, <ссылка на таблицу>]... Здесь не очень удачно названная мною конструкция <ссылка на таблицу> имеет приблизительно такой синтаксис:
<ссылка на таблицу>::= { <соединяемая таблица> | <имя таблицы> | <имя представления> | <имя процедуры> [(<значение> [,<значение>]...)]} [<псевдоним>] Мы в этом предложении пока только использовали вариант указания имени одной-единственной таблицы. Сейчас начнем рассматривать соединяемые таблицы. <соединяемая таблица>::= <ссылка на таблицу> <тип соединения> <ссылка на таблицу> ON <условия поиска> | (<ссылка на таблицу>) <тип соединения>::= [INNER] JOIN | {LEFT | RIGHT | FULL} OUTER JOIN Есть внешние (OUTER) левые, правые и полные соединения, а есть внутренние (INNER) соединения. Если вид соединения не указывается, то по умолчанию предполагается внутреннее соединение. Рассмотрим на примерах использование всех видов соединений
Читайте также: IV. Переведите предложение с обособленным причастным оборотом, подчеркните Partizip I или Partizip II. Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|