SQL: быстрое погружение - [20]

Шрифт
Интервал

Что такое соединение

Соединение (join) — это операция, которая объединяет поля двух или более таблиц реляционной базы данных. Рассмотрим очень простой пример использования таблицы invoices в базе данных sTunes. В предыдущих главах мы много работали с таблицей invoices, поэтому она хорошо нам знакома. На вкладке Browse Data (Просмотр данных) браузера SQL (рис. 62) видно, что таблица invoices состоит из девяти полей. Поле InvoiceId содержит идентификационный номер каждого счета. Поле CustomerId — идентификационный номер каждого клиента (которому выставлен счет). Таблица invoices также содержит поля с информацией о дате и сумме счета. Остальные поля в этой таблице предназначены для адреса плательщика.

Рис. 62

Допустим, отделу маркетинга компании sTunes необходимо более детально проанализировать клиентскую базу. В этом случае он запросит полный список имен клиентов (имя и фамилию) со всеми счетами, выставленными каждому клиенту. Как мы напишем такой запрос, используя только таблицу invoices? Нам не удастся ответить на этот вопрос, используя только один запрос и ранее полученные навыки. Таблица invoices не содержит имена клиентов. Однако таблица invoices содержит поле CustomerId. Чтобы отобразить список счетов с именами клиентов, которым выставлены данные счета, нам необходимы таблицы invoices и customers.

Мы видим, что таблица customers (рис. 63) содержит требуемую нам информацию — имена и фамилии всех клиентов компании sTunes. Данная таблица также содержит поле CustomerId. Если мы внимательно посмотрим на значки в таблице customers, то увидим, что рядом с полем CustomerId расположен небольшой значок ключа. В главе 1 мы говорили о том, что значок ключа — это символ первичного ключа, уникального поля идентификации для конкретной таблицы.

НАПОМИНАНИЕ

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

Рис. 63

Поскольку CustomerId — это первичный ключ таблицы customers, а таблица invoices содержит аналогичное поле с тем же именем, то эти два поля CustomerId — это связь, необходимая для одновременного доступа к обеим таблицам. Теперь у нас есть вся информация, необходимая для объединения этих двух таблиц и создания списка счетов с именами клиентов.

Рассмотрим пример использования операции соединения JOIN, объединяющей эти таблицы.

SELECT

*

FROM

invoices

INNER JOIN

customers

ON

invoices.CustomerId = customers.CustomerId

Примечание

В данном примере мы используем соединение, называемое INNER JOIN (внутреннее соединение). Далее мы рассмотрим несколько различных типов соединений. Каждое работает по своему правилу. На данный момент вам лишь необходимо знать, что соединения позволяют нам получать доступ к полям из разных таблиц.

Вам уже знакомы многие операторы данного запроса. Запрос начинается с SELECT, как и все наши предыдущие запросы. Мы используем символ *, чтобы получить все поля в таблице. Выберем все поля из таблицы invoices и объединим их со всеми полями в таблице customers. Ключевое слово ON используется в запросе для связи двух таблиц через поле CustomerId. Поскольку существует два варианта поля CustomerId (по одному в каждой таблице), нам нужно сообщить браузеру SQL, какой из вариантов использовать. Для этого существует специальная нотация (в форме tablename.FieldName). Устанавливаем равенство между полем CustomerId из таблицы invoices (записанное как invoices.CustomerId) и полем CustomerId из таблицы customers (customers.CustomerId). Результат показан на рис. 64.

Рис. 64

Примечание

Используя символ *, мы объединили девять полей таблицы invoices с тринадцатью полями таблицы customers. В результате получилось двадцать два поля. Для удобства печати мы убрали некоторые из этих полей, но мы можем просмотреть все двадцать два поля в браузере, используя горизонтальную полосу прокрутки на панели результатов на вкладке Execute SQL (Выполнить SQL-запрос).

Соединения и структура реляционной базы данных


Теперь проанализируем, что произойдет, если объединить таблицу invoices с таблицей customers. Рассмотрим поле InvoiceId из таблицы invoices результирующего набора данных (см. рис. 64). Мы увидим, что первые семь записей связаны с одним и тем же CustomerId. Это означает, что клиенту № 1 выставили все семь счетов. Если мы проанализируем часть результирующей таблицы customers, то увидим, что данного клиента зовут Lu

s Gon
alves. Один клиент связан со многими счетами. На языке реляционной базы данных (глава 1) мы можем сказать, что таблица customers имеет связь «один-ко-многим» с таблицей invoices. Клиенту с одним CustomerId могут выставить множество счетов (если он заказал несколько песен), но в таблице invoices сохранится один и тот же номер CustomerId. Еще один вариант описания этой связи — схема базы данных в виде ER-диаграммы (ER от Entity — Relationship, сущность — связь).

На рис. 65 графически представлены взаимосвязи между таблицей customers и таблицей invoices. В остальной части нашей базы данных мы обнаружим множество других первичных и внешних ключей, устанавливающих связь между разными таблицами. Понимание этой взаимосвязи — это и есть часть создания и использования соединений. Чтобы объединить таблицы вместе, мы должны уметь идентифицировать первичные и внешние ключи и понимать, какие поля нам необходимы.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


В работу с головой. Паттерны успеха от IT-специалиста

Не можете сосредоточиться на работе? Постоянно отвлекаетесь на проверку электронной почты, социальные сети и новостные ленты? Пора воспользоваться советами от ведущих IT-специалистов и погрузиться в работу с головой.Освойте один из самых ценных навыков – умение сосредоточиться на сложной задаче, не отвлекаясь на мелочи. Только так можно справиться со сложной информацией и добиться лучших результатов за минимальное время. Погружение в работу – это суперсила в нашей все более конкурентной экономике XXI века.


Чистый код. Создание, анализ и рефакторинг

Даже плохой программный код может работать. Однако если код не является «чистым», это всегда будет мешать развитию проекта и компании-разработчика, отнимая значительные ресурсы на его поддержку и «укрощение». Эта книга посвящена хорошему программированию. Она полна реальных примеров кода. Мы будем рассматривать код с различных направлений: сверху вниз, снизу вверх и даже изнутри. Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший. Книга состоит из трех частей.


Изучаем Python

Книга "Изучаем Python" - это ускоренный курс, который позволит вам сэкономить время и сразу начать писать работоспособные программы (игры, визуализации данных, веб-приложения и многое другое). Хотите стать программистом? В первой части книги вам предстоит узнать о базовых принципах программирования, познакомиться со списками, словарями, классами и циклами, вы научитесь создавать программы и тестировать код. Во второй части книги вы начнете использовать знания на практике, работая над тремя крупными проектами: создадите собственную "стрелялку" с нарастающей сложностью уровней, займетесь работой с большими наборами данных и освоите их визуализацию, и, наконец, создадите полноценное веб-приложение на базе Django, гарантирующее конфиденциальность пользовательской информации. Если вы решились разобраться в том что такое программирование, не нужно ждать.


Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих

Алгоритмы - это всего лишь пошаговые алгоритмы решения задач, и большинство таких задач уже были кем-то решены, протестированы и проверены. Можно, конечно, погрузится в глубокую философию гениального Кнута, изучить многостраничные фолианты с доказательствами и обоснованиями, но хотите ли вы тратить на это свое время? Откройте великолепно иллюстрированную книгу и вы сразу поймете, что алгоритмы - это просто. А грокать алгоритмы - это веселое и увлекательное занятие.