В своей практике никогда не использовал оператор JOIN
в запросах. Мне это было не нужно, так как все задачи удавалось решать по-другому и тем способом, который был мне удобен.
Я использовал следующие запросы:
SELECT m.id, m.title, description FROM `jos_menu` as m, `jos_menu_types` as t WHERE m.id = t.id AND description = ""
Вчера решил более не откладывать и начал поиск по Интернету в сторону оператора JOIN
. Изначально, как и всегда я напал на Справочное руководство по MySQL, а точнее 6.4.1.1 Синтаксис оператора JOIN. Однако, язык изложения там довольно сложный.
Далее я нашел статью Антона Прибора:
В статье простым языком объясняется принцип работы оператора JOIN
.
Есть 3 разновидности оператора JOIN
:
INNER JOIN
илиCROSS JOIN
LEFT JOIN
RIGHT JOIN
По документации MySQL их более, чем 3, но это пока не важно.
Если у нас имеется 2 таблицы, к примеру, с уникальным полем id
, которое используется для объединения двух таблиц. Представим, что в 1-й таблице Название товара, во 2-й Описание.
SELECT * FROM nomenclature; +----+-----------+ | id | name | +----+-----------+ | 1 | Книга | | 2 | Табуретка | | 3 | Карандаш | +----+-----------+ |
SELECT * FROM description; +----+---------------------+ | id | description | +----+---------------------+ | 1 | Замечательная книга | | 3 | Красный карандаш | | 5 | Зелёная машинка | +----+---------------------+ |
Связь по id
1-к-1.
К примеру, во 2-й таблице описание добавлено не для всех товаров, что в 1-й таблице. К примеру, в 1-й таблице есть запись с id = 2, а во 2-й нет.
Оператор INNER JOIN
Запрос INNER JOIN используется для объединения результатов посредством оператора ON
или USING
. Строки с определенным id
должны обязательно присутствовать в каждой таблице.
SELECT * FROM nomenclature INNER JOIN description; +----+-----------+----+---------------------+ | id | name | id | description | +----+-----------+----+---------------------+ | 1 | Книга | 1 | Замечательная книга | | 2 | Табуретка | 1 | Замечательная книга | | 3 | Карандаш | 1 | Замечательная книга | | 1 | Книга | 3 | Красный карандаш | | 2 | Табуретка | 3 | Красный карандаш | | 3 | Карандаш | 3 | Красный карандаш | | 1 | Книга | 5 | Зелёная машинка | | 2 | Табуретка | 5 | Зелёная машинка | | 3 | Карандаш | 5 | Зелёная машинка | +----+-----------+----+---------------------+
Оператор LEFT JOIN
При использовании оператора LEFT JOIN
по условию все строки будут извлечены из Левой таблицы и при отсутствии строк в Правой таблице, они будут дополнены.
В таком случае при выборе всех значений из таблицы с Названием товаров, строка с id = 2 будет иметь Описание равное NULL
.
SELECT * FROM nomenclature LEFT JOIN description USING(id); +----+-----------+---------------------+ | id | name | description | +----+-----------+---------------------+ | 1 | Книга | Замечательная книга | | 2 | Табуретка | NULL | | 3 | Карандаш | Красный карандаш | +----+-----------+---------------------+
Оператор RIGHT JOIN
Данный оператор выбирает все значения из Правой таблицы и при отсутствии значений в левой, дополняет результаты выборки.
Оператор ON
Данный оператор равносилен оператору WHERE
по синтаксису:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
Оператор USING
При использовании данного оператора в скобках перечисляются необходимые столбцы, которые есть в каждой таблице:
SELECT * FROM nomenclature INNER JOIN description USING(id); +----+----------+---------------------+ | id | name | description | +----+----------+---------------------+ | 1 | Книга | Замечательная книга | | 3 | Карандаш | Красный карандаш | +----+----------+---------------------+