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

Часто при работе с базами данных в каждом из языков стоит задача сделать выборку данных для выведения в разнообразные отчеты, графики и так далее. Как правило, при реализации такого рода задач приходится использовать не одну, а несколько таблиц, объединяя их в один запрос, значительно усложняя его конструкцию. При этом необходимо учитывать то, как должны будут выводиться данные, как будут «подтягиваться» таблицы и какой результат будет максимально приемлемым для программиста. Для решения таких задач используется одна из стандартных конструкция языка MySQL - Join.

Понятие слова Join

Языки разработки баз данных, неважно, что именно это за язык, за основу берут стандартные слова из англоязычных словарей (именно поэтому при условии, что вы знаете английский язык, вам буде намного проще работать с таблицами). Для реализации подключения таблиц в выборку взято такое же слово - Join. В языке программирования баз данных Используется My SQL. Перевод этого служебного слова в точности такой же, как и в самом языке - «объединение».

Интерпретация конструкции MySQL - Join, причем любой из них, будет точно такой же. Если расшифровать назначение конструкции, а именно схему ее работы, то получим следующие значение: конструкции позволят собрать нужные поля из разных таблиц или вложенных запросов в одну выборку.

Виды конструкций для объединения

Если программисту необходимо собрать выборку из нескольких таблиц и он знает, какие ключевые поля в них и какие именно данные необходимы для отчета, то можно воспользоваться одной из основных конструкций объединения, для достижения желаемого результата. Основных конструкций (для объединения таблиц) четыре:

  1. Inner join.
  2. Cross Join.
  3. Left join.
  4. Right Join.

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

Создание и заполнение таблиц для дальнейшего использования

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

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

Во второй таблице опишем некоторые свойства объектов из первой таблицы, чтобы можно было в дальнейшем с ними работать.

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

Использование Inner Join

При использовании конструкции MySQL - Join Ineer стоит учитывать некоторые ее особенности. Данная конструкция позволит выбрать из обеих таблиц только те записи, которые есть и в первой и во второй таблице. Как это работает? В первой таблице у нас есть главный ключ - ID, который указывает на порядковый номер записей в таблице.

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

При использовании конструкции нужно понимать, какие именно данные необходимо получить. Самая распространенная ошибка, особенно у начинающего программиста нерациональное и неправильное использование конструкции Inner Join. Как можно рассмотреть скрипт, который вернет нам из ранее описанных и заполненных таблиц информацию о предметах и их свойствах. Но и здесь может быть несколько способов использования конструкции. В этом плане My SQL очень гибкий язык. Итак, можно рассмотреть примеры использования MySQL Inner Join.

Объединение таблиц без указания, каких-либо параметров. В этом случае мы получим результат такого плана:

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

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

Особенности использования Left Join

Если рассматривать еще один способ объединения таблиц с помощью конструкции MySQL - Join, можно заметить разницу в данных, которые выводятся. Таким механизмом является конструкция Left.

Использование конструкции Left Join MySQL имеет некоторые особенности и, как и Inner, требует четкого понимания результата, который необходимо получить.

В данном случае сначала будут выбраны все записи из первой таблицы, а в дальнейшем к ним будут присоединены записи из второй таблицы свойств. При этом, если в первой таблице есть запись, например, "табурет", а во второй таблице нет ни одного свойства для нее, то оператор Left выведет напротив этой записи значение null, что говорит программисту о том, что признаков по этому виду предмета нет.

Использование этой конструкции позволят определять, по каким полям или, например, товарам в магазине не выставлена цена, и так далее.

Пример использования Left

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

Использование Where в конструкции Join

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

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

При использовании в MySQL Join - Where нужно четко понимать, что будут показаны только те записи, к которым относится указанное условие, и выборка тогда будет выглядеть следующим образом:

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

Использование Join для изменения данных в таблицах

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

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

Рассмотрим самый простой пример. Нужно обновить одним запросом данные по одним и тем же условиям. Такого рода запросы строятся для оптимизации работы с базой данных. Зачем писать разные запросы для каждой из таблиц, если можно провести все манипуляции с данными одним запросом? Пример Join в нашем случае будет таким:

Построение сложных запросов

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

Для более конкретного понимания можно рассмотреть (в MySQL Join) примеры сложных запросов. Если вы новичок и только начинаете работать с базами данных, то такой тренинг пойдет лишь на пользу. Идеальным вариантом, будут

Данный запрос вернет нам 58 записей о договорах продажи, по которым заполнен или существует баланс денежных средств на выбранную дату. В данном случае это текущая дата. Также в выборку добавлено условие, что в названии договора должны быть символы - «123». Выводимая на экран информация (данные), будет иметь сортировку - упорядоченность по номеру договора.

Следующий пример выведет на экран данные обо всех платежах, в которых будет указан номер договора.

Использование подзапросов

Как уже говорилось ранее, при работе с базами данных можно объединить не только таблицы, но и таблицу с запросом. Такая конструкция используется в основном для ускорения работы запроса и его оптимизации.

К примеру, если необходимо из таблицы, которая имеет несколько сот полей и, скажем, тысячу записей, выбрать всего два поля, то стоит использовать запрос, который вернет только необходимые поля, и объединить его с основной выборкой данных. Как пример MySQL Join Select можно рассмотреть запрос такого типа:

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

9.5K

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

Введение в LEFT JOIN MySQL

Оператор MySQL LEFT JOIN позволяет запрашивать данные из двух или более таблиц базы данных. Он является необязательной частью оператора SELECT , которая указывается после FROM .

Предположим, что вы собираетесь запрашивать данные из таблиц t1 и t2 . На примере приведенного ниже запроса мы проиллюстрируем синтаксис LEFT JOIN , объединяя две таблицы:

SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1;

Когда вы подключаетесь к таблицам t1 и t2 , используя оператор LEFT JOIN , если строка из левой таблицы t1 соответствует строке из правой таблицы t2 на основе условия соединения (t1.c1 = t2.c1 ), эта строка будет включена в результирующий набор.

Если значение в левой таблице не соответствует значению в правой таблице, строка в левой таблице также выбирается и объединяется с «условной » строкой из правой таблицы. «Условная » строка содержит NULL для всех соответствующих столбцов в операторе SELECT .

Другими словами, условие MySQL LEFT JOIN позволяет выбирать строки обеих таблиц, которые совпадают, плюс все строки из левой таблицы (t1 ) даже без совпадения со строками правой таблицы (t2 ).

Следующая диаграмма поможет представить, как работает условие LEFT JOIN . Пересечение двух кругов — это строки, которые соответствуют в обеих таблицах, а оставшаяся часть левого круга — это строки в таблице t1 , которые не имеют соответствующей строки в таблице t2 . Следовательно, все строки в левой таблице включены в результирующий набор.


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

Примеры использования LEFT JOIN

Использование оператора MySQL LEFT JOIN для объединения двух таблиц

Возьмем две таблицы клиентов и заказов из демонстрационной базы данных :


В базе данных, описанной на диаграмме:
  • Каждый заказ в таблице заказов должен принадлежать клиенту в таблице клиентов;
  • Каждый клиент в таблице клиентов может иметь ноль или более заказов в таблице заказов.

Чтобы найти заказы, принадлежащие каждому клиенту, можно использовать MySQL LEFT JOIN пример:

SELECT c.customerNumber, c.customerName, orderNumber, o.status FROM customers c LEFT JOIN orders o ON c.customerNumber = o.customerNumber

Посмотреть пример


Левая таблица — это клиенты, поэтому все клиенты включены в результирующий набор. Но в нем есть строки, которые имеют данные клиента, но не имеют данных заказа, например. 168, 169 и т. д. Данные заказов в этих строках равны NULL . Это означает, что у этих клиентов нет заказов в соответствующей таблице.

Поскольку мы использовали одно и то же имя столбца (orderNumber ) для объединения двух таблиц, можно сделать запрос короче, используя приведенный ниже синтаксис:

SELECT c.customerNumber, customerName, orderNumber, status FROM customers c LEFT JOIN orders USING (customerNumber);

Если вы замените оператор MySQL SELECT LEFT JOIN оператором INNER JOIN , вы получите только клиентов, которые оформили хотя бы один заказ.

Использование оператора MySQL LEFT JOIN для поиска несовпадающих строк

Оператор LEFT JOIN может оказаться полезен, если вы хотите найти строки в левой таблице, которые не соответствуют строкам в правой. Чтобы найти несовпадающие строки двух таблиц, нужно добавить оператор WHERE в выборку SELECT для запроса только строк, значения столбцов которых в правой таблице содержат значение NULL .

Например, чтобы найти всех клиентов, которые не оформили ни одного заказа, используется следующий запрос:

Посмотреть пример

Условие в операторе WHERE или условие в операторе ON

Рассмотрим следующий пример использования MySQL LEFT JOIN WHERE :

В этом примере мы использовали оператор LEFT JOIN для запроса данных из таблиц orders и orderDetails . Запрос возвращает заказ и его данные, если они есть, для заказа 10123.

Поводом для написания данной статьи послужили некоторые дебаты в одной из групп linkedin, связанной с MySQL, а также общение с коллегами и хабролюдьми:-)

В данной статье хотел написать что такое вообще JOINы в MySQL и как можно оптимизировать запросы с ними.

Что такое JOINы в MySQL

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

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

Прмер обычного запроса с INNER JOIN

SELECT
*
FROM
Table1
INNER JOIN
Table2 ON P1(Table1,Table2)
INNER JOIN
Table3 ON P2(Table2,Table3)
WHERE
P(Table1,Table2,Table3).

Где Р - условия склейки таблиц и фильтры в WHERE условии.

Можно представить такой псевдокод выполнения такого запроса.

FOR each row t1 in Table1 {
IF(P(t1)) {
FOR each row t2 in Table2 {
IF(P(t2)) {
FOR each row t3 in Table3 {
IF P(t3) {
t:=t1||t2||t3; OUTPUT t;
}
}
}
}
}
}

* This source code was highlighted with Source Code Highlighter .

Где конструкция t1||t2||t3 означает конкатенацию столбцов из разных таблиц.

Если в запросе встречаются OUTER JOINs, например, LEFT OUTER JOIN

SELECT
*
FROM
Table1
LEFT JOIN
Table2 LEFT JOIN Table3 ON P2(Table2,Table3)
ON P1(Table1,Table2)
WHERE
P(Table1,Table2,Tabke3)

* This source code was highlighted with Source Code Highlighter .

То алгоритм выполнения этого запроса MySQL будет выглядеть как-то так

FOR each row t1 in T1 {
BOOL f1:=FALSE;
FOR each row t2 in T2 such that P1(t1,t2) {
BOOL f2:=FALSE;
FOR each row t3 in T3 such that P2(t2,t3) {
IF P(t1,t2,t3) {
t:=t1||t2||t3; OUTPUT t;
}
f2=TRUE;
f1=TRUE;
}
IF (!f2) {
IF P(t1,t2,NULL) {
t:=t1||t2||NULL; OUTPUT t;
}
f1=TRUE;
}
}
IF (!f1) {
IF P(t1,NULL,NULL) {
t:=t1||NULL||NULL; OUTPUT t;
}
}
}

* This source code was highlighted with Source Code Highlighter .

Итак, как мы видим, JOINы это просто группа вложенных циклов. Так почему же в MySQL и UNION и SELECT и запросы с SUBQUERY тоже джоины?

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

С SELECT все понятно - просто цикл без вложенных циклов. Все UNION выполняются как отдельные запросы и результаты складываются во временную таблицу, и потом MySQL работает уже с этой таблицей, т.е. проходясь циклом по записям в ней. С Subquery та же история.

Приводя все к одному шаблону, например, МySQL переписывает все RIGHT JOIN запросы на LEFT JOIN эквиваленты.

Но стратегия выполнения запросов через вложенные циклы накладывает некоторые ограничения, например, в связи с такой схемой MySQL не поддерживает выполнение FULL OUTER JOIN запросов.

Но результат такого запроса можно получить с помощью UNION двух запросов на LEFT JOIN и на RIGHT JOIN
Пример самого запроса можно посмотреть по ссылке на вики.

План выполнения JOIN запросов

В отличии от других СУРБД MySQL не генерирует байткод для выполнения запроса, вместо этого MySQL генерирует список инструкций в древовидной форме, которых придерживается engine выполнения запроса выполняя запрос.
Это дерево имеет следующий вид и имеет название «left-deep tree»

В отличии от сбалансированных деревьев (Bushy plan), которые применяются в других СУБД (например Oracle)

JOIN оптимизация

Теперь перейдем к самому интересному - к оптимизации джоинов.
MySQL оптимизатор, а именно та его часть, которая отвечает за оптимизацию JOIN-ов выбирает порядок в котором будет производиться склейка имеющихся таблиц, т.к. можно получить один и тот же результат (датасет) при различном порядке таблиц в склейке. MySQL оптимизатор оценивает стоимость различных планов и выбирает с наименьшей стоимостью. Единицей оценки является операция единичного чтения страницы данных размером в 4 килобайта из произвольного места на диске.

Для выбранного плана можно узнать стоимость путем выполнения команды

SHOW SESSION STATUS LIKE "Last_query_cost";

Оценка основана на статистике: количество страниц памяти, занимаемое таблицей и/или индексами для этой таблицы, cardinality (число уникальных значений) индексов, длинна записей и индексов, их распределение и т.д. Во время своей оценки оптимизатор не рассчитывает на то, что какие-то части попадут в кеш, оптимизатор предполагает, что каждая операция чтения это обращение к диску.

Иногда анализатор-оптимизатор не может проанализировать все возможные планы выполнения и выбирает неправильный. Например, если у нас INNER JOIN по 3м таблицам, то возможных вариантов у анализатора - 3! = 6, а если у нас склейка по 10 таблицам, то тут возможных вариантов уже 10! = 3628800… MySQL не может проанализировать столько вариантов, поэтому в таком случае он использует алгоритм "жадного " поиска.

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

Также, как уже говорилось выше, результаты джоинов помещаются во временные таблицы, поэтому зачастую уместно применять «derived table» в котором мы накладываем все необходимые нам условия на выборку, а также указываем LIMIT и порядок сортировки. В данном случае мы избавимся от избыточности данных во временной таблице, а также проведем сортировку на раннем этапе (по результату одной выборки, а не финальной склейки, что уменьшит размеры записей которые будут сортироваться).

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

SELECT
t.tid, t.description, n.nid, n.title, n.extract , n.modtime
FROM
SELECT
n.nid
FROM
news n
WHERE
n.type = 1321
AND n.published = 1
AND status = 1
ORDER BY
n.modtime DESC
LIMIT
200
) as news
INNER JOIN
news n ON n.nid = news.nid
INNER JOIN
news_tag nt ON n.nid = nt.nid
INNER JOIN
tags t ON nt.tid = t.tid

* This source code was highlighted with Source Code Highlighter .

Ну и на последок небольшая задачка, которую я иногда задаю на собеседованиях:-)

Есть новостной блоггерный сайт. Есть такие сущности как новости и комментарии к ним.

Задача - нужно написать запрос, который выводит список из 10 новостей определенного типа (задается пользователем) отсортированные по времени издания в хронологическом порядке, а также к каждой из этих новостей показать не более 10 последних коментариев, т.е. если коментариев больше - показываем только последние 10.

Все нужно сделать одним запросом. Да, это, может, и не самый лучший способ, и вы вольны предложить другое решение:-)

Теги:

  • MySQL
  • mysql performance
  • JOIN
Добавить метки

В этом учебном пособии вы узнаете, как использовать JOINS (INNER и OUTER) в MySQL с синтаксисом, рисунками и примерами.

Описание

MySQL JOINS используются для извлечения данных из нескольких таблиц. JOIN выполняется всякий раз, когда две или более таблиц объединяются в SQL предложении.

Существуют различные типы соединений MySQL:

Рассмотрим синтаксис MySQL JOIN, а также изучим примеры MySQL JOIN.

INNER JOIN (простое соединение)

Скорее всего, вы уже писали запросы в которых используются MySQL INNER JOIN. Это наиболее распространенный тип соединения. MySQL INNER JOINS возвращает все строки из нескольких таблиц, где выполняется условия соединения.

Синтаксис

Синтаксис INNER JOIN в MySQL:

SELECT columns
FROM table1
INNER JOIN table2

В этом рисунке, MySQL INNER JOIN возвращает затененную область:

MySQL INNER JOIN будет возвращать записи, где table1 и table2 будут пересекаться.

Пример

Ниже приведен пример MySQL INNER JOIN:

MySQL

У нас есть еще одна таблица orders с тремя полями (order_id , supplier_id и order_date ). Она содержит следующие данные:

order_id supplier_id order_date
500125 10000 05.05.2015
500126 10001 08.02.2016
500127 10004 06.01.2017

Если мы выполним MySQL оператор SELECT (который содержит INNER JOIN) ниже:

MySQL

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers INNER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

Строки для Microsoft и NVIDIA из таблицы suppliers будут опущены, так как значения supplier_id 10002 и 10003 не существует в обеих таблицах. Строка order_id 500127 из таблицы orders будет опущена, так как supplier_id 10004 не существует в таблице suppliers .

Старый Синтаксис

В качестве последнего примечания, стоит отметить, что приведенный выше пример MySQL INNER JOIN можно переписать, используя старый неявный синтаксис следующим образом (но рекомендуется использовать синтаксис INNER JOIN):

Другой тип соединения называется MySQL LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с левосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.

Синтаксис

Синтаксис для LEFT OUTER JOIN в MySQL:

SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

В некоторых базах данных LEFT OUTER JOIN заменяется на LEFT JOIN.

На этом рисунке, MySQL LEFT OUTER JOIN возвращает затененную область:

MySQL LEFT OUTER JOIN возвратит все записи из table1 и только те записи из table2 , которые пересекаются с table1 .

Пример

MySQL

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT JOIN orders ON suppliers.supplier_id = orders.supplier_id;

SELECT suppliers.supplier_id,suppliers.supplier_name,orders.order_date

FROM suppliers

LEFT JOIN orders

ON suppliers.supplier_id=orders.supplier_id;

Этот пример LEFT OUTER JOIN возвратит все строки из таблицы suppliers , и только те строки из таблицы orders , где объединяемые поля равны.

Если значение supplier_id в таблице suppliers не существует в таблице orders , все поля таблицы orders будут отображаться в результирующем наборе как NULL.

Рассмотрим некоторые данные, чтобы понять, как работает LEFT OUTER JOIN:

У нас есть таблица suppliers с двумя полями (supplier_id и supplier_name ) которая содержит следующие данные:

Если мы выполним MySQL оператор SELECT (который содержит LEFT OUTER JOIN) ниже:

MySQL

SELECT suppliers.supplier_id, suppliers.supplier_name, orders.order_date FROM suppliers LEFT OUTER JOIN orders ON suppliers.supplier_id = orders.supplier_id;

Строки для Microsoft и NVIDIA будут включены, так как был использован LEFT OUTER JOIN. Тем не менее, вы заметите, что поле order_date для этих записей содержит значение NULL.

Другой тип соединения называется MySQL RIGHT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с правосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны.

Синтаксис

СинтаксиRIGHT OUTER JOIN в MySQL:

SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;

В некоторых базах данных, RIGHT OUTER JOIN заменяется на RIGHT JOIN.

На этом рисунке, MySQL RIGHT OUTER JOIN возвращает затененную область:

MySQL RIGHT OUTER JOIN возвратит все записи из table2 и только те записи из table1 , которые пересекаются с table2 .

Пример

Ниже приведен пример MySQL RIGHT OUTER JOIN:

MySQL

SELECT orders.order_id, orders.order_date, suppliers.supplier_name FROM suppliers RIGHT JOIN orders ON suppliers.supplier_id = orders.supplier_id;

MySQL поддерживает следующий синтаксис оператора JOIN при использовании в командах SELECT:

Table_reference, table_reference table_reference JOIN table_reference table_reference INNER JOIN table_reference join_condition table_reference STRAIGHT_JOIN table_reference table_reference LEFT JOIN table_reference join_condition table_reference LEFT JOIN table_reference table_reference NATURAL ] JOIN table_reference { oj table_reference LEFT OUTER JOIN table_reference ON conditional_expr } table_reference RIGHT JOIN table_reference join_condition table_reference RIGHT JOIN table_reference table_reference NATURAL ] JOIN table_reference

где table_reference определено, как:

Table_name [ alias]

и join_condition определено, как:

ON conditional_expr | USING (column_list)

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

Необходимо учитывать, что в версиях до 3.23.17 оператор INNER JOIN не принимает параметр join_condition !

Наличие последней из приведенных выше конструкций выражения LEFT OUTER JOIN обусловлено только требованиями совместимости с ODBC:

  • Вместо ссылки на таблицу может использоваться псевдоним, который присваивается при помощи выражений tbl_name AS alias_name или tbl_name alias_name: mysql> SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 WHERE t1.name = t2.name;
  • Условный оператор ON представляет собой условие в любой форме из числа тех, которые можно использовать в выражении WHERE .
  • Если запись для правой таблицы в частях ON или USING в LEFT JOIN не найдена, то для данной таблицы используется строка, в которой все столбцы установлены в NULL . Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице: mysql> SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL; Этот пример находит все строки в таблице table1 с величиной id , которая не присутствует в таблице table2 (т.е. все строки в table1 , для которых нет соответствующих строк в table2). Конечно, это предполагает, что table2.id объявлен как NOT NULL . See section 5.2.6 Как MySQL оптимизирует LEFT JOIN и RIGHT JOIN .
  • USING (column_list) служит для указания списка столбцов, которые должны существовать в обеих таблицах. Такое выражение USING , как: A LEFT JOIN B USING (C1,C2,C3,...) семантически идентично выражению ON , например: A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
  • Выражение NATURAL JOIN для двух таблиц определяется так, чтобы оно являлось семантическим эквивалентом INNER JOIN или LEFT JOIN с выражением USING , в котором указаны все столбцы, имеющиеся в обеих таблицах.
  • INNER JOIN и, (запятая) являются семантическими эквивалентами. Оба осуществляют полное объединение используемых таблиц. Способ связывания таблиц обычно задается в условии WHERE .
  • RIGHT JOIN работает аналогично LEFT JOIN . Для сохранения переносимости кода между различными базами данных рекомендуется вместо RIGHT JOIN использовать LEFT JOIN .
  • STRAIGHT_JOIN идентично JOIN , за исключением того, что левая таблица всегда читается раньше правой. Это выражение может использоваться для тех (немногих) случаев, когда оптимизатор объединения располагает таблицы в неправильном порядке.
  • Начиная с версии MySQL 3.23.12, можно давать MySQL указания о том, какой индекс должен использоваться при извлечении информации из таблицы. Эта возможность полезна, если оператор EXPLAIN (выводящий информацию о структуре и порядке выполнения запроса SELECT), показывает, что MySQL использует ошибочный индекс. Задавая значение индекса в USE INDEX (key_list) , можно заставить MySQL применять для поиска записи только один из указанных индексов. Альтернативное выражение IGNORE INDEX (key_list) запрещает использование в MySQL данного конкретного индекса. Выражения USE/IGNORE KEY являются синонимами для USE/IGNORE INDEX .

Несколько примеров:

Mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id); mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id; mysql> SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3; mysql> SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;