Читаем SQL: быстрое погружение полностью

При данном типе соединения будет отображаться все, что содержится в таблице invoices. Поскольку Customer 1 не заказывал песни, данная запись не указывается. Однако, как показано на рис. 72, мы объединяем все пять записей из таблицы invoices только с четырьмя записями из таблицы customers. Помните, что в таблице invoices записи для Customer 1 или Customer 5 отсутствуют, а клиенту Customer 2 было выставлено два счета. В отличие от внутреннего соединения, которое отображает равное количество записей из каждой таблицы, в результате использования левого внешнего соединения вернется больше записей из «левой» таблицы. Проанализируем результат данного запроса, чтобы понять работу браузера SQL.

Рис. 72

SQL-запрос для левого внешнего соединения аналогичен запросу, который мы использовали для внутреннего соединения. Отличие только в использовании условия LEFTOUTERJOIN.

SELECT

i. InvoiceId,

c. CustomerId,

c. Name,

c. Address,

i. InvoiceDate,

i. BillingAddress,

i. Total

FROM

invoices AS i

LEFT OUTER JOIN

customers AS c

ON

i. CustomerId = c.CustomerId

Рис. 73

Примечание

Слово «внешнее» (OUTER) необязательно.

Когда мы анализируем результаты, полученные при использовании левого соединения, мы видим, что браузер SQL добавил данные типа Null. Помните, что информация о Customer 6 в таблице customers отсутствует. Добавление данных типа Null показывает, как браузер SQL обрабатывает нашу попытку сопоставить пять записей из таблицы invoices только с четырьмя записями из таблицы customers. Использование левого соединения полезно, так как это позволяет нам видеть несовпадения в наших данных. Мы можем создавать списки клиентов, которым не выставляли счета, или выполнять поиск данных, которые были удалены в правой таблице, но все еще существуют в левой.

<p id="правое_внешнее_соединение_right_outer_jo">Правое внешнее соединение (RIGHT OUTER JOIN)</p>

Внимание

В SQLite не поддерживается использование правого внешнего соединения. Но мы эту тему рассмотрим, поскольку правое внешнее соединение по-прежнему популярно в других реализациях РСУБД. Позже мы рассмотрим обходной путь для применения правых соединений в SQLite.

В результате использования правого внешнего соединения RIGHT OUTER JOIN возвращаются все данные из правой таблицы, а также соответствующая информация из левой таблицы. Правое соединение — зеркальное отображение левого соединения.

Рис. 74

При использовании правого соединения берутся все поля из правой таблицы (customers) и ее данные сопоставляются с любыми соответствующими данными из таблицы invoices. Поскольку Customer 6 в таблице customers отсутствует, эта запись игнорируется.

Рис. 75

Оператор SQL, необходимый для создания правого соединения, такой же, как и в двух других соединениях, которые мы рассмотрели ранее.

Примечание

Ключевое слово «внешнее» (OUTER) необязательно. Вариант RIGHT JOIN дает тот же результат.

SELECT

i. InvoiceId,

c. CustomerId,

c. Name,

c. Address,

i. InvoiceDate,

i. BillingAddress,

i. Total

FROM

invoices AS i

RIGHT OUTER JOIN

customers AS c

ON

i. CustomerId = c.CustomerId

Рис. 76

В результате использования данного соединения вернулось наибольшее количество записей из трех изученных ранее соединений. Записей Customer 1 и Customer 5 нет в таблице invoices, поэтому им присвоены значения Null. Две записи из таблицы invoices относятся к Customer 2, поэтому в результате объединения данные Customer 2 были указаны дважды.

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

<p id="_9_xhtml_2523toc_marker_9_5"><strong>Внутренние соединения для случаев соединения двух и более таблиц</strong></p>

Можно соединять и более двух таблиц. Чтобы добавить дополнительные таблицы, нужно просто следовать тем же правилам, что мы рассмотрели ранее, когда рассказывали про внутренние соединения. Рассмотрим схему базы данных на рис. 77. Мы видим, что помимо связи между таблицами invoices и customers существует также связь между полем SupportRepId из таблицы customers и полем EmployeeId из таблицы employees.

Рис. 77

Перейти на страницу:

Все книги серии Библиотека программиста

Программист-фанатик
Программист-фанатик

В этой книге вы не найдете описания конкретных технологий, алгоритмов и языков программирования — ценность ее не в этом. Она представляет собой сборник практических советов и рекомендаций, касающихся ситуаций, с которыми порой сталкивается любой разработчик: отсутствие мотивации, выбор приоритетов, психология программирования, отношения с руководством и коллегами и многие другие. Подобные знания обычно приходят лишь в результате многолетнего опыта реальной работы. По большому счету перед вами — ярко и увлекательно написанное руководство, которое поможет быстро сделать карьеру в индустрии разработки ПО любому, кто поставил себе такую цель. Конечно, опытные программисты могут найти некоторые идеи автора достаточно очевидными, но и для таких найдутся темы, которые позволят пересмотреть устоявшиеся взгляды и выйти на новый уровень мастерства. Для тех же, кто только в самом начале своего пути как разработчика, чтение данной книги, несомненно, откроет широчайшие перспективы. Издательство выражает благодарность Шувалову А. В. и Курышеву А. И. за помощь в работе над книгой.

Чед Фаулер

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных