результате выполнения данного запроса мы видим, что возвращено только четыре записи. Invoice 5, Customer 1 и Customer 5 не указаны. Для Customer 2 отображаются две записи. Внутреннее соединение — это наиболее распространенный тип соединения. Оно используется для соединения соответствующих данных из разных таблиц реляционной базы данных. Примечание Слово «внутреннее» необязательно. Под всеми соединениями понимается внутренние соединение, если не указано иное. Другими словами, по умолчанию все соединения — внутренние.
Поскольку внутренние соединения возвращают только совпадающие данные, порядок перечисления таблиц не имеет значения. Порядок будет иметь значение для других типов соединений.
ванием символа *. Мы также можем представить, насколько сложнее было бы соединение, если бы нам пришлось вводить имя таблицы каждый раз, когда мы ссылаемся на имя поля. Примечание В большинстве случаев в условии SELECT рекомендуется указывать отдельные имена полей и избегать использования символа *. В этой главе мы будем использовать символ * только в демонстрационных целях для объяснения структуры JOIN
Кажется странным, что мы ссылаемся на псевдонимы (в условии SELECT), прежде чем определим их (в условиях FROM и INNER JOIN). Но следует помнить, что браузер SQL обрабатывает запросы не в той очередности, как их прочел бы человек.
необходим список с указанием имен клиентов и счетов, выставленных каждому клиенту. Когда в этой главе мы писали наше первое соединение, для выбора всех полей из каждой таблицы был использован символ *. Результатом данного запроса стал массивный набор результатов из двадцати двух полей. Однако нам требуются только имена клиентов и информация о счете. Также, когда мы используем символ *, мы не можем контролировать порядок отображения полей. Предположим, что руководству sTunes необходимо в списке клиентов сначала отображать фамилию. Чтобы определить порядок вывода, следует в операторе SELECT вместо символа * указать имена полей. Давайте создадим аналогичное приведенному выше соединение, но на этот раз в запросе укажем, что из таблицы customers необходимо отобразить поля LastName и FirstName, а из таблицы invoices — поля InvoiceId, CustomerId, InvoiceDate и Total. Поскольку мы работаем с двумя таблицами, содержащими отдельные поля с одинаковыми именами, в условии SELECT следует использовать
SELECT * FROM invoices AS i INNER JOIN customers AS c ON i.CustomerId = c.CustomerId Примечание Псевдонимы для соединений должны быть краткими и удобочитаемыми. Они, как правило, состоят из одной буквы, причем используется первая буква соответствующей таблицы (tablename.FieldName будет записано как t.FieldName). Далее в этой главе для имен таблиц мы будем использовать однобуквенные псевдонимы. Чтобы продемонстрировать необходимость использования псевдонимов при работе с соединениями, давайте рассмотрим наш первоначальный сценарий. Руководству sTunes необхо
Теперь, когда мы определили общую связь между двумя полями в таблице invoices и в таблице customers, стоит более внимательно разобрать, как писать запросы с соединениями.
множество счетов (если он заказал несколько песен), но в таблице invoices сохранится один и тот же номер CustomerId. Еще один вариант описания этой связи — схема базы данных в виде ER-диаграммы (ER от Entity — Relationship, сущность — связь). На рис. 65 графически представлены взаимосвязи между таблицей customers и таблицей invoices. В остальной части нашей базы данных мы обнаружим множество других первичных и внешних ключей, устанавливающих связь между разными таблицами. Понимание этой взаимосвязи — это и есть часть создания и использования соединений. Чтобы объединить таблицы вместе, мы должны уметь идентифицировать первичные и внешние ключи и понимать, какие поля нам необходимы. Если бы таблица invoices содержала поле, включающее все имена клиентов, то в соединении таблиц не было бы необходимости. Также вместо базы данных с тринадцатью таблицами можно было бы создать одну гигантскую таблицу, содержащую все поля.