В большинстве примеров, приведенных в предыдущих главах этой книги, обрабатывались данные только из одной таблицы. Но в реальном мире такие ситуации случаются нечасто. Ограничения по эффективности обычно диктуют необходимость разбиения данных на множество таблиц и создания связей между ними, что позволяет сделать выборку данных более эффективной.
Поддержка создания связей играет значительную роль в обеспечении эффективности работы реляционной СУБД MySQL, позволяя не только эффективнее хранить информацию (устраняя избыточность и повторения), но и определять неизвестные взаимосвязи между различными сегментами данных.
Согласно концепциям ЯМД, в данной главе показано, каким образом можно использовать язык SQL для создания одновременных запросов к нескольким таблицам, для того чтобы комбинировать из них данные различными способами. Эти запросы к нескольким таблицам называются объединениями, т.к. они объединяют в себе две и более таблицы, приобретая при этом "репутацию" сложных и непонятных. Эта глава позволит вам убедиться в необоснованности такого мнения - объединение уже стало простым и довольно мощным инструментом. Эта глава научит вас всему тому, что нужно знать при их использовании в работе с СУБД MySQL.

Что такое объединение?
Объединение является одним из наиболее традиционных способов организации связи записей из различных таблиц. Устоявшееся общее мнение, что вследствие простоты MySQL и/или своих открытых корней приложение "плохо" работает с объединениями, является ошибочным. Это не так. MySQL поддерживает работу с объединениями с момента своего появления, а сейчас он поддерживает синтаксис SQL, соответствующий стандарту SQL2, что позволяет производить объединение записей самых различных таблиц.
Рассмотрим следующие две таблицы: таблицу categories, содержащую наименования рубрик,
Объединения
Как видно, между этими двумя таблицами существует связь - это поле cid, которое может использоваться для создания связи между темами новостей, и соответствующими им рубриками.
Теперь вы уже знаете, каким образом производить выборку всех записей в любой из этих таблиц. Для этого можно воспользоваться традиционным запросом SELECT *.
Объединения
Объединения
Добавив предложение WHERE, можно отфильтровать ненужные заголовки статей, оставив, например, только те, которые были опубликованы в 2003 году.
Объединения
Но что делать, если требуется получить более сложные данные: например, перечень только заголовков из рубрики "Current Affairs" или перечень спортивных заголовков за 2003 год? Адресованный только к одной таблице запрос не совсем подходит, т.к. данные по рубрикам и заголовкам статей хранятся в различных таблицах.
Однако, как было ранее замечено, между двумя таблицами есть связь - столбец cid, который имеется в обеих таблицах. Приравняв поле cid из таблицы categories и поле cid из таблицы topics в предложении WHERE запроса SELECT, можно создать объединение этих двух таблиц.
Объединения
Ну, вот и первое созданное вами объединение!
В этом случае предложение WHERE использовалось для создания связи между полями cid из обеих таблиц. Хотя это по-прежнему не совсем то, что вам требуется. Вам нужно отфильтровать только те заголовки, которые относятся к рубрике "Current Affairs". К счастью, тут нам опять может помочь предложение WHERE.
Объединения
Жизнь полна разочарований
При объединении нескольких таблиц, необходимо обеспечить однозначность ссылок на поля (возможно появление одноименных полей). Поэтому, когда в объединение попадают поля, которые есть в нескольких используемых запросом таблицах, имя поля необходимо предварять префиксом с именем таблицы (как это делается во многих примерах, приведенных в этой главе), поэтому MySQL должен точно "знать", о поле какой таблицы идет речь:
SELECT name FROM employees, departments WHERE employees.id = de-partments.eid; # плохо
SELECT employees.name FROM employees, departments WHERE employees, id = departments.eid; # хорошо
Предложение WHERE в предыдущем операторе SQL действовало на совместный ре­зультирующий набор двух таблиц, отфильтровывая только те записи, которые соответствуют указанному критерию.
А теперь перейдем ко второму вопросу. Как обстоят дела со списком всех заголовков
за 2003 год?
Объединения
Таким образом, использование явной связи между предыдущими таблицами позволяет SQL объединить их для создания сложного результирующего набора с последующей обработкой данных для получения только необходимой информации.