- •Недоразумения относительно термина «ключ»
- •Индексы
- •Реализация реляционной базы данных
- •Описание структуры базы данных для субд
- •Распределение пространства на физических носителях
- •Интерфейс языка запросов и обновлений
- •Хранимые процедуры
- •Интерфейс прикладных программ
- •Реляционная алгебра
- •Реляционные операторы
- •Объединение
- •Проектирование
- •Выборка
- •Соединение
- •Внешнее соединение
- •Выражение запросов в терминах реляционной алгебры
- •1. Вывести имена всех студентов. Студент [Имя]
- •Гласс рассел рай
- •Глава 8. Основы построения реляционных баз данных
- •6. Вывести названия предметов, на которые записан студент Парке, и расписание занятий по этим предметам.
Проектирование
Проектирование (projection) — это операция, которая выделяет заданные атрибуты отношения. Результатом проектирования является новое отношение, содержащее выбранные атрибуты; иными словами, при проектировании из исходного отношения выбирается некоторое множество столбцов. В качестве примера рассмотрим отношение СТУДЕНТ из рис. 8.12, а. На рис. 8.14, а показана проекция этого отношения на атрибуты Имя и Специальность, которая обозначена СТУДЕНТ [Имя, Специальность]. На рис. 8.14, б показана проекция этого отношения на атрибуты Специальность и Курс, обозначенная СТУДЕНТ [Специальность, Курс].
Обратите внимание, что хотя отношение СТУДЕНТ имеет четыре кортежа, проекция СТУДЕНТ [Специальность, Курс] имеет только три. Один кортеж был исключен, поскольку после выполнения операции проектирования кортеж [ИСТОРИЯ, С1] оказался в результирующем отношении в двух экземплярах. Так как результат проектирования является отношением, а отношение не может иметь одинаковых кортежей, избыточный кортеж был исключен.
Проекцию можно также использовать для изменения порядка следования атрибутов в отношении. Например, проекция СТУДЕНТ [Курс, Специальность, Имя, ЛичныйНомер] меняет порядок атрибутов в отношении СТУДЕНТ на обратный (исходный порядок представлен на рис. 8.11). Иногда эта возможность позволяет сделать два отношения совместимыми по объединению.
Выборка
В то время как оператор проектирования выделяет вертикальное подмножество (столбцы) отношения, оператор выборки (selection) выделяет горизонтальное подмножество (строки). Проектирование указывает, какие атрибуты должны быть в новом отношении, а выборка указывает, какие строки должны в нем присутствовать. Обозначается выборка путем указания имени отношения, за которым следует ключевое слово WHERE («где»), за которым, в свою очередь, идет условие, накладываемое на атрибуты. На рис. 8.15, а представлена выборка СТУДЕНТ WHERE Специальность = 'МАТЕМАТИКА', а на рис. 8.15, б - СТУДЕНТ WHERE Курс = 'С1\
Соединение
Операция соединения (join) представляет собой комбинацию произведения, выборки и (возможно) проектирования. Соединение двух отношений А и В происходит следующим образом. Сначала формируется произведение А х В. Затем делается выборка, при которой исключаются некоторые кортежи (критерии отбора указываются в операторе соединения). После этого путем проектирования могут быть (при необходимости) исключены некоторые атрибуты.
Рассмотрим отношения СТУДЕНТ и ЗАПИСЬ, показанные на рис. 8.12. Предположим, мы хотим знать имя и номер каждого студента. Чтобы получить эти данные, нам нужно соединить кортежи отношения СТУДЕНТ с соответствующими кортежами отношения ЗАПИСЬ на основании атрибута НомерСтудента. Такое соединение мы обозначаем как СТУДЕНТ JOIN (ЛичныйНомер= НомерСтудента) ЗАПИСЬ . Эта запись означает: «Соединить кортеж отношения СТУДЕНТ с кортежем отношения ЗАПИСЬ, если значение атрибута ЛичныйНомер в отношении СТУДЕНТ равняется значению атрибута НомерСтудента в отношении ЗАПИСЬ».
Чтобы построить это соединение, мы сначала находим произведение отношений СТУДЕНТ и ЗАПИСЬ — результат этой операции представлен на рис. 8.13. Затем мы выбираем те кортежи произведения, где значение атрибута ЛичныйНомер из отношения СТУДЕНТ равно значению атрибута НомерСтудента из отношения ЗАПИСЬ (таких кортежей только три). Результат этой операции изображен на рис. 8.16, а. Заметьте, что у нас имеется два идентичных атрибута: СТУДЕНТ.ЛичныйНомер п ЗАПИСЬ.НомерСтудента. Один из них является лишним, и мы его исключаем путем проектирования (в данном случае мы выбираем ЗАПИСЬ.НомерСтудента).
Результатом является отношение на рис. 8.16, б. Соединение на рис. 8.16, а называется эквивалентным соединением (equijoin), а соединение на рис. 8.16, б — естественным соединением (natural join). Если не указано иного, то когда говорят о соединении, подразумевается естественное соединение.
Поскольку построение произведения двух больших отношений является длительной операцией, алгоритм, который использует СУБД для соединения двух отношений, отличается от того, который описан здесь. Результат, однако, остается тем же самым.
Можно выполнять соединение и по другим условиям, а не только по равенству. И качестве примеров можно привести соединения СТУДЕНТ JOIN (ЛичныйНомер* НомерСтудента) ЗАПИСЬ или СТУДЕНТ JOIN (ЛичныйНомер < НомерСотрудника) ППС. Результатом последнего соединения явится набор кортежей, в котором номера студентов меньше, чем номера сотрудников. Такая операция может иметь смысл, если, скажем, идентификаторы присваиваются людям в хронологическом порядке. В результирующем отношении будут представлены пары студент—преподаватель, в которых студент появился в учебном заведении раньше, чем преподаватель.
Есть одно важное ограничение на условия соединения: атрибуты, входящие в условие, должны относиться к одному и тому же домену, поэтому соединение вида СТУДЕНТ JOIN (Специальность = НазваниеПредмета) ЗАНЯТИЯ противоречит логике. Даже при том, что значения атрибутов Специальность и НазваниеПредмета имеют тип Char (10), они относятся к разным доменам. С семантической точки зрения такого рода соединение не имеет смысла. (К сожалению, многие реляционные СУБД допускают такие соединения.)