
- •Isbn 5-8459-0138-3 (рус) isbn 0-201-38590-2 (англ)
- •Глава 2. Архитектура системы баз данных 65
- •Глава 6. Реляционная алгебра 192
- •Глава 7. Реляционное исчисление 243
- •Глава 8. Целостность данных 301
- •Глава 9. Представления 350
- •Часть 111
- •Часть IV
- •Глава 14. Восстановление 544 14.1. Введение 544
- •Глава 15. Параллельность 566
- •Часть V
- •Глава 16. Защита данных 602
- •Глава 17. Оптимизация 639
- •Глава 18. Отсутствующая информация 693
- •Глава 19. Наследование типов 725
- •Глава 20. Распределенные базы данных 767
- •Глава 21. Поддержка принятия решений 813
- •Глава 22. Хронологические базы данных 853
- •Глава 23. Логические системы управления базами данных 899
- •Часть VI
- •Глава 24. Объектные базы данных 944
- •Глава 25. Объектно-реляционные базы данных 999
- •Часть I (четыре главы) — это обширное введение в теорию баз данных вообще и реляционных баз данных в частности. Здесь также излагаются основы стандартно- го языка баз данных sql.
- •Часть IV. Две главы данной части — это несколько пересмотренные и расширен- ные версии глав 13 и 14 предыдущего издания.
- •Часть VI. Глава 24 является полностью переписанной и значительно улучшенной версией глав 22-24. Глава 25 почти полностью обновлена.
- •Часть I
- •Часть I состоит из четырех вводных глав.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных Перманентные данные
- •1.4. Назначение баз данных
- •1.5. Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •2.1. Введение
- •2.2. Три уровня архитектуры
- •Внешний уровень (представления отдельных пользователей)Концептуальный уровень (обобщенное представление пользователей)
- •2.3. Внешний уровень
- •Отображение "внешний/концептуальный" схемы
- •Определение структур хранения (внутренняя схема)
- •Внешнее представление а Концептуальная схема
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура "клиент/сервер"
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •3.1. Введение
- •3.2. Реляционная модель
- •3.3. Отношения и переменные-отношения
- •3.4. Смысл отношений
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые переменные-отношения и представления
- •3.8. Транзакции
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
- •Глава 4
- •4.1. Введение
- •4.2. Обзор языка sql
- •4.3. Каталог
- •4.4. Представления
- •4.5. Транзакции
- •4.6. Внедрение sql-операторов
- •4.7. Несовершенство языка sql
- •4.8. Резюме
- •Часть 9. Управление внешними данными (sql/med) Часть 10. Связь с объектным языком (sql/olb)
- •Часть II
- •Глава 5
- •5.1. Введение
- •5.2. Домены
- •5.3. Значения отношений
- •5.4. Переменные-отношения
- •5.5. Средства sql
- •5.6. Резюме
- •6.1. Введение
- •6.2. Реляционная замкнутость
- •6.3. Синтаксис
- •6.4. Семантика
- •6.5. Примеры
- •6.5.1. Получить имена поставщиков детали с номером 'р2'
- •6.5.2. Получить имена поставщиков по крайней мере одной красной детали
- •6.5.3. Получить имена поставщиков всех типов деталей
- •6.5.4. Получить номера поставщиков по крайней мере тех типов деталей, которые поставляет поставщик с номером 's2'
- •6.5.5. Получить все пары номеров поставщиков, находящихся в одном городе
- •6.5.6. Получить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •6.6. Зачем нужна реляционная алгебра
- •6.7. Дополнительные операторы
- •6.8. Группирование и разгруппирование
- •6.9. Реляционные сравнения
- •6.10. Резюме
- •7.1. Введение
- •7.2. Исчисление кортежей
- •7.3. Примеры
- •7.3.5. Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером 's2'
- •7.3.6. Выбрать имена поставщиков всех типов деталей
- •7.3.7. Определить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.3.8. Определить номера поставщиков по крайней мере всех типов деталей, поставляемых поставщиком с номером *s2'
- •7.4. Сравнительный анализ реляционного исчисления и реляционной алгебры
- •7.5. Вычислительные возможности
- •7.5.1. Определить номера и вес в граммах всех типов деталей, вес которых превышает 10 ооо г
- •7.6.1. Выбрать номера поставщиков из Парижа со статусом, большим 20
- •7.7.1. Указать цвета деталей и названия городов, в которых находятся детали "не из Парижа" с весом, превышающим 10 фунтов
- •7.7.2. Для всех деталей указать номер и вес в граммах
- •7.7.3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе
- •7.7.4. Найти все пары названий городов, таких, что поставщик из первого города поставляет деталь, находящуюся во втором городе
- •7.7.5. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
7.2. Исчисление кортежей
Как и при описании реляционной алгебры в главе 6, сначала введем для реляци- онного исчисления конкретный синтаксис, взяв за образец (хотя умышленно не со- всем точно) версию исчисления языка Tutorial D, определенного в [3.3], а затем пе- рейдем к обсуждению семантики. В следующих ниже подразделах обсуждаются синтаксис и семантика.
Синтаксис
Замечание. Многие из приведенных здесь синтаксических правил не будут понятны вам до тех пор, пока вы не изучите семантический материал, следующий далее. Однако мы все же решили собрать все правила вместе для удобства ссылок.
Начнем с повторения синтаксиса параметра реляционное выражение>, приведенного в главе 6.
реляционное выражение>
::= RELATION { < список выражений кортежей > } < имя переменной-отношения > реляционная операция> ( реляционное выражение> )
Иными словами, синтаксис параметра реляционное выражение> остается прежним, однако один из наиболее важных его подпараметров, реляционная операция>, теперь будет иметь совершенно иное определение.
Определение переменной кортежа>
::= RANGEVAR <имя переменной кортежа>
RANGES OVER Описок реляционных выражений> ;
' Данный термин нелогичен: если исчисление доменов называется так по указанной причине, то исчисление кортежей следовало бы назвать исчислением отношений.
Параметр <имя переменной кортежа> может использоваться как <выражение кортежа>7, однако лишь в определенном контексте, а именно:
перед точкой и последующим уточнением в параметре <ссылка на атрибут кортежа>;
сразу после квантора в параметре Логическое выражение с квантором>;
как операнд в параметре <логическое выражение>;
как параметр <прототип кортежа> или как (операнд) подпараметр <выражение> в параметре <прототип кортежа>.
<ссылка на атрибут кортежа>
::= <имя переменной кортежа>.<ссылка на атрибут?
[ AS <имя атрибута> ]
Параметр <ссылка на атрибут кортежа> может использоваться как параметр <выражение>, но только в определенном контексте, а именно:
как операнд параметра <логическое выражение>;
как параметр <прототип кортежа> или как (операнд) подпараметр <выражение> в параметре <прототип кортежа>.
<логическое выражение>
::= ... все обычные возможности вместе с: | <логическое выражение с квантором?
Ссылки на переменные кортежей в значении параметра <логическое выражение> мо- гут быть свободными в пределах этого параметра тогда и только тогда, когда выполнены два следующих условия.
Параметр <логическое выражение> расположен непосредственно после параметра реляционная операция> (т.е. параметр Логическое выражение> следует сразу за ключевым словом WHERE).
Ссылка (обязательно свободная) именно на эту переменную кортежа непосредственно присутствует в значении параметра <прототип кортежа>, непосредственно содержа- щегося в том же выражении реляционная операция> (т.е. параметр <прототип кортежа> располагается непосредственно перед ключевым словом WHERE).
Замечание по терминологии. В контексте реляционного исчисления (в версии исчис- ления доменов или исчисления кортежей) логические выражения часто называют пра- вильно построенными формулами (well-formed formulas— WFF, что произносится как "вэфф"). Далее мы также будем часто пользоваться этой терминологией.
<логическое выражение с квантором>
::= EXISTS <имя переменной кортежа> ( <логическое выражение> ) | F0RALL <имя переменной кортежа> ( <логическое выражение> )
реляционная операция>
::= <прототип кортежа> [ WHERE Логическое выражение> ]
В реляционной алгебре, рассмотренной в главе 6, параметр реляционная операция> представлял собой одну из форм параметра реляционное выражение>, од- нако здесь он определяется иначе. Другие формы параметра реляционное выражение> (в основном, имена переменных-отношений и обращение к операторам выбора) допус- тимы, как и ранее.
<прототип кортежа>
::= <выражение кортежа>
Все ссылки на переменные кортежа, помещенные непосредственно в значение пара- метра <прототип кортежа>, должны быть свободными в пределах данного параметра <прототип кортежа>.
Замечание. Прототип кортежа — термин удачный, но не стандартный.
Переменные кортежей
Приведем несколько примеров определения переменных кортежей (выраженных, как обычно, в контексте базы данных поставщиков и деталей).
RANGEVAR SX RANGES OVER S ; RANGEVAR SY RANGES OVER S ; RANGEVAR SPX RANGES OVER SP ; RANGEVAR SPY RANGES OVER SP ; RANGEVAR PX RANGES OVER P ;
RANGEVAR SO RANGES OVER
( SX WHERE SX.CITY = 'London' ) ,
( SX WHERE EXISTS SPX ( SPX.St = SX.St AND
SPX.Pt SPX = Pi ( 'PI' ) ) ) ;
Переменная кортежа SU из последнего примера определена на объединении множест- ва кортежей поставщиков, находящихся в Лондоне, и множества кортежей поставщиков детали с номером 'Р1'. Обратите внимание, что в определении переменной кортежа SO используются переменные кортежей SX и SPX. Также обратите внимание на то, что в по- добных определениях переменных, построенных на объединении отношений, объеди- няемые отношения, безусловно, должны быть совместимы по типу.
Замечание. Переменные кортежей не являются переменными в обычном смысле (как в языках программирования); они являются переменными в логическом смысле. В дейст- вительности они в значительной мере аналогичны местодержателям или параметрам предикатов, обсуждавшихся в главе 3. (Различие состоит в том, что на место параметров предикатов, обсуждавшихся в этой главе, подставляются значения из некоторого домена, а на место переменных кортежей подставляются кортежи.)
Далее в этой главе предполагается, что приведенные выше определения переменных кортежей остаются в силе. Следует отметить, что в реальном языке должны быть опре- деленные правила относительно области действия таких определений. В настоящей главе этот вопрос не рассматривается.
Свободные и связанные переменные кортежей
Каждая ссылка на переменную кортежа (в некотором контексте, в частности в фор- муле WFF) является или свободной, или связанной. Сначала поясним это утверждение в чисто синтаксических терминах, а затем перейдем к обсуждению его смысла.
Пусть V — переменная кортежа. Тогда имеем следующее.
Ссылки на переменную V в формулах WFF типа NOT р свободны или связаны в пределах этой формулы в зависимости от того, свободны ли они в формуле р. Ссылки на переменную V в формулах WFF типа (р AND q) и (р OR q) свободны или связаны в зависимости от того, свободны ли они в формулах р и q.
Ссылки на переменную V, которые свободны в формуле WFF р, связаны в форму- лах WFF типа EXISTS V(p) и FORALL V(p). Другие ссылки на переменные корте- жей в формуле р будут свободны или связаны в формулах WFF типа EXISTS V(p) и FORALL V(p) в соответствии с тем, свободны ли они в формуле р.
Для полноты необходимо добавить следующие замечания.
Единственная ссылка на переменную V в значении параметра <имя переменной кортежа> является свободной в пределах этого параметра <имя переменной кортежа>.
Единственная ссылка на переменную V в значении параметра <ссылка на атрибут кортежа> V.A является свободной в пределах этого параметра <ссылка на атрибут кортежа>.
Если ссылка на переменную V является свободной в некотором выражении ехр, то эта ссылка будет также свободной в любом выражении ехр', непосредственно со- держащем выражение ехр как подвыражение, если только в выражении ехр' не вводится квантор, связывающий переменную V.
Приведем несколько примеров формул WFF, содержащих переменные кортежей.
■ Простые сравнения SX.Si = Si ( 'SI' ) SX.Si = SPX.Si SPX.Pi Ф PX.Pi
Здесь все ссылки на переменные SX, РХ и SPX являются свободными.
■ Логические выражения из простых сравнений
РХ.WEIGHT < WEIGHT ( 15.5 ) OR PX.CITY = 'Rome'
NOT ( SX.CITY = 'London' 5
SX.Si = SPX.Si AND SPX.Pi Ф PX.Pi
PX.COLOR = COLOR ( 'Red' ) OR PX.CITY = 'London'
Здесь также все ссылки на переменные SX, РХ и SPX являются свободными.
■ Формулы WFF с кванторами
EXISTS SPX ( SPX.Si = SX.Si AND SPX.Pi = Pt ( 'P2' ) ) FORALL PX ( PX.COLOR = COLOR ( 'Red' ) )
В этих примерах ссылки на переменные SPX и РХ являются связанными, а ссылка на переменную SX является свободной. Подробнее данные примеры объясняются ниже.
Кванторы
Существует два квантора: EXISTS и FORALL. Квантор EXISTS является квантором су- ществования, a FORALL — квантором всеобщности. По сути, если выражение р — форму- ла WFF, в которой переменная V свободна, то выражения
EXISTS V ( р )
и
FORALL V ( р )
также являются допустимыми формулами WFF, но переменная V в них обеих будет связанной. Первая формула означает следующее: "Существует по крайней мере одно значение переменной V, такое, что вычисление формулы р дает для него значение ис- тина". Вторая формула означает следующее: "Для всех значений переменной V вы- числение формулы р дает значение истина". Предположим, например, что переменная V изменяется на множестве "Члены сената США в 1999 году", и предположим также, что выражение р — следующая формула WFF: "V — женщина" (разумеется, мы не пы- таемся использовать здесь формальный синтаксис). Тогда выражение EXISTS V(p) бу- дет допустимой формулой WFF, имеющей значение истина (true); выражение FORALL V(p) также будет допустимой формулой WFF, но вычисление его значения бу- дет давать значение ложь (false).
Теперь рассмотрим квантор существования EXISTS более внимательно. Еще раз обра- тимся к примеру из предыдущего раздела.
EXISTS SPX { SPX.St = SX.St AND SPX.Pt = Pt ( 'P2' ) )
Из приведенных ранее рассуждений следует, что эта формула WFF может быть про- читана следующим образом.
В текущем значении переменной-отношения SP существует кортеж (скажем, SPX), такой, для которого значение атрибута St в этом кортеже равно значению атрибу- та SX. St (какое бы оно ни было), а значение атрибута Pt в кортеже SPXравно 'Р2'.
Каждая ссылка на переменную SPX в этом примере является связанной. Единственная ссылка на переменную SX свободна.
Формально квантор существования EXISTS определяется как повторение операции OR (ИЛИ). Другими словами, если г — это отношение с кортежами tl, t2, ... , tm, V — это переменная кортежа, изменяющаяся на данном отношении, и p(V) — это формула WFF, в которой переменная V используется как свободная переменная, то формула WFF вида
EXISTS V ( р ( V ) )
равносильна следующей формуле WFF. false OR р ( tl ) OR ... OR p { tm )
В частности, обратите внимание, что если отношение R пустое (т.е. т=0), то результа- том вычисления данного выражения будет значение ложь.
Рассмотрим в качестве примера отношение г, содержащее следующие кортежи.
( 1, 2, 3 ) ( 1, 2, 4 ) ( 1, 3, 4 )
Для простоты предположим, что три атрибута, идущие по порядку слева направо, имеют имена А, В и С соответственно и каждый из этих атрибутов имеет тип INTEGER. То- гда приведенные ниже выражения будут иметь указанные значения.
EXISTS V ( V.C > 1 ) ; true
EXISTS V ( V.B > 3 ) : false
EXISTS V ( V.A > 1 OR V.C = 4 ) : true
Теперь рассмотрим квантор общности FORALL, для чего вернемся к соответствующе- му примеру из предыдущего раздела.
FORALL РХ ( РХ.COLOR = COLOR ( 'Red' ) )
Эта формула WFF может быть прочитана следующим образом.
В текущем значении переменной-отношения Р для всех кортежей (скажем, РХ) значение их атрибута COLOR равно 'Red'.
Обе ссылки на переменную РХ в этом примере связаны.
Подобно тому, как квантор EXISTS был определен как повторение операции OR, кван- тор существования FORALL определяется как повторяющаяся операция AND (И). Други- ми словами, если обозначения г, V и p(V) имеют тот же смысл, что и в приведенном вы- ше определении квантора EXISTS, то формула WFF вида
FORALL V { р ( V ) )
равносильна следующей формуле WFF.
true AND р ( tl ) AND ... AND р ( tm )
В частности, обратите внимание, что если отношение г пустое, то результатом вы- числения данного выражения будет значение истина.
В качестве примера рассмотрим отношение R, содержащее те же кортежи, что и в предыдущем примере. Тогда приведенные ниже выражения будут иметь указан- ные значения.
FORALL V ( V.A > 1 ) : false
FORALL V ( V.B > 1 ) : true
FORALL V ( V.A = 1 AND V.C > 2 ) : true
Замечание. Квантор FORALL включен в реляционное исчисление просто для удобства. Он не является необходимым, так как приведенное ниже тождество показывает, что лю- бая формула WFF, использующая квантор FORALL, всегда может быть заменена эквива- лентной формулой WFF, использующей квантор EXISTS.
FORALL V ( р ) s NOT EXISTS V ( NOT р )
(Проще говоря, выражение "все значения V, удовлетворяющие формуле р" — это то же самое, что и выражение "нет таких значений V, которые бы не удовлетворяли формуле р".) Например, утверждение (истинное)
Для любого целого х существует целое у, такое, что у > х
равносильно утверждению
Не существует целого х, такого, что не существует целого у, такого, что у > х
(Иначе говоря, не существует наибольшего целого числа.) Но обычно легче выразить подобное утверждение в терминах квантора FORALL, чем в терминах квантора EXISTS, с использованием двойного отрицания. Другими словами, на практике гораздо удобнее использовать оба квантора.
Еще раз о свободных и связанных переменных
Предположим, что переменная х изменяется на множестве всех целых чисел, и рас- смотрим следующую формулу WFF.
EXISTS х ( х > 3 )
Связанная переменная х в этой формуле WFF является своего рода фиктивной пере- менной. Она служит лишь для связи внутренних параметров выражения с внешним кван- тором. В формуле WFF просто утверждается, что существует целое число (скажем, х), которое больше 3. Следовательно, заметьте, значение этой формулы WFF осталось бы полностью неизменным, если бы все экземпляры х были заменены экземплярами некото- рой другой переменной (скажем, у). Другими словами, формула WFF EXISTS у (у > 3) семантически идентична формуле, приведенной ранее.
Теперь рассмотрим другую формулу WFF.
EXISTS х ( х > 3 ) AND х < О
Здесь имеется три ссылки на переменную х, обозначающие две различные перемен- ные. Первые две ссылки связаны и могли бы быть заменены ссылкой на другую пере- менную у без изменения общего смысла формулы. Третья ссылка на переменную х не может быть безболезненно изменена. Таким образом, из двух приведенных ниже формул WFF первая эквивалентна рассмотренной формуле, а вторая — нет.
EXISTS y(y>3)ANDx<0 EXISTS у ( у > 3 j AND у < О
Кроме того, обратите внимание, что окончательное значение первоначальной форму- лы WFF не может быть определено, если неизвестно значение свободной переменной х. В отличие от нее формула WFF, в которой все ссылки на переменные являются связан- ными, всегда однозначно имеет значение либо истина, либо ложь.
Дополнительная терминология. Формула WFF, в которой все переменные связаны, называется закрытой формулой WFF (фактически она является высказыванием). От- крытая формула WFF — это формула, которая не является закрытой, т.е. такая форму- ла, которая содержит по крайней мере одну ссылку на свободную переменную.
Реляционные операции
Параметр реляционная операция? не совсем уместен в контексте исчисления — бо- лее подходящим вариантом был бы параметр <реляционное определение>. Однако мы будем использовать именно первый вариант для согласованности с обозначениями в гла- ве 6. В качестве напоминания приводим следующий синтаксис.
реляционная операция>
::= <прототип кортежа> [ WHERE <логическое выражение> ]
<прототип кортежа>
::= <выражение кортежа>
Напоминаем также, что следующие синтаксические правила теперь несколько упрощены.
Во-первых, все ссылки на переменные кортежей в параметре <прототип кортежа> должны быть свободными в пределах значения этого параметра.
Во-вторых, ссылка на переменную кортежа в предложении WHERE может быть сво- бодной только в случае, если ссылка на эту же переменную (обязательно свобод- ная) присутствует в соответствующем значении параметра <прототип кортежа>.
Например, следующее выражение является допустимым значением параметра реляционная операция> ("Получить номера поставщиков, находящихся в Лондоне").
SX.Si WHERE SX.CITY = 'London'
Здесь ссылка на переменную SX в прототипе кортежа является свободной. Ссылка на переменную SX в предложении WHERE также является свободной, поскольку ссылка на ту же переменную (обязательно свободную) имеется и в значении параметра <прототип кортежа> этого выражения.
Замечание. Далее термин "прототип кортежа" будет употребляться без скобок.
Приведем другой пример ("Получить имена поставщиков детали с номером 'Р2'"; см. обсуждение квантора существования, которое приводилось выше).
SX.SNAME WHERE EXISTS SPX ( SPX.Si SX.Si AND
SPX.Pi = Pi ( 'P2' ) )
Здесь все ссылки на переменную SX являются свободными, тогда как все ссылки на переменную SPX (в предложении WHERE) являются связанными, как и должно быть, по- скольку на них нет ссылок в прототипе кортежа.
Интуитивно понятно, что результатом выполнения операции, заданной параметром реляционная операция>, будет отношение, содержащее все возможные значения кор- тежей, определяемых параметром <прототип кортежа>, для которых результат вычисле- ния логического выражения, заданного в предложении WHERE параметром <логическое выражениё>, принимает значение истина. (Если предложение WHERE опущено, это экви- валентно указанию выражения WHERE true.) Сделаем некоторые уточнения.
■ Прежде всего, прототип кортежа — это список разделенных запятыми элементов (возможно, заключенный в скобки), каждый элемент которого является либо ссылкой на атрибут кортежа (который может содержать предложение AS для вве- дения нового имени атрибута), либо просто именем переменной кортежа3. Тем не менее отметим следующее.
а) В этом контексте имя переменной кортежа чаще всего является сокращен- ным обозначением списка разделенных запятыми ссылок на атрибуты, по одной для каждого атрибута отношения, на котором задана данная пере- менная кортежа.
б) Ссылка на атрибут кортежа без предложения AS, в принципе, является сокра- щенным обозначением ссылки с предложением AS, в которой новое имя атри- бута совпадает со старым.
Следовательно, без потери общности прототип кортежа можно рассматривать как список, состоящий из разделенных запятыми ссылок на атрибуты в виде Vi.Ai AS Bj. Обратите внимание, что ссылки Vi- и Aj-e могут повторяться, тогда как ссылки В j-e должны быть разными.
Пусть VI, V2, ..., Vm будут различными переменными кортежей, упоминаемыми в прототипе кортежа, и пусть эти переменные будут определены на отношениях rl, г2, ..., rm соответственно. Примем, что гГ, г2', ..., rm' — это новые отношения, полученные после переименования атрибутов в предложении AS, и пусть г' — это декартово произведение отношений гГ, г2', rm'.
Пусть отношение г — это выборка из отношения г', удовлетворяющая формуле WFF в предложении WHERE.
Замечание. Здесь предполагается, что на предыдущем шаге были также пере- именованы атрибуты, упоминающиеся в предложении WHERE; в противном случае функция WFF в предложении WHERE может не иметь смысла. Как мы увидим в следующем разделе, в вопросе устранения неоднозначности предло- женный здесь конкретный синтаксис полагается не на это предположение, а на уточнения.
■ Конечное значение реляционной операции, заданной параметром <реля- ционное выражение>, определяется как проекция отношения г по всем задан- ным атрибутам Bj.
В следующем разделе приводится несколько примеров подобных выражений.