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

Допустим, отделу маркетинга компании 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, то увидим, что данного клиента зовут Lus Gonalves. Один клиент связан со многими счетами. На языке реляционной базы данных (глава 1) мы можем сказать, что таблица customers имеет связь «один-ко-многим» с таблицей invoices. Клиенту с одним CustomerId могут выставить множество счетов (если он заказал несколько песен), но в таблице invoices сохранится один и тот же номер CustomerId. Еще один вариант описания этой связи — схема базы данных в виде ER-диаграммы (ER от Entity — Relationship, сущность — связь).

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

Если бы таблица invoices содержала поле, включающее все имена клиентов, то в соединении таблиц не было бы необходимости. Также вместо базы данных с тринадцатью таблицами можно было бы создать одну гигантскую таблицу, содержащую все поля.

Вопрос. Зачем в базах данных нужно иметь несколько таблиц?

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

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

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

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

Чед Фаулер

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

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

1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

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

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

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

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

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