Теория и практика построения баз данных (1088289), страница 68
Текст из файла (страница 68)
Вложенный запрос не подойдет, поскольку требуемые результаты происходят из разных таблиц, а именно названия предметов хранятся в таблице ЗАПИСЬ, а имена студентов — в таблице СТУДЕНТ. Правильный ответ выдаст следующий запрос: 5ЕСЕСТ 015!)НОТ ЗАПИСЬ.НазваннеПреднета. СТУДЕНТ.
Курс ЕЙОМ ЗАПИСЬ. СТУДЕНТ ННЕЙЕ ЗАПИСЬ.НомерСтудента - СТУДЕНТ.ЛичныйНомер АНО СТУДЕНТ. Курс НОТ = 'АС' Стандарт А)ч)51 ВЯЖИ не поддерживает операцию внешнего соединения. Однако эта операция поддерживается многими СУБД. Здесь мы продемонстрируем использование одной из них. Предположим, нам нужен список студентов и названия предметов, на которые они записаны. Допустим, кроме того, что мы хотим получить сведения обо всех студентах, включая даже тех, кто не записан ни на один из предметов.
В М)сгозогг Ассезз этот результат можно получить с помощью следующего выражения; Операторы ЕХ)8Т8 и 1«ОТ ЕХ)8Т8 321 Обратите внимание на различия между Ассевв 5О1. и записью, принятой в стандарте А)ч 51. Условия соединения задаются с помощью ключевого слова ОН. Кроме ~ого, все выражения 5ЯЕ заканчиваются точкой с запятой.
Операторы ЕХ18Т8 и КОТ ЕХ!8Т8 ЕХ!5Т5 и НОТ ЕХ15Т5 («существует» и «не существует») — логические операторы, принимающие значение «истина» или «ложь», в зависимости от наличия илп от- сутствия строк, удовлетворяющих заданным условиям. Пусть, например, мы хо- тим узнать номера студентов, записанных более чем на один предмет; 5ЕСЕСТ 015Т!МСТ НомерСтудента ЕЙОМ ЗАПИСЬ А ННЕЙЕ ЕХ15Т5 15ЕСЕСТ* ЕЙОМ ЗАПИСЬ В ННЕЙЕ А.НомерСтудента = В.НомерСтудента АНО А.НазваннеПредмета НОТ = В.НазваннеПредмета) В этом примере как основной, так и вложенный запросы относятся к таблице ЗАПИСЬ. Во избежание неоднозначности этим двум вариантам использования таблицы ЗАПИСЬ присвоены различные имена.
В первом операторе ЕЙОИ таблице ЗАПИСЬ присвоено временное произвольное имя А, а во втором операторе ЕЙОИ— другое временное произвольное имя В Выражение во вложенном запросе означает следующее: следует найти две строки в таблице ЗАПИСЬ, имеющие один и тот же номер студента, но различные названия предметов. (Это означает, что студент записан более чем на один предмет,) Если такие две строки существуют, то оператор ЕХ!5Т5 будет иметь логиче- 322 Глава 9. Язык ВОС Изменение данных 323 ское значение «истица!и! в этом случае номер данного студента будет присутствовать в ответе.
В противном случае оператор ЕХ15Т5 будет иметь логическое значение «ложь», и номер данного стулента в результате фигурировать не будет. Можно рассматривать этот запрос и по-другому: представим себе две отдельные и идентичные копии таблицы ЗАПИСЬ. Назовем одну из копий А, а лругую В. Будем сравнивать каждую строку А с каждой строкой В. Сначала рассмотрим первую строку А и первую строку В.
Поскольку эти две строки идентичны, то и номер студента, и название предмета в них совпадают, поэтому атрибут Номер- Студента иэ данной строки не попадет в ответ. Теперь рассмотрим первую строку А и вторую строку В. Если номер студента один и тот же, а названия предметов различаются, данный помер студента будет отображен в результатах. В сущности, мы сравниваем первую строку таблицы ЗАПИСЬ со второй строкой этой же таблицы, В данных, представленных на рис. 9.2, ни номер студента, ни название предмета не совпадают.
Далее мы продолжаем сравнивать первую строку А с каждой строкой В. Если выполняются заданные нами условия, мы выводим номер студента. Когда будут пройдены все строки таблицы В, мы перейдем ко второй строке таблицы А и будем сравнивать ее с каждой строкой таблицы В Гна самом деле, когда мы рассматриваем и-ю строку таблицы А, то в таблице В необходимо рассмотреть только строки, номера которых больше и). Результатом этого запроса будет: Н Чтобы продемонстрировать использование ключевого слова НОТ ЕХ15Т5, предположим, что мы хотим узнать имена студентов, которые записаны на все предметы.
По-другому это можно выразить так; нам нужны имена таких студентов, для которых не существует предметов, на которые они не были бы записаны. Это делается с помощью следующего запроса: 5ЕСЕСТ СТУДЕНТ.Икя ГРОМ СТУДЕНТ ННЕРЕ МОТ ЕХ15Т5 (5ЕСЕСТ* ГРОМ ЗАПИСЬ ИНЕРЕ МОТ ЕХ15Т5 Г5ЕСЕСТ* ГРОМ ЗАНЯТИЯ ННЕРЕ ЗАНЯТИЯ.НазваниеПредмета = ЗАПИСЬ.НазваниеПредкега АМО ЗАПИСЬ.НояерСтудента - СТУДЕНТ ЛичнвйНомер)) Этот запрос состоит из трех частей. В нижней части ведется поиск предметов, на которые записан студент. Средняя часть определяет, есть лп такие предметы, на которые студент не записан. Если нет, то студент записан на все предметы, и его пмя отображается в результатах.
Этот запРос может оказаться сложным для понимания. Если у вас есть пр блемь! с этим пспольэуиге данные представленнь!е на рис 92 и следуите ипструк пням Для этих даннъ|х ответ состоит в том. что нет ни одного студента, который был бы записан на все предметы. Вь! можете попытаться изменить данные таким с об б а разом, чтобы какой-либо студент был записан на все предметы. Еще о н ще один спас уяснить себе суть этого запроса — попробовать представить о в !ез применения ключевого слова НОТ ЕХ15Т5.
Проблемы, с которыми вы при этом столкнетесь, помогут вам понять, почему оператор НОТ ЕХ15Т5 необходим. Изменение данных В 501. предусмотрены средства для изменения данных в таблицах путем вставки новых строк, удаления строк и модификации значений в существующих строках. МОЕ позволяет также менять структуру данных, хотя мы не будем затрагивать .!ту тему до глав 12 и 13. Вставка данных Строки можно вставлять в таблицы по одной или группами. Чтобы вставить одну строку, мы пишем следующее: !М5ЕРТ !МТО ЗАПИСЬ УАСОЕ5 !400, 'ВР445', 44) После ключевого слова 1М5ЕРТ1НТО указывается имя таблицы, а после ключевого слова ЧАСОЕ5 — вставляемые значения.
Если мы знаем не все данные !например, нач неизвестно значение атрибута Позиция), можно поступить следующим образом: !МЗЕРТ 1МТО ЗАПИСЬ (НокерСгудечта. НазваниеПредкета) УА! ОЕ5 (400. 'ВО445'. 44) АтРибУт ПарядкавыйНомер может быть добавлен позже. Обратите внимание, что в РезУльтате этого запроса поле Позиция в новой строке будет иметь нчлевое значение. Можно также копировагь группы строк из однои таблицы в другую. Пусть, например, нам нужно заполнить таблицу ТРЕТЬЕКУРСНИК, показанную на рнс.
9.1. )МЗЕРТ 1МТО ТРЕТЬЕКУРСНИК НАЕОЕ5 !5ЕСЕСТ ЛичпвйНокер. Икя, Специальность ГРОМ СТУДЕНТ ИНЕРЕ Курс = 'СЗ') Вложенный оператор 5ЕСЕСТ, как и все выражения 5ЕСЕСТ, описанные в предыдущих двух разделах, позволяет указывать строки для копирования. Это свойство предоставляет весьма широкие возможности. Вопросы ! группы 325 324 Глава 9. Язык ВСЗЕ ОРОАТЕ ЗЯПИСЬ 5ЕТ НазваниеПредиета = 'ВОББ4' ИНЕРЕ НазваниеПредиета - 'ВО445' АРБАТЕ ЗЯНЯТИЯ БЕТ НазваниеПредмета = 'В0564' ИНЕРЕ НазваниеПреднета = 'В0445' ОЕЕЕТЕ ГРОМ СТУДЕНТ ИНЕРЕ СТУДЕНТ.ЛичннйНомер = 100 Резюые ОРОЯТЕ ЗАПИСЬ БЕТ ПорядковыйНоиер = 44 ИНЕРЕ НоиерСтудента = 400 Вопросы ! группы Удаление данных Как и в случае вставки, строки можно удалять по одной или группами. Следую- тций пример удаляет строку с данными о студенте 100; Обратите внимание, что если студент 100 записан на какие-либо предметы, это удаление вызовет нарушение целостности, поскольку для строк таблицы ЗАПИСЬ, в которых НомерСтудента = 100, не будет соответствующей строки в таблице СТУДЕНТ.
Каким образом можно удалить группу строк, показывают следующие два примера. В них из таблицы ЗАПИСЬ удаляется информация о предметах, на которые записаны студенты, специализируютциеся на бухгалтерском учете, а из таблицы СТУДЕНТ удаляются данные обо всех таких студентах: ОЕЕЕТЕ ГРОМ ЗАПИСЬ ИНЕРЕ ЗЯПИСЬ.НонерСтудента 1Н (5ЕСЕСТ СТУДЕНТ.ЛичннйНомер ГРОМ СТУДЕНТ ИНЕРЕ СТУДЕНТ. Специальность = 'Бухгалтерский учет') ОЕЕЕТЕ ГРОМ СТУДЕНТ ИНЕРЕ СТУДЕНТ.
Специальность .= 'Бухгалтерский учет' Порядок выполнения этих операций имеет значение: если бы оп был обратныл<, ни одна строка из таблицы ЗАПИСЬ не была бы удалена, <<отому что соответствующие строки из таблицы СТУДЕНТ оказались бы уже удаленными. Модификация данных Строки можно также модифицировать — по одной или группами.
Для изменения значения столбца предназначены ключевые слова ОРОАТЕ и 5ЕТ. После 5ЕТ указы- вается имя столбца, значение в котором требуется изменить, а затем новое значе- ние либо способ его вычисления. Рассмотрим два примера: ОРОЯТЕ ЗЯПИСЬ БЕТ ПорядковнйНомер = МЯХ1Порядковь<йНонер) + 1 ИНЕРЕ НомерСтудента - 400 Во втором операторе ОРОАТЕ значение столбца вычисляется с помощью встроенной функции МАХ.