Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4,14,24,34,44,54.docx
Скачиваний:
3
Добавлен:
17.09.2019
Размер:
30.05 Кб
Скачать

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, оговаривающим определенные условия включения групп в итоговое отношение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]