Связи в sql что это

jtest.ru

HTML, CSS, JavaScript, JQuery, PHP, MySQL

SQL для начинающих. Часть 3

Представляю Вашему вниманию вольный перевод статьи SQL for Beginners Part 3

Сегодня мы продолжаем наше путешествие в мире SQL и реляционных систем управления базами данных. В этой части мы научимся работать с несколькими таблицами связанными между собой. Сначала мы познакомимся с базовыми концепциями, а потом начнем работать с запросами JOIN в SQL.

Предыдущие статьи

Вступление

При проектировании базы данных, здравый смысл подсказывает нам, что мы должны использовать различные таблицы для разных данных. Пример: клиенты, заказы, записи, сообщения и т.д. Так же мы должны иметь взаимосвязи между этими таблицами. Например, клиент имеет заказы, а у заказа есть позиции (товары). Эти взаимосвязи должны быть отражены в базе данных. А также, когда мы получаем данные с помощью SQL, мы должны использовать определенные типы запросов JOIN, чтобы получить нужный результат.

Вот несколько типов отношений в базе данных. Сегодня мы рассмотрим следующие:

Когда данные выбираются из нескольких связанных таблиц, мы будем использовать запрос JOIN. Есть несколько типов присоединения, мы познакомимся с этими:

Также мы изучим предложения ON и USING.

Связь один к одному

Допустим есть таблица покупателей (customers):

Мы можем расположить информацию о адресе покупателя в другой таблице:

Теперь у нас есть связь между таблицами покупателей (Customers) и адресами (Addresses). Если каждый адрес может принадлежать только одному покупателю, то такая связь называется «Один к одному». Имейте ввиду, что такой тип отношений не очень распространен. Наша первоначальная таблица, в которой информация о покупателе и его адресе хранилась вместе, в большинстве случаев работает нормально.

Обратите внимание, что теперь поле с названием «address_id», в таблице покупателей, ссылается на соответствующую запись в таблице адресов. Оно называется внешним ключом (Foreign Key) и используется во всех видах связей в базе. Мы рассмотрим этот вопрос позже в этой статье.

Вот так можно отобразить отношения между покупателями и адресами:

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

Связь один ко многим и многие к одному

Этот тип отношений наиболее часто встречающийся. Рассмотрим такой сайт интернет магазина:

В этих случаях нам потребуется создать связь «Один ко многим». Пример:

Каждый покупатель может иметь 0 или более заказов. Но каждый заказ может принадлежать только одному покупателю.

Связь многие ко многим

В некоторых случаях требуется многочисленные связи по обе стороны отношений. Например, каждый заказ может содержать множество товаров. И каждый товар может присутствовать во многих заказах.

Для такой связи нам потребуется создать дополнительную таблицу:

Так можно представить этот тип отношений:

Если добавить записи items_orders к диаграмме, то она будет выглядеть так:

Связь с собой

Такой тип используется когда у таблицы должны быть связь с собой. Допустим у Вас есть реферальная программа. Покупатели могут ссылаться на других покупателей на вашем сайте интернет магазина. Таблица может выглядеть так:

Покупатели 102 и 103 ссылаются на покупателя 101.

Этот тип похож на связь «Один ко многим», поскольку один покупатель может ссылаться на несколько покупателей. Это можно представить как древовидную структуру:

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

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

Внешние ключи

Пока что мы говорили только о базовых вещах. Пришло время применить полученные знания на практике, используя SQL. В данной часть нам нужно понять, что из себя представляют внешние ключи.

В отношениях, обсуждаемых выше, у нас всегда было поле вида «****_id», которое ссылалось столбец в другой таблице. В нашем примере столбец customer_id, в таблице Orders, является внешним ключом:

В таких базах как MySQL есть два способа создания внешних ключей:

Задать внешний ключ явно

Создадим простую таблицу с покупателями:

Теперь создадим таблицу заказов, которая будет содержать вторичный ключ:

Оба столбца (customers.customer_id и orders.customer_id) должны быть одного типа. Если у первого тип INT, то второй не должен быть типа BIGINT, например.

Пожалуйста, помните, что в MySQL полностью поддерживает внешние ключи только подсистема InnoDB. Другие подсистемы хранения данных позволяют определять внешние ключи без каких либо ошибок. Столбцы с внешними ключами индексируются автоматически, если явно не задать другой индекс.

Без явного объявления

Некоторые таблицы заказов могут быть созданы без явного определения внешнего ключа:

Когда данные получают запросом JOIN, Вы можете использовать столбец как внешний ключ, хотя база данных не знает о этих связях.

Мы подошли к изучению запросов JOIN, которые обсудим далее в статье.

Отображение связей

В данный момент, моей любимой программой для проектирования баз данных и отображения связей является MySQL Workbench.

После того как Вы спроектировали базу данных, ее можно экспортировать в SQL и выполнить на сервере. Это очень удобно при создании больших и сложных баз данных.

Запросы JOIN

Чтобы получить связанные данные из базы данных следует использовать запросы JOIN.

Прежде чем мы начнем, давайте создадим для работы тестовые таблицы и данные.

У нас есть 4 покупателя. У одного из них два заказа, у двоих по одному заказу, и у одного вообще нет заказов. Теперь давайте посмотрим какие виды запросов JOIN мы можем выполнять с этими таблицами.

Cross Join (Перекрестное объединение)

Это вид JOIN запроса по-умолчанию, если не определено условие.

Результатом будет, так называемое, «Декартово объединение» таблиц. Это означает, что каждая строка из первой таблицы сопоставляется с каждой строкой второй таблицы. Т.к. в каждой таблице по 4 строки, мы получили в результате 16 строк.

Ключевое слово JOIN можно заменить на запятую, в этом случае.

Конечно такой результат почти бесполезен. Давайте взглянем на другие виды объединений.

Natural Join (Естественное объединение)

При таком виде запроса JOIN таблицы должны иметь совпадающие, по имени, столбцы. В нашем случае в обеих таблицах должен присутствовать столбец customer_id. MySQL объединит записи только в случае совпадения значений в этих столбцах.

Как Вы можете видеть, в этот раз столбец customer_id отображаются только один раз, потому что движок базы рассматривает этот столбец как общий. Мы видим два заказа Adam’а, и другие два заказа Joe и Sandy. Наконец мы получили некоторую полезную информацию.

Inner Join (Внутреннее объединение)

Если условие объединения не указан, то выполняется внутреннее объединение. В этом случае хорошей идеей будет наличие совпадений по полю customer_id в обеих таблицах. Результат должен быть аналогичен естественному объединению.

Результат почти такой же. Столбец customer_id повторяется два раза, по разу для каждой таблицы. Объясняется это тем, что мы попросили базу сравнить значение по двум столбцам. При этом не знаю, что возвращают одну и туже информацию.

Добавим побольше условий к запросу.

Предложение ON

Прежде чем перейти к другим видам объединяющих запросов, нам нужно рассмотреть предложение ON. Оно служит для вставки условий JOIN в отдельные предложения.

Теперь мы можем различать условия, относящиеся к JOIN и условия в части WHERE. Но еще есть небольшая разница в функционировании. Мы увидим это, когда перейдем к примерам с LEFT JOIN.

Предложение USING

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

На самом деле это очень похоже на NATURAL JOIN, т.е. объединяющий столбец (customer_id) не повторяется дважды.

Left (Outer) Join (Левое внешнее соединение)

LEFT JOIN это вид внешнего соединения. В следующем запросе, если не найдены совпадения во второй таблице, записи из первой таблице все равно отобразятся.

Хотя у Andy и нет заказов, эта запись все равно отображается. Значение из второй таблицы равно NULL.

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

Отметим, что ключевое слово OUTER не обязательно. Вы можете использовать просто LEFT JOIN вместо LEFT OUTER JOIN.

Условия

Теперь давайте посмотрим на запросы с условиями.

Так, что случилось с Andy и Sandy? LEFT JOIN подразумевает, что мы должны получить покупателей, у которых нет заказов. Проблема в том, что условие WHERE скрывает эти результаты. Чтобы получить их, мы можем попытаться включить условие с NULL.

Появился Andy, но нет Sandy. Выглядит неправильно. Для того чтобы получить то, что мы хотим, нужно использовать предложение ON.

Right (Outer) Join (Правое внешнее соединение)

Объединение RIGHT OUTER JOIN работает также, только порядок таблиц меняется на обратный.

На этот раз мы не получили результатов с NULL, потому что каждый заказ имеет сопоставление с записью покупателя. Мы можем поменять порядок таблиц и получим тот же результат, что и с LEFT OUTER JOIN.

Теперь у нас появились значения NULL, потому что таблица покупателей с правой стороны от объединения.

Заключение

Спасибо за чтение статьи. Надеюсь Вам понравилось!

Источник

Russian (Pусский) translation by Yuri Yuriev (you can also view the original English article)

Сегодня мы продолжаем наше путешествие в мир SQL и связанных баз данных. В третьей части этой серии мы узнаем, как работать с несколькими таблицами, которые имеют отношения друг с другом. Во-первых, мы рассмотрим некоторые базовые концепции, а затем начнем работать с JOIN queries в SQL.

Вы также можете увидеть базы данных SQL в действии, просмотрев SQL scripts, apps and add-ons на рынке Envato.

Напоминание

Введение

При создании базы данных здравый смысл подсказывает, что мы используем отдельные таблицы для разных типов сущностей. Например: клиенты, заказы, предметы, сообщения. Но нам также нужно иметь отношения между этими таблицами. Например, клиенты делают заказы, а заказы содержат предметы. Эти отношения должны быть представлены в базе данных. Кроме того, при получении данных с помощью SQL нам нужно использовать определённые типы запросов JOIN, чтобы получить то, что нам нужно.

Существует несколько типов отношений базы данных. Сегодня мы рассмотрим следующее:

При выборе данных из нескольких таблиц с отношениями мы будем использовать запрос JOIN. Существует несколько типов JOIN, и мы собираемся узнать следующее:

Мы также узнаем об оговорках ON и USING.

Отношения один к одному

Предположим, у вас есть таблица для клиентов:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Мы можем поместить информацию об адресе клиента в отдельную таблицу:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Теперь мы имеем отношение между таблицей Customers и таблицей Addresses. Если каждый адрес может принадлежать только одному клиенту, это отношение «Один к одному». Имейте в виду, что такого рода отношения не очень распространены. Наша начальная таблица, которая включала адрес вместе с клиентом, в большинстве случаев могла работать нормально.

Обратите внимание: теперь в таблице Customers есть поле с именем «address_id», которое ссылается на запись соответствия в таблице Address. Это называется «Foreign Key» и используется для всех видов отношений баз данных. Мы рассмотрим этот вопрос позже.

Мы можем показать отношения между клиентскими и адресными записями следующим образом:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Обратите внимание, что существование отношений может быть необязательным, например, есть запись клиента, у которой нет связанной записи адреса.

Отношения «один ко многим» и «многие к одному»

Это наиболее часто используемый тип отношений. Рассмотрим веб-сайт e-commerce со следующим:

В этих случаях нам необходимо создать отношения «один ко многим». Вот пример:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

У каждого клиента может быть ноль, один или несколько заказов. Но заказ может принадлежать только одному клиенту.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Отношения «многие ко многим»

В некоторых случаях вам может потребоваться несколько экземпляров с обеих сторон. Например, каждый заказ может содержать несколько элементов. И каждый элемент также может быть в нескольких заказах.

Для этих отношений нам нужно создать дополнительную таблицу:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Таблица Items_Orders имеет только одну цель, а именно, чтобы создать отношение «многие ко многим» между элементами и заказами.

Вот картинка таких отношений:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Если вы хотите включить записи items_orders в график, это может выглядеть так:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Самостоятельные ссылки

Это используется, когда таблица должна иметь отношения с самой собой. Например, у вас есть реферальная программа. Клиенты могут направлять других клиентов на ваш веб-сайт. Таблица может выглядеть так:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Клиенты 102 и 103 были переданы клиентом 101.

На самом деле это может быть похоже на отношение «один ко многим», поскольку один клиент может ссылаться на нескольких клиентов. Также он может выглядеть, как древовидная структура:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Один клиент может ссылаться на ноль, одного или несколько клиентов. К каждому клиенту может обращаться только один клиент, или вообще никто.

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

Foreign Keys

До сих пор мы узнали только о некоторых концепциях. Теперь пришло время воплотить их в жизнь с помощью SQL. Для этой части нам нужно понять, что такое Foreign Keys.

В приведённых выше примерах отношений мы всегда имели эти поля «**** _ id», которые ссылались на столбец в другой таблице. В этом примере столбец customer_id в таблице Orders является столбцом Foreign Key:

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

В базе данных типа MySQL есть два способа создания столбцов внешних ключей:

Чёткое определение Foreign Key

Давайте создадим простую таблицу клиентов:

Теперь таблицу заказов, в которой будет Foreign Key:

Оба столбца (customers.customer_id и orders.customer_id) должны иметь одинаковую структуру данных. Если один является INT, другой не должен быть BIGINT, например.

Обратите внимание, что в MySQL только механизм InnoDB имеет полную поддержку Foreign Keys. Но другие механизмы хранения данных по-прежнему позволят вам указывать их без каких-либо ошибок. Кроме того, столбец Foreign Key индексируется автоматически, если не указать для него другой индекс.

Без явной декларации

Та же таблица заказов может быть создана без явного объявления столбца customer_id как Foreign Key:

Далее мы собираемся узнать о JOIN-запросах.

Визуализация отношений

Моим любимым программным обеспечением для проектирования баз данных и визуализации отношений Foreign Key является MySQL Workbench.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

После разработки базы данных вы можете экспортировать SQL и запустить его на своем сервере. Это очень удобно для больших и сложных баз данных.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

JOIN Queries

Для извлечения данных из базы, имеющей отношения, нам часто приходится использовать JOIN queries.

Прежде чем начать, давайте создадим таблицы и некоторые образцы данных для работы.

У нас 4 клиента. У одного клиента два заказа, у двух клиентов по одному заказу, а у одного клиента нет заказа. Теперь давайте посмотрим различные виды JOIN queries, которые мы можем запустить в этих таблицах.

Перекрестное соединение

Это тип JOIN query по умолчанию, если условие не указано.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Результатом является так называемый «Cartesian product» таблиц. Это означает, что каждая строка из первой таблицы сопоставляется с каждой строкой второй таблицы. Так как каждая таблица имела 4 строки, мы получили результат из 16 строк.

Ключевое слово JOIN может быть опционально заменено запятой.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Конечно, такой результат не очень полезен. Давайте посмотрим на другие типы соединений.

Обычное соединение

При таком типе JOIN query таблицы должны иметь имя соответствующего столбца. В нашем случае обе таблицы имеют столбец customer_id. Таким образом, MySQL будет присоединяться к записям только тогда, когда значение этого столбца соответствует двум записям.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Внутреннее соединение

Когда указано условие соединения, выполняется Inner Join. В этом случае было бы неплохо иметь поле customer_id в обеих таблицах. Результаты должны быть похожими на Natural Join.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Результаты те же, за исключением небольшой разницы. Столбец customer_id повторяется дважды, один раз для каждой таблицы. Причина в том, что мы просто попросили базу данных соответствовать значениям этих двух столбцов. Но сами они не знают, что представляют одну и ту же информацию.

Давайте добавим еще несколько условий в запрос.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

ON Clause

Прежде чем перейти к другим типам соединений, нам нужно посмотреть ON clause. Это полезно для помещения условий JOIN в отдельное предложение.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Теперь мы можем отличить условие JOIN от условий WHERE. Но есть и небольшая разница в функциональности. Мы увидим это в примерах LEFT JOIN.

USING Clause

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

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

На самом деле это похоже на NATURAL JOIN, поэтому столбец join (customer_id) не повторяется дважды в результатах.

Левое (внешнее) соединение

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Хотя у Энди нет заказов, его запись все ещё отображается. Значения под столбцами второй таблицы имеют значение NULL.

Это полезно для поиска записей, которые не имеют отношений. Например, мы можем искать клиентов, которые не разместили какие-либо заказы.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Всё, что мы сделали, это нашли NULL для order_id.

Также обратите внимание, что ключевое слово OUTER является необязательным. Вы можете просто использовать LEFT JOIN вместо LEFT OUTER JOIN.

Условия

Теперь давайте рассмотрим запрос с условием.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Так что случилось с Энди и Сэнди? LEFT JOIN должен был вернуть клиентов без соответствующих заказов. Проблема в том, что предложение WHERE блокирует эти результаты. Чтобы их получить, мы можем попытаться включить условие NULL.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

У нас Энди, но нет Сэнди. Тем не менее это выглядит не так. Чтобы получить то, что мы хотим, нам нужно использовать ON clause.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Правое (внешнее) соединение

RIGHT OUTER JOIN работает точно так же, но порядок таблиц обратный.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

На этот раз у нас нет результатов NULL, потому что каждый заказ имеет соответствующую запись клиента. Мы можем изменить порядок таблиц и получить те же результаты, что и в LEFT OUTER JOIN.

Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что этоСвязи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это Связи в sql что это. Смотреть фото Связи в sql что это. Смотреть картинку Связи в sql что это. Картинка про Связи в sql что это. Фото Связи в sql что это

Теперь у нас есть эти значения NULL, потому что таблица Customers находится на правой стороне соединения.

Заключение

Спасибо, что прочитали статью. Надеюсь, вам понравилось! Пожалуйста, оставляйте свои комментарии и вопросы, и хорошего дня!

Не забудьте проверить SQL scripts, apps and add-ons на рынке Envato. Вы получите представление о возможностях баз данных SQL, и сможете найти идеальное решение, которое поможет вам в текущем проекте разработки.

Следуйте за нами на Twitter или подпишитесь на Nettuts + RSS Feed для получения лучших обучающих материалов по веб-разработке в Интернете.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *