Главная страница
Навигация по странице:

  • Примечание.

  • Задания. Запишите перечисленные ниже запросы, относящиеся к БД «Компьютеры».

  • Базы данных. Лекции БД. Лекция 5 Основные понятия информационных систем 5 История развития компьютеризации информационных процессов и систем. 5


    Скачать 1.07 Mb.
    НазваниеЛекция 5 Основные понятия информационных систем 5 История развития компьютеризации информационных процессов и систем. 5
    АнкорБазы данных
    Дата05.01.2022
    Размер1.07 Mb.
    Формат файлаdoc
    Имя файлаЛекции БД.doc
    ТипЛекция
    #324711
    страница13 из 24
    1   ...   9   10   11   12   13   14   15   16   ...   24

    Лекция 10.

    8.6.8.Предикаты


    Напомним, что предикаты представляют собой выражения, принимающие одно из значений TRUE, FALSE или UNKNOWN. Предикаты используют операторы сравнения и/или SQL-операторы с предикатами утверждения (IN, EXISTS и др.), относящиеся к значениям. Предикаты могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов AND, OR или NOT. Кроме того, в этих комбинациях может использоваться SQL-оператор IS, а также разные сочетания круглых скобок для определения порядка выполнения операций. Предикаты используются в предложениях WHERE и HAVING оператора SELECT и подзапросах для выделения строк или групп при выполнении групповых операций (агрегирования), а также в ограничениях при определении, будут ли они нарушены. Кроме того, предикаты применяются в операторах UPDATE и DELETE при определении строк, для которых они должны выполняться.

    Предикат в языке SQL может принимать одно из трех значений: TRUE, FALSE, UNKNOWN. Исключение составляют следующие предикаты: NULL, EXISTS (существования), UNIQUE (уникальности) и MATCH (совпадения).

    Рассмотрим, как ведут себя операторы при комбинировании всех трех истинностных значений. Следующие правила легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 (где то между истинным и ложным).

    • AND с двумя истинностными значениями дает минимум от значений.

    • OR с двумя истинностными значениями дает максимум от этих значений.

    • Отрицание истинностного значения равно 1 минус данное истинностное значение.


    Результаты этих трех логических операторов к девяти различным комбинациям истинностных значений операндов x и y представлены в таблице.

    x

    y

    x AND y

    x OR y

    NOT x

    TRUE

    TRUE

    TRUE

    TRUE

    FALSE

    TRUE

    UNKNOWN

    UNKNOWN

    TRUE

    FALSE

    TRUE

    FALSE

    FALSE

    TRUE

    FALSE

    UNKNOWN

    TRUE

    UNKNOWN

    TRUE

    UNKNOWN

    UNKNOWN

    UNKNOWN

    UNKNOWN

    UNKNOWN

    UNKNOWN

    UNKNOWN

    FALSE

    FALSE

    UNKNOWN

    UNKNOWN

    FALSE

    TRUE

    FALSE

    TRUE

    TRUE

    FALSE

    UNKNOWN

    FALSE

    UNKNOWN

    TRUE

    FALSE

    FALSE

    FALSE

    FALSE

    TRUE


    SQL-условия, стоящие в предложениях WHERE запросов типа select-from-where или в операциях DELETE, применяются к каждому кортежу некоторого отношения, и для каждого кортежа порождается одно из значений: TRUE, FALSE или UNKNOWN. Однако в ответ входят только те кортежи, для которых заданное условие имеет значение TRUE, а кортежи с UNKNOWN или FALSE из ответа исключаются.

    Примечание. Следует очень внимательно использовать трехзначную логику, поскольку она не допускает никаких непоределенностей. Рассмотрим, например, такой предикат:
    Х > 1 OR X <2
    Очевидно, что для любого целого Х значение предиката будет TRUE. Однако при Х равном NULL предикат примет значение UNKNOWN, так как каждый из двух его аргументов будет UNKNOWN, а UNKNOWN OR UNKNOWN равно UNKNOWN. Это один из аргументов против использования трехзначной логики.

    Выборка строк с помощью оператора SELECT (INSERT и UPDATE) осуществляется только, если предикат в предложении WHERE (HAVING) имеет значение TRUE. Однако условия ограничений удовлетворяются, если предикат принимает одно из двух значений – TRUE или UNKNOWN.
    8.6.8.1.Предикаты сравнения

    Предикат сравнения представляет собой два конструктора значений строки, соединяемые оператором сравнения. Имеется шесть традиционных оператора сравнения: =, >, <, >=, <=, <>.

    Каждый конструктор значений строки должен содержать одинаковое количество значений. Сами значения должны быть размещены в таком порядке, чтобы соответствующие значения другой строки имели совместимые типы данных. Если одно или оба значений такой пары равны NULL, результат их сравнения будет UNKNOWN.

    Данные типа NUMERIC (числа) сравниваются в соответствии с их алгебраическим значением. Данные типа CHARACTER STRING сравниваются в соответствии с их последовательностью. Если а1, а2,…, аnи в1, в2,…, вn - две строки, то первая «меньше» второй, если а1 < в1, или а1 = в1 и а2 < в2 и т.д. Считается также, что а1, а2,…, аn< в1, в2,…, вm, если n < m и а1, а2,…, аm= в1, в2,…, вm, т.е. если первая строка является префиксом второй. Например, ‘fodder’ < ‘foo’, т.к. первые две буквы этих строк совпадают, а третья буква строки fodder предшествует третьей букве строки foo. Верно также, что ‘bar’ < ‘bargain’, поскольку первая строка является префиксом второй.

    Данные типа DATETIME сравниваются в хронологическом порядке. Данные типа INTERVAL, прежде всего преобразуются в соответствующие типы (соответствующие поля и значения), а затем сравниваются как обычные числовые значения типа NUMERIC.

    При сравнении строк используются следующие правила. Пусть первый конструктор строки обозначается КС1, а второй КС2, тогда:

    Если все соответствующие значения эквивалентны, то КС1 = КС2.

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

    Результат КС1 <> КС2 равен TRUE, если соответствующие не равные NULL значения имеют какие-либо различия.

    Результат КС1 <> КС2 равен FALSE, тогда и только тогда, когда КС1 = КС2 равно TRUE.

    Результат КС1 = КС2 равен FALSE, тогда и только тогда, когда КС1 <> КС2 равно TRUE.

    Если результат КС1 > КС2 или КС1 = КС2 равен TRUE, то и результат КС1 >=КС2 равен TRUE.

    Если результат КС1 < КС2 или КС1 = КС2 равен TRUE, то и результат КС1 <=КС2 равен TRUE.

    Результат КС1 < КС2 равен FALSE, тогда и только тогда, когда КС1 >= КС2 равно TRUE.

    Результат КС1 > КС2 равен FALSE, тогда и только тогда, когда КС1 <= КС2 равно TRUE.

    Результат КС1 <= КС2 равен FALSE, тогда и только тогда, когда КС1 > КС2 равно TRUE.

    Результат КС1 >= КС2 равен FALSE, тогда и только тогда, когда КС1 < КС2 равно TRUE.

    Во всех других случаях истинностное значение сравнения равно UNKNOWN.
    Правила сравнения кажутся бесспорными, однако при использовании трехзначной логики получаемый результат не всегда очевиден. Например, если КС1 отличается от КС2 наличием в одном из них значений NULL, то результат КС1=КС2 никогда не будет иметь значение ни TRUE, ни FALSE. Он всегда будет иметь значение UNRNOWN, как и для КС1 <> КС2. Такой результат будет получен, даже если оба конструктора значений строки имеют NULL только в соответствующих значениях (результат NULL =NULL равен UNKNOWN). В качестве примера рассмотрим три строки, построенные на базе алфавитной сортирующей последовательности. Значение первого предиката сравнения будет TRUE, второго – FALSE, а третьего – UNKNOWN.

    (‘bat’, ‘raven’) >= (‘bat’, ‘cat’)

    (‘bat’, ‘beat’) >= (‘bet’, NULL)

    (‘bat’, NULL) >= (‘bat’, ‘man’)
    8.6.8.2.Предикат BETWEEN

    ПредикатBETWEEN::=

    Конструктор значений строки [NOT] BETWEEN

    Конструктор значений строки AND

    Конструктор значений строки
    Предикат BETWEEN проверяет, попадают ли значения первого конструктора значений строки в область, определенную для другого. Как и для предиката сравнения, конструкторы значений строки должны иметь одинаковое количество значений и соответствующие значения должны быть совместимы.

    Предикат
    КС1 BETWEEN КС2 AND КС3

    равносилен предикату

    КС1 >= КС2 AND КС1 <= КС3
    А предикат

    КС1 NOT BETWEEN КС2 AND КС3

    равносилен предикату
    NOT (КС1 BETWEEN КС2 AND КС3)
    Если значение предиката КС1 BETWEEN КС2 AND КС3 равно TRUE, в общем случае это отнюдь не означает, что значение предиката КС1 BETWEEN КС3 AND КС2 тоже будет TRUE, так как первый можно интерпретировать как предикат

    КС1 >= КС2 AND КС1 <= КС3

    а второй как

    КС1 >= КС3 AND КС1 <= КС2
    Оба этих предиката имеют значение TRUE только тогда, когда значения КС1, КС2 и КС3 эквивалентны.

    В приведенных ниже примерах первый предикат будет иметь значение TRUE, второй – FALSE, а третий – UNKNOWN.

    (4,6) BETWEEN (3,9) AND (5,NULL)

    (4,6) BETWEEN (5,3) AND (NULL,9)

    (4,6) BETWEEN (3,9) AND (NULL,5)
    8.6.8.3.Предикат IN

    Предикат IN::=

    Конструктор значений строки [NOT] IN табличный подзапрос

    | (выражение для вычисления значения.,..)
    Предикат IN определяет, будут ли значения конструктора строки обнаружены в наборе значений, который либо определен, либо получен с помощью табличного подзапроса. Табличный подзапрос обычно указывает на оператор SELECT, который создает одну или несколько строк для одного или нескольких столбцов, т.е. на обычную таблицу. Если целевой объект эквивалентен хотя бы одной из указанных строк, истинностное значение предиката IN будет равно TRUE. Если для каждой указанной строки Х целевой объект <> X, истинностное значение будет равно FALSE. Если подзапрос выполняется, и результат не содержит ни одной строки (пустая таблица), предикат принимает значение FALSE. Когда не соблюдается ни одно из упомянутых выше условий, значение предиката равно UNKNOWN.

    Например, первый из приведенных ниже предикатов будет иметь значение TRUE, второй FALSE, а третий – UNKNOWN.
    (4,6) IN (3,9), (5, NULL), (4,6)

    (4,6) IN (3,9), (5, NULL), (3,6)

    (4,6) IN (3,9), (5, 0), (NULL ,6)

    8.6.8.4.Предикат LIKE

    Предикат LIKE::=

    Выражение для вычисления значения строки

    [NOT] LIKE Выражение для вычисления значения строки

    [ESCAPE символ]
    Предикат LIKE ищет строку для подстрок, совпадающих с указанной целевой строкой. Поиск первого выражения для вычисления значения строки, называемого проверяемым значением, осуществляется в подстроке, которая определена во втором выражении для вычисления значения строки, называемом образцом или шаблоном. Допускается использование дополнительно предложения ESCAPE, позволяющего определить управляющий символ. Все три выражения должны быть совместимы с определениями типов данных. В образце разрешается использовать два трафаретных символа:

    Символ подчеркивания (_), который можно использовать вместо любого единичного символа в проверяемом значении.

    Символ процента (%), который заменяет набор любых символов (число символов в наборе может быть от 0 и более) в проверяемом значении.

    Если необходимо найти любой из этих символов как литерал, следует определить управляющий символ в предложении ESCAPE. Если трафаретный символ присутствует в образце и должен интерпретироваться как литерал, то он должен быть продублирован (два подчеркивания или два знака процента).

    Например:
    S LIKE ‘x%%x%’ ESCAPE ‘x’
    определяет х управляющим символом в шаблоне x%%x%. Последовательность х% считается единственным %, значит, такой шаблон совпадает с любой строкой, которая начинается и заканчивается символом %.

    Истинностное значение предиката LIKE присваивается в соответствии со следующими правилами:

    Если либо проверяемое значение, либо образец, либо управляющий символ равен NULL, истинностное значение равно UNKNOWN.

    В противном случае, если проверяемое значение и образец имеют нулевую длину, истинностное значение равно TRUE.

    В противном случае, если проверяемое значение может быть разбито на несколько сегментов, каждый из которых эквивалентен строке в образце (согласно определению предиката сравнения), то предикат LIKE равен TRUE. Если эти сегменты могут быть представлены в образце с помощью трафаретных символов и сегменты с трафаретными символами расположены в образце и в проверяемом значении в одинаковой последовательности, то предикат LIKE тоже равен TRUE.

    Если не соблюдается ни одно из перечисленных выше условий, предикат LIKE равен FALSE.
    Если образец не полностью отражает проверяемое значение, а является всего лишь подстрокой, то для правильного сопоставления с другими символами проверяемого значения необходимо в начале или в конце строки образца поместить знак процента. Автоматически такая вставка не делается. Если знак процента отсутствует, то две строки, эквивалентные согласно определению предиката сравнения, могут оказаться не подобны согласно правилам предиката LIKE. Причина состоит в том, что сравнения автоматически дополняет пробелами более короткую строку, а предикат подобия(LIKE) не будет выравнивать концевые пробелы, если в строке нет концевого трафаретного символа процента.

    В приведенных ниже примерах первый предикат LIKE будет иметь значение TRUE, второй FALSE, а третий – UNKNOWN.
    ‘Sherwood_Forest’ LIKE ‘%wood|_For%’ ESCAPE ‘|’

    ‘Sherwood_Forest’ LIKE ‘wood|_Forest’ ESCAPE ‘|’

    ‘Sherwood_Forest’ LIKE ‘%wood|_For%’ ESCAPE NULL
    8.6.8.5.Предикат NULL

    Предикат NULL ::=

    Конструктор значений строки IS [NOT] NULL
    Предикат NULL разработан специально для определения наличия значений NULL. Поэтому он никогда не принимает значение UNKNOWN. Если все значения в конструкторе значений строки равны NULL, предикат IS NULL принимает значение TRUE. Если ни одно из значений не равно NULL, предикат IS NOT NULL принимает значение TRUE. Заметим, что предикат IS NOT NULL не обязательно будет иметь такое же значение, как предикат NOT (IS NULL) (за исключением значения, когда конструктор значений строки содержит всего одно значение). Например, первый из приведенных ниже предикатов равен TRUE, а два последующих – FALSE.
    (NULL, NULL) IS NULL

    (NULL, 5) IS NULL

    (NULL, 5) IS NOT NULL
    8.6.8.6.Предикат количественного сравнения

    предикат количественного сравнения::=


    конструктор значений строки

    операция сравнения {ANY | ALL | SOME}

    табличный подзапрос
    Конструктор значений строки сравнивается с каждой строкой подзапроса отдельно. Результатом сравнения является одно значение, отображающее результат всех операций сравнения, которые были выполнены в данном предикате (все ли истинностные значения сравнения были TRUE, некоторые из них или ни одно из них). Как и в предикате сравнения КС и выходные столбцы подзапроса должны иметь одинаковое число значений, и эти значения должны быть совместимы по типам данных.

    Кванторы ANY и SOME являются синонимами. Результат выполнения предиката определяется согласно следующим правилам:

    Если определен параметр ALL или SOME и все результаты сравнения КС и каждой строки, полученной из подзапроса, являются TRUE, истинностное значение равно TRUE.

    Если результат выполнения подзапроса не содержит строк и определен параметр ALL, результат равен TRUE. Если же определен параметр SOME, результат равен FALSE.

    Если определен параметр ALL и результат сравнения КС хотя бы с одной строкой, полученной из подзапроса, является FALSE, истинностное значение равно FALSE.

    Если определен параметр SOME и хотя бы один результат сравнения КС и строк, полученных из подзапроса, является TRUE, истинностное значение равно TRUE.

    Если определен параметр SOME и каждое сравнение КС и строки, полученной из подзапроса, равно FALSE, истинностное значение тоже равно FALSE.

    В любом другом случае, не включенном в приведенный список, результат будет равен UNKNOWN.
    В нижеприведенных примерах показаны строки, полученные из подзапроса, а не сам подзапрос, для большей наглядности.

    Из приведенных ниже предикатов SOME первый будет иметь значение TRUE, второй - FALSE, а третий – UNKNOWN.
    (2100.00,97) > ANY

    (2500.00,99

    18000.00, NULL

    2000.00,118)
    (2100.00,97) = SOME

    (2500.00,97

    2200.00, NULL

    2000.00,118)
    (NULL,NULL) = SOME

    (2500.00,99

    NULL, NULL

    2000.00, NULL)
    Из приведенных ниже предикатов ALL первый будет иметь значение TRUE, второй - FALSE, а третий – UNKNOWN.
    (2000.00,97) > ALL

    (2500.00,97

    1800.00, NULL

    2000.00,118)
    (2100.00,97) <> ALL

    (2100.00,77

    2100.00, 97

    NULL,97)
    (2100.00,97) = ALL

    (2100.00,97

    2100.00, NULL

    2100.00,97)
    8.6.8.7.Предикат EXISTS (существования)

    Предикат EXISTS::= EXISTS табличный подзапрос
    Предикат EXISTS принимает значение TRUE, если подзапрос содержит любое количество строк, иначе его значение равно FALSE. Этот предикат никогда не принимает значение UNKNOWN.

    Обычно предикат EXISTS используется в зависимых подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен по-разному оцениваться для каждой строки запроса-контейнера, поэтому предикат EXISTS может иметь разные значения для каждой такой строки.

    Так как предикат EXISTS использует связанные подзапросы, для понимания примеров приведены полные запросы, а не отдельные предикаты EXISTS. Данный запрос находит все строки, имена которых присутствуют в некоторых других строках (одной и той же таблицы):
    SELECT *

    FROM Clients outer

    WHERE EXISTS

    (SELECT *

    FROM Clients inner

    WHERE inner.name=outer.name

    AND inner.ID_NUM<>outer.ID_NUM);
    Предикат inner.ID_NUMM <> outer.ID_NUM необходим, чтобы избежать сравнения каждой выбранной строки с самой собой. Если таблица Clients содержит уникальные имена клиентов, то выходных данных в результате этого запроса получено не будет.
    8.6.8.8.Предикат UNIQUE (уникальности)

    Предикат UNIQUE::=

    UNIQUE табличный подзапрос

    Предикат уникальности служит для проверки, будут ли содержаться в выходных данных подзапроса одинаковые строки. Этот предикат принимает значение либо TRUE, либо FALSE. Все строки подзапроса сравниваются согласно предикату сравнения. Если для любой комбинации строк подзапроса такой предикат имеет значение TRUE, то предикат UNIQUE равен FALSE, в противном случае он равен TRUE. Если в строке присутствуют значения NULL, они автоматически считаются уникальными.

    Строки в приведенных примерах получены в результате подзапроса и сами не являются подзапросом. Значение первого предиката равно TRUE, а второго – FALSE.
    UNIQUE (3,7,NULL

    3,7,NULL

    3,7,9)
    UNIQUE (3,7,NULL

    3,7,9

    3,7,9)

    8.6.8.9.Предикат MATCH (совпадения)

    Предикат MATCH::=

    Конструктор значений строки MATCH [UNIQUE]

    [PARTIAL | FULL] табличный подзапрос
    Предикат MATCH проверяет, будет ли значение конструктора строк совпадать со значением любой строки, полученной в результате подзапроса. От предиката IN данный подзапрос отличается тем, что позволяет обрабатывать «частичные» совпадения (partial), которые могут встречаться среди строк, имеющих часть значений равных NULL. Такие совпадения игнорируются при выполнении предиката IN или эквивалентного ему “= ANY”. Параметра по умолчанию нет, поэтому необходимо его указывать самостоятельно.

    Если задан параметр PARTIAL:

    Если все значения КС равны NULL, предикат MATCH равен TRUE.

    В противном случае, если не указан параметр UNIQUE и существует хотя бы одна строка подзапроса, содержащая все соответствующие значения КС не равные NULL, предикат MATCH равен TRUE.

    В противном случае, если указан параметр UNIQUE и существует только одна строка подзапроса, которая совпадает с соответствующими значениями КС не равными NULL, предикат MATCH равен TRUE.

    В противном случен предикат MATCH равен FALSE.
    Строки в приведенных примерах получены в результате подзапроса и сами не являются подзапросом. Значение первого предиката равно TRUE, а второго – FALSE.
    (34,NULL,99) MATCH UNIQUE PARTIAL

    (34,87,96

    34,87,99

    NULL,87,96)
    (34,NULL,99) MATCH UNIQUE PARTIAL

    (34,45,99

    34,87,99

    NULL,87,96)
    Использование FULL подчиняется тем же правилам, за исключением случая, когда часть значений КС равна NULL, так как тогда не может быть никакого совпадения.
    Значение первого предиката равно TRUE, а второго – FALSE.
    (NULL,NULL, NULL) MATCH UNIQUE FULL

    (NULL,88,99

    34,88,99

    34,88,99)
    (34,88,99) MATCH UNIQUE FULL

    (34,88,99

    34,99,88

    34,NULL,88

    34,88,99)
    Если не указан ни один из параметров ( ни PARTIAL, ни FULL), действуют следующие правила:

    Если значения КС, все или часть их, равны NULL, предикат MATCH равен TRUE.

    В противном случае, если не указан параметр UNIQUE и существует хотя бы одна строка подзапроса, эквивалентная КС, предикат MATCH равен TRUE.

    В противном случае, если указан параметр UNIQUE и существует только одна строка подзапроса, эквивалентная КС, предикат MATCH равен TRUE.

    В противном случае предикат MATCH равен FALSE.
    Значение первого предиката равно TRUE, а второго – FALSE.
    (34,NULL,99) MATCH

    (34,87,96

    34,87,103

    NULL,87,34)
    (34,88,99) MATCH UNIQUE

    (34,88,99

    NULL,88,99

    34,99,88

    34,88,99)
    8.6.8.10.Новые предикаты в SQL3

    В дополнение к предикату LIKE, обеспечивающему поиск через символьные строки, был добавлен предикат SIMILAR. Он предоставляет новые возможности операций над текстами, а именно, в образцах сопоставления можно использовать регулярные выражения в стиле UNIX.

    Например:
    WHERE NAME SIMILAR TO

    ‘ (SQL- (86 | 89 | 92 | 99)) | (SQL (1 | 2 |3))’
    Этот предикат произвел бы сопоставление образца с различными названиями, присваивавшимися когда-либо стандарту SQL.

    Другой новый предикат – DISTINCT очень похож по своему действию на обычный предикат UNIQUE; важным отличием является то, что два неопределенных значения считаются неравными одно другому и поэтому удовлетворяют предикату UNIQUE, но это желательно не для всех приложений. Предикат DISTINCT рассматривает два неопределенных значения как неотличающиеся одно от другого (хотя, конечно, они не являются равными и в то же время не являются неравными), и поэтому два неопределенных значения не удовлетворяют предикату DISTINCT.
    Задания. Запишите перечисленные ниже запросы, относящиеся к БД «Компьютеры».

    Найдите номер модели, скорость и размер жесткого диска для всех ПК стоимостью менее 1000 дол.

    Выполните запрос (1), но при этом переименуйте столбец speed в megahertz, а столбец hd в gigabytes.

    Найдите производителей принтеров.

    Найдите номер модели, объем памяти и размеры экранов ПК-блокнотов, цена которых превышает 1400 дол.

    Найдите все кортежи отношения Printer для цветных принтеров. Не забывайте, что color – булевозначный атрибут.

    Найдите номера моделей, скорость и размер жесткого диска ПК, имеющих 40х и 50х CD и цену менее 1500 дол. При этом можно считать, что атрибут cd относится к типу строки.

    8.6.9.Запросы, содержащие более одного отношения


    Эффективность реляционной алгебры во многом определяется возможностью комбинирования отношений с помощью объединений, произведений, пересечений и разностей. В SQL применяется любая из этих операций. Теоретико-множественные операции объединения, пересечения и разности непосредственно включены в SQL, а сейчас мы рассмотрим, как применяются в запросах SQL объединения и пересечения.

    Простой способ соединения отношений в одном запросе – это перечисление их в пункте FROM. Тогда пункты SELECT и WHERE смогут ссылаться на любой атрибут этих отношений.

    Допустим, нужно узнать имя продюсера фильма «Звездные войны». Номер сертификата продюсера содержится в отношении «Фильмы», значит, его можно узнать с помощью простого запроса на этом отношении. Затем можно выполнить запрос на отношении «Продюсер» и получить имя человека, имеющего данный сертификат. Однако оба эти шага можно объединить в одном запросе:
    SELECT имя

    FROM фильмы, продюсер

    WHERE title=’Звездные войны’ AND Псерт# = серт#
    Уточнение атрибутов путем префиксирования отношения эффективно, когда запрос содержит комбинацию различных отношений. Однако иногда требуется запрос, содержащий несколько кортежей из одного и того же отношения. Можно повторить отношение Р необходимое число раз в предложении FROM, но при этом нужно обеспечить ссылки на каждое его вхождение. В SQL для каждого вхождения Р в пункт запроса FROM можно определить «псевдоним», который мы будем называть переменной кортежа. Атрибуты Р в предложениях SELECT и WHERE можно уточнить, указывая перед ним переменную кортежа и точку. Таким образом, переменная кортежа выполняет функцию другого имени отношения Р и при желании может быть использована вместо него.

    Пусть запрос из предыдущего примера касается кинозвезды и администратора, имеющих один и тот же адрес. Запрос, по существу, остается прежним, но теперь нужно выбирать кортежи только из отношения «Звезды». Итак,
    SELECT звезда1.имя, звезда2.имя

    FROM звезды AS звезда1, звезды AS звезда2

    WHERE звезда1.адрес=звезда2.адрес AND звезда1.имя < звезда2.имя
    Согласно второму условию предложения WHERE, т.е. звезда1.имя < звезда2.имя, имя первой кинозвезды предшествует имени второй по алфавиту. В отсутствие этого условия переменные звезда1 и звезда2 относились бы к одному и тому же кортежу. Адреса при этом тоже совпали бы, и в результате получились бы пары идентичных имен кинозвезд. Второе условие требует также формировать каждую пару кинозвезд только один раз в алфавитном порядке. При использовании оператора <> (не равно) можно получить пары кинозвезд, состоящих в браке.

    Еще один пример: получить все пары номеров поставщиков, таких, что оба поставщика в каждой паре размещаются в одном городе
    SELECT FIRST.S# AS SA, SECOND.S# AS SB

    FROM S AS FIRST, S AS SECOND

    WHERE FIRST.CITY = SECOND.CITY

    AND FIRST.S# < SECOND.S#;
    Обратите внимание в этом примере на явные переменные области значений FIRST и SECOND. В наших предыдущих примерах все переменные области значений были неявными. Также следует отметить, что вводимые имена столбцов SA и SB относятся к столбцам результирующей таблицы и потому не могут быть использованы в инструкции WHERE.
    1   ...   9   10   11   12   13   14   15   16   ...   24


    написать администратору сайта