|
Программирование >> Руководство по sql
Этот процесс иллюстрирует рост реляционной базы данных: если возникает потребность в разбиении таблиц, с помощью объединения всегда можно перестроить строки, если же нужны новые таблицы, то с помощью того же объединения их можно связать с существующими данными. Например, в базе данных bookbiz для хранения информации о выписанных счетах может потребоваться таблица invoices. Ее можно связать с таблицами sales и salesdetails по столбцу sonum (номер накладной) и, может быть, с новой таблицей stores по столбцу storid. При проектировании структуры базы данных в таблицах нужно обязательно предусматривать столбцы, по которым впоследствии может выполняться объединение. Чаще всего для этих целей используются столбцы первичных или внешних ключей. Например, в нашей базе данных первичный ключ (titles.titleid) объединяется с соответствующими внешними ключами (salesdetails.titleid, titleauthors.titlejd и titleditors.title id). Без таких столбцов выполнение запросов ко многим таблицам будет существенно затруднено. ПРИМЕР ОБЪЕДИНЕНИЯ Для выполнения объединения, как минимум, нужно выполнить два действия. Поместить имя одной или нескольких таблиц в список предложения FROM. Добавить условия в предложение WHERE, на основе которых будет выполняться объединение по заданным столбцам. Для определения связи между столбцами, по которым будет выполняться объединение, можно использовать любые реляционные операторы (однако, чаще всего, применяется оператор равенства). Например, чтобы узнать, кто из редакторов живет недалеко от офиса издателя, нужно выполнить соответствующее объединение. В следующем запросе находятся имена редакторов, живущих в том же городе, в котором расположена компания Algodata Infosystems: SQL: select ed lname, ed id, editors.city, pub name, publishers.city from editors, publishers where editors.city = publishers.city and pub name = Algodata Infosystems Результат: ed lname ed id editors.city pub name publishers.city Kaspchek 943-88-7920 Berkeley Algodata Infosystems Berkeley DeLongue 321-55-8906 Berkeley Algodata Infosystems Berkeley В результате выполнения запроса на объединение находятся два редактора (DeLongue и Kaspchek), живущие в том же городе (Berkley), в котором расположена Algodata Infosystems. Первоначально эта информация нигде не фигурировала. Фактически, нам нужно было знать только имя издателя, а вся дополнительная информация была получена с помошью операции объединения. Мы просто сказали системе: Выполни объединение по городам и найди живущих в них редакторов . Проверка правильности объединения в реляционной теории объединение является проектированием и отображением произведения. Произведение (или декартово произведение (Cartesian product)) - это набор всевозможных комбинаций строк из двух таблиц. Сначала система находит все возможные комбинации строк из двух таблиц, затем устраняет из рассмотрения строки, не удовлетворяющие условиям проектирования (выбор столбцов) и отображения (выбор строк). Детали этой процедуры на самом деле достаточно сложны и зависят от конкретной реализации системы. (Более подробная информация содержится в разделе Как объединения обрабатываются системой в конце этой главы.) Запросы на объединение, в большей степени, чем другие запросы SQL, нуждаются в тшательной проверке, чтобы быть уверенными, что в результате их выполнения получается именно то, что вы хотите. Недостаточно конкретный запрос может вернуть результат, с которым придется долго возиться, чтобы извлечь из него действительно полезную информацию. КАК ПОЛУЧИТЬ ХОРОШЕЕ ОБЪЕДИНЕНИЕ Какой столбец лучше всего выбирать для объединения? Идеально для этого подходят ключевые столбцы таблицы - первичные или внешние. Если ключ является составным, то объединение можно выполнять по всем входящим в него столбцам. Так как первичный ключ логически связан с соответствующими внешними ключами других таблиц, то ключевые столбцы обычно наилучшим образом подходят для объединения. Такие объединения, скорее всего, будут полезными и логически оправданными, так как их в свое время планировал разработчик базы данных. Объединение на основе пары первичный ключ-внешний ключ подразумевает их совместимость, чтобы обеспечить целостность базы данных. Чтобы в результате объединения получались полноценные результаты, сравниваемые столбцы должны содержать аналогичные значения - значения, принадлежащие одному общему классу данных. Такие столбцы должны иметь одинаковые или близкие типы данных и сравнимые значения. Кроме типа, конечно, нужно учитывать и семантику. Например, можно выполнить объединение по столбцу с возрастом авторов (25, 30, 50) и столбцу qtyshipped из таблицы salesdetails, однако полученные результаты не будут представлять никакой ценности. Эти столбцы соответствуют друг другу по типу, но логически абсолютно не связаны. Столбцы, по которым выполняется объединение, не обязательно должны иметь одинаковые имена (хотя чаще всего именно так и бывает). Типы данных объединяемых столбцов должны быть совместимыми - система должна уметь преобразовывать их друг в друга. Например, такие преобразования могут выполняться между числовыми столбцами (типы integer, decimal, float) или между символьными столбцами (типы character, varchar, datetime). Другими словами, совместимыми являются как символьные, так и числовые типы. Кроме того, можно явно задать преобразование типов, используя для этого функции преобразования типов, описанные в главе 3. Объединения и нулевые значения Если в столбцах, по которым проводится объединение, имеются нулевые (NULL) значения, они пропускаются, так как нет никаких оснований считать одно неизвестное значение совпадающим с другим неизвестным значением. УЛУЧШЕНИЕ ЧИТАЕМОСТИ РЕЗУЛЬТАТОВ ОБЪЕДИНЕНИЯ При объединении таблиц система сравнивает данные в указанных полях и отображает результаты в виде таблицы, в которую входят строки, соответствующие каждому успешному объединению. При этом могут повторяться одни и те же значения. Так, в предыдущем примере в результатах дважды фигурировала компания Algodata Infosystem, хотя этот издатель только раз появляется в таблице publishers. Запрос на объединение не вносит никаких изменений в таблицы, а просто позволяет системе манипулировать с данными из разных таблиц так, как если бы они принадлежали одной таблице. Вам не нужно дважды указывать имя столбца объединения в списке выбора, кроме того, вы можете вообще не включать его в результаты для успешного выполнения запроса. Однако в списке выбора или в предложении WHERE вам может понадобиться описать принадлежность столбца таблице. Предыдущий пример можно переделать следующим образом: SQL: select ed lname from editors, publishers where editors.city = publishers.city and pub name = Algodata Infosystems Результат: ed Iname Kaspchek DeLongue Выбор столбцов для запросов на объединение Как и в любом другом операторе SELECT, столбцы, перечисляемые после ключевого слова SELECT в запросе на объединение, будут в указанном порядке включаться в результат. При использовании оператора SELECT * столбцы помещаются в результат в порядке их определения в операторе CREATE TABLE. Чтобы найти названия книг, связанные с заказом номер 1, необходимо объединить таблицы salesdetails и titles по столбцу title id: SQL: select * from titles, salesdetails where titles.title id = salesdetails.title id and sonum =1 Результат: title id title type pub id price PS2091 Is Anger the Enemy? Psychology 0736 10.95 продолжение advance ytd sales contract notes pubdate 2275 2045 1 Carefully researched study of the 15.06.85 effects of strong emotions on the body. Metabolic charts included. продолжение sonum qty ordered qty shipped title id date shipped 1 75 75 . PS2091 15.09.85 В результате получается таблица с одной строкой и пятнадцатью столбцами. Так как она по ширине не помещается на экране, система будет тем или иным способом размещать ее на нескольких строках, что будет создавать определенные трудности для понимания результатов. Поэтому мы рекомендуем вам очень аккуратно выбирать столбцы для объединения и с большой осторожностью пользоваться шаблонами (звездочками). Имена обеих таблиц должны указываться в списке таблиц. Порядок их следования при этом будет влиять на результат только при использовании в списке выбора оператора SELECT *. В списке таблиц должны перечисляться все участвующие в объединении таблицы. Вы можете объединить более двух таблиц, соответствующие примеры содержатся дальше в этой главе.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |