double arrow

Типы связывания


Резюме

Ключевое слово HAVING

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

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

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

SELECT столбец1, столбец2

FROM таблица1, таблица2

WHERE условия

GROUP BY столбец1, столбец2

HAVING условия

ORDER BY столбец1, столбец2

В следующем примере выбираются средние значения для почасовой нормы оплаты и для зарплаты по всем городам, кроме Гринвуда. Данные группируются по значениям столбца CITY, но отображаются только те группы (города), для которых средняя зарплата превышает 20000. Результат отсортирован по значению средней зарплаты для городов.

SELECT CITY, AVG (PAY_RATE), AVG (SALARY) FROM EMP_PAY_TMP

WHERE CITY <> 'GREENWOOD' GROUP BY CITY HAVING AVG (SALARY) > 20000 ORDER BY 3;

CITY AVG (PAY_RATE) AVG (SALARY)

WHITELAND 40000

Почему здесь оказалась выбрана только одна строка? По следующим причинам.

  • Город Гринвуд исключен выражением ключевого слова WHERE.
  • Данные по городу Индианаполис не представлены ввиду того, что средняя зарплата для этого города равна 20000, что не превышает необходимые 20000.

Итак, вы теперь знаете, как группировать результаты запроса с помощью ключевого слова GROUP BY. Ключевое слово GROUP BY используется, главным образом, с итоговыми функциями SQL типа SUM, AVG, MAX, MIN и COUNT. Ключевое слово GROUP BY подобно ключевому слову ORDER BY в том смысле, что оба они сортируют выводимые данные. Ключевое слово GROUP BY предназначено для сортировки данных по группам, но может использоваться и для обычной сортировки данных, хотя последнее проще сделать с помощью ключевого слова ORDER BY.

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

Вопросы и ответы

При использовании ключевого слова ORDER BY в операторе SELECT обязательно ли использовать ключевое слово GROUP BY?

Нет. Ключевое слово GROUP BY в операторе SELECT является необязательным, но оно может оказаться очень полезным при использовании ORDER BY.

Что такое групповое значение?

Рассмотрим столбец CITY таблицы EMPLOYEE_TBL. Если выбрать имена служащих (LAST_NAME) и города (CITY) и эти данные сгруппировать по городам, строки для одинаковых названий городов будут отображены вместе.

Чтобы сгруппировать данные запроса по некоторому столбцу в выражении ключевого словаGROUP BY, должен ли этот столбец быть указан в списке ключевого словаSELECT?

Обязательно. Для того чтобы группировать данные по столбцу, его имя должно быть указано в списке ключевого слова SELECT.

Практикум

Задания практических занятий разделены на тесты и упражнения. Тесты предназначены для проверки общего уровня понимания рассмотренного материала. Упражнения дают возможность применить на практике идеи, обсуждавшиеся в ходе текущего урока, в комбинации с идеями из предыдущих уроков. Мы рекомендуем ответить на тестовые вопросы и выполнить упражнения прежде, чем продолжать дальнейшее чтение книги. Ответы можно проверить по Приложению Б, "Ответы".

Тесты

1. Будут ли работать следующие операторы SELECT? Если нет, то что в них следует исправить?

· SELECT SUM(SALARY), EMP_ID FROM EMPLOYEE_PAY_TBL GROUP BY 1 AND 2;

· SELECT EMP_ID, MAX(SALARY) FROM EMPLOYEE_PAY_TBL GROUP BY SALARY, EMP_ID;

· SELECT EMP_ID, COUNT(SALARY) FROM EMPLOYEE_PAY_TBL ORDER BY EMP_ID GROUP BY SALARY;

2. Верно ли следующее утверждение: "При использовании ключевого слова HAVING необходимо использовать также и ключевое слово GROUP BY?"

3. Верно ли следующее утверждение: "Следующий оператор SQL возвратит суммы зарплат по группам"

SELECT SUM (SALARY) FROM EMPLOYEE_PAY_TBL

4. Верно ли следующее утверждение' "Выбранные в запросе столбцы должны присутствовать в списке ключевого слова GROUP BY в том же порядке?"

5. Верно ли следующее утверждение: "Выражение ключевого слова HAVING говорит GROUP BY о том, какие группы следует включить в вывод?"

Упражнения

1. Запишите оператор SQL, возвращающий табельный номер служащего (EMP_ID), имя служащего (LAST_NAME) и название города (CITY) из таблицы EMPLOYEE_TBL, сгруппированные по значениям столбца CITY.

2. Запишите оператор SQL, возвращающий из таблицы EMPLOYEE_TBL названия городов и число проживающих в них служащих. Добавьте в оператор ключевое слово HAVING, чтобы в выводе отобразить только те города, в которых проживает более двух служащих из числа тех, информация о которых имеется в таблице.

Объединение таблиц в запросах

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

Основными на этом уроке будут следующие темы.

  • Основные подходы к связыванию таблиц.
  • Различные типы связей.
  • Как и когда следует использовать связывание таблиц.
  • Ряд практических примеров связывания таблиц.
  • Последствия неправильного связывания таблиц.
  • Использование псевдонимов таблиц в запросах.

Отбор данных из нескольких таблиц

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

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

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

Вы можете удивиться – зачем нормализовать таблицы, если, в конце концов, снова приходится объединять их, чтобы извлечь необходимые данные? Ответ прост: извлекать все данные из всех таблиц сразу приходится крайне редко, поэтому лучше объединять в запросе только те несколько таблиц, которые оказываются нужны в каждом конкретном случае. Хотя при этом работа базы данных может несколько замедлиться, это очевидно компенсируется существенным упрощением работы с базой данных и управления ею.

Несмотря на то, что число предлагаемых различными реализациями SQL способов связывания таблиц достаточно велико, мы рассмотрим только самые общие типы связывания, к которым относятся

  • связывание по равенству (EQU JOIN);
  • естественное связывание (NATURAL JOIN);
  • связывание по неравенству (NON-EQU JOIN);
  • внешнее связывание (OUTER JOIN);
  • рекурсивное связывание (SELF JOIN).

Сейчас читают про: