- •4. Элементы модели «сущность-связь» (er-модель) Диаграммы сущностей и связей.
- •14. Замыкание множества функциональных зависимостей.
- •34. Декартово произведение и соединение в sql
- •34. Группирование и агрегирование в sql. Операторы агрегирования. Группирование. Предложения ha ving.
- •54. Триггеры в sql.
34. Декартово произведение и соединение в sql
Декартово произведение и соединение в SQL
SQL позволяет простым и естественным образом сочетать в одном запросе обращения к нескольким отношениям одновременно: достаточно перечислить наименования отношений в предложении from, после чего можно обращаться к их атрибутам в предложениях select и where.
Пример Пусть необходимо определить имя продюсера кинофильма "Star Wars". Чтобы получить результат, необходимо воспользоваться двумя следующими отношениями из "кинематографической" базы данных:
Movie{title, year, length, inColor, studioName, producerC#) MovieExec(name, address, certft, netWorth)
Сертификационный номер продюсера хранится в отношении Movie в виде значения атрибута producerC#, и для его отыскания достаточно обратиться к Movie с простым запросом. Затем, зная номер продюсера, мы можем выполнить запрос к отношению MovieExec, принимая во внимание, что семантика атрибутов producerC# и cert# одинакова.
Однако в определенных ситуациях удобнее совместить два этапа процедуры поиска в одном и адресовать отношения Movie и MovieExec единовременно:
SELECT паше
FROM Movie, MovieExec
WHERE title = 'Star Wars' AND producerC* = cert#;
Запрос предусматривает рассмотрение всех пар кортежей, по одному из отношений Movie и MovieExec. Условия сочетания кортежей в пары задаются предложением where30:
компонент title кортежа отношения Movie обязан содержать значение 'star Wars';
значения компонентов producerC# кортежа Movie и cert# кортежа MovieExec должны быть равны.
Если пара кортежей, удовлетворяющих обоим условиям, найдена, ответом на запрос будет значение компонента паше кортежа отношения MovieExec. Если информация введена в базу данных правильно, кортежи совпадут лишь в том случае, когда компонент title отношения Movie содержит строку 'Star Wars', а компонент producerC* — такое число, совпадающее с cert# в MovieExec, которому отвечает значение компонента паше, равное ' George Lucas'. Таким образом, результатом выполнения запроса должна стать единственная строка, 1 George Lucas'.
34. Группирование и агрегирование в sql. Операторы агрегирования. Группирование. Предложения ha ving.
Группирование и агрегирование в SQL
В разделе 5.4.4 на с. 235 вы познакомились с оператором группирования и агрегирования (grouping and aggregation) у, который делит кортежи отношения на "группы" (см. раздел 5.4.3 на с. 234) в соответствии со значениями одного или нескольких атрибутов, а затем выполняет те или иные операции агрегирования над определенными компонентами кортежей групп. SQL реализует те же возможности, что и оператор у, предоставляя в распоряжение пользователя специальное предложение group by и позволяя задавать операторы агрегирования в контексте предложения SELECT.
Операторы агрегирования
В SQL применяются пять операторов агрегирования (aggregation) — sum, avg, min, max и count (аналогичные операторы реляционной алгебры упоминались в разделе 5.4.2 на с. 234). Операторы задаются в списке предложения select и в качестве аргументов используют скалярные выражения — как правило, названия атрибутов отношения, которые принято называть агрегируемыми (aggregated attributes). Исключение составляет оператор count {*), который вычисляет количество кортежей в отношении, создаваемом на основе отношений, перечисленных в предложении from, и с учетом условий предложения where.
Существует возможность исключения значений-дубликатов из столбца, подлежащего агрегированию. С этой целью аргумент оператора агрегирования обозначается признаком distinct. Так, например, выражение count (distinct х) означает, что в столбце х подсчитываться должны только различные (distinct) значения. Аналогичный синтаксис формально поддерживается и остальными операторами агрегирования, но выражения, подобные такому, как sum (distinct х), находят существенно меньшее применение, поскольку вряд ли кому-либо потребуется вычислять сумму различных значений атрибута х.
Группирование
Для группирования (grouping) в SQL используется предложение group by, следующее в конструкции "select—from—where" за предложением where. После пары служебных слов group by задается список группирующих атрибутов (grouping attributes). В самой простой ситуации предложение from запроса содержит только одно название отношения, и кортежи этого отношения делятся на группы в соответствии со значениями группирующих атрибутов. Если предложение select содержит какие-либо операторы агрегирования, при наличии предложения group by они применяются только к значениям внутри каждой отдельной группы.
Предложения having
Предположим, что, решая задание из примера 6.32, мы не хотели бы включать в итоговое отношение информацию обо всех продюсерах. Разумеется, можно было бы ограничить набор кортежей до выполнения группирования, чтобы сделать груп-
37 пы, которые не следует принимать во внимание, пустыми. Например, если все, что не обходимо, — это вычислить значения продолжительности воспроизведения кинофильмов, снятых продюсерами, которые обладают годовым доходом свыше 10 миллионов долларов, — достаточно было бы заменить третью строку рис. 6.13 такой:
WHERE producerC# = cert# AND netWorth >10000000
Подчас, однако, требуется выбирать группы, учитывая некоторые свойства групп как таковых. В подобных случаях конструкция "select ... group by" пополняется специальным предложением having, оговаривающим определенные условия включения групп в итоговое отношение.