В большинстве примеров, приведенных в предыдущих главах этой книги, обрабатывались данные только из одной таблицы. Но в реальном мире такие ситуации случаются нечасто. Ограничения по эффективности обычно диктуют необходимость разбиения данных на множество таблиц и создания связей между ними, что позволяет сделать выборку данных более эффективной.
Поддержка создания связей играет значительную роль в обеспечении эффективности работы реляционной СУБД 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 объединить их для создания сложного результирующего набора с последующей обработкой данных для получения только необходимой информации.
ТОП-10 популярных
Для работы с вещественными числами в MySQL предусмотрено три типа данных - это типы FLOAT, DOUBLE, DECIMAL. Числовой тип FLOAT...
БОЛЬШЕ БОЛЬШИХ LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Больше больших LCD-мониторов
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
Процесс вытеснения с рынка мониторов с электронно-лучевой трубкой (CRT) продолжается. О смещении акцентов в пользу LCD-мониторов теперь заявляют даже те...
НОУТБУК с блестящим экраном
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Eсли выпустившая ноутбук фирма предлагает его в качестве «замены настольному ПК», то это должно подразумевать под собой нечто большее, чем...
Иди и пиши. TravelMate C100
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Планшетный компьютер платформы Tablet PC обязан в первую очередь быть легким, способным достаточно долго работать без подзарядки батарей. Эти требования...
Магнито-оптический дисковод DynaMO
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Cейчас, когда традиционные флоппи-дисководы на долгие годы замерли в своем развитии, поиск альтернативных носителей продолжается, и ситуация, казалось бы, разрешилась...
Компьютер для гурманов.«Эксимер ДМ»
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Российская компания «Эксимер ДМ», известная как производитель настольных компьютеров, рабочих станций, серверов и ноутбуков, выступила техническим спонсором проведения торжеств, посвященных...
Для длинных строк, т.е. строк длиннее 255 символов, в MySQL предусмотрены типы BLOB (Binary Large Object, большой двоичный объект) и...
В дополнение к календарным типам, предназначенным для хранения даты и времени отдельно, MySQL также поддерживает гибридные типы данных DATETIME и...
Вообще, к изменению настроек сервера прибегают очень редко. В MySQL программа заранее настроена так, чтобы соответствовать самым распространенным и основным...
Все о MySQL. Объединения
28-12-2009
<< Предыдущая статья | Следующая статья >> |
Все о MySQL. Экспорт записей | Все о MySQL. Типы объединений |