MySQL отличие LEFT от INNER

Очень подробно про джоины написано тут

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

Но для начала быстрая напоминалка о LEFT и INNER джоинах.

Допустим есть 2 таблицы alpha и beta. 

alpha

id nameA
1 mama
2 papa
3 ya

beta

id nameB
2 Pirate
3 Monkey

CREATE TABLE alpha (
id int(11) DEFAULT NULL,
nameA varchar(50) DEFAULT NULL );
INSERT INTO alpha(id, nameA) VALUES (1, 'mama'), (2, 'papa'), (3, 'ya');

CREATE TABLE beta (
id int(11) DEFAULT NULL,
nameB varchar(50) DEFAULT NULL );
INSERT INTO beta(id, nameB) VALUES (2, 'Pirate'), (3, 'Monkey');


Запрос c LEFT JOIN вернет все 3 строки из таблицы alpha, объединив их по id с таблицей beta, а недостающие значения заполнит NULL:

SELECT * FROM alpha LEFT JOIN beta USING (id) или SELECT * FROM alpha LEFT JOIN beta ON beta.id = alpha.id


id nameA nameB
1 mama NULL
2 papa Pirate
3 ya Monkey

     mysql left join

   


пояснение: показать строки таблицы alpha
и подходящие этим строкам данные


Запрос c INNER JOIN вернет 2 строки c id которые есть в обеих таблицах:

SELECT * FROM alpha INNER JOIN beta ON beta.id = alpha.id

 

id nameA nameB
2 papa Pirate
3 ya Monkey

     mysql inner join

   


пояснение: показать строки таблиц alpha и beta
по условию совпадению данных в этих строках


Теперь добавим еще одну строку с уже существующим id:

3 - INSERT INTO beta (id, nameB) VALUES (3, 'Ship');

INNER JOIN:

id nameA nameB
2 papa Pirate
3 ya Monkey
3 ya Ship

   

LEFT JOIN:

id nameA nameB
1 mama NULL
2 papa Pirate
3 ya Monkey
3 ya Ship

   

 

 

Как мы видим данные из таблицы alfa появились в третьей строке, лично мое мнение - третья строка не должна появляться при INNER JOIN, такое должно быть только при FULL OUTER JOIN.

ВАЖНО:

INNER JOIN является разновидностю JOIN (CROSS JOIN), и никак не является синонимом. Хотя выполнив запрос Вы получите одинаковый результат, логика работы операторов - разная: 

CROSS JOIN - перекрестно связывает каждую строку таблицы alpha с каждой строкой таблицы beta, а затем выполняет условие where (таким образом создается большая временная таблица по которой затем делается выборка согласно where в результате чего получается результирующая таблица)

INNER JOIN - перекрестно связывает каждую строку таблицы alpha с каждой строкой таблицы beta при этом сразу же учитывая условие where  (таким образом сразу создается результерующая таблица)


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

Например таблица

gamma

id nameG
1 lazer

CREATE TABLE gamma (
id int(11) DEFAULT NULL,
nameG varchar(50) DEFAULT NULL );
INSERT INTO gamma(id, nameG) VALUES (1, 'lazer');

В итоге, если мы сделаем запрос:

SELECT * 
FROM alpha 
INNER JOIN beta ON beta.id = alpha.id
INNER JOIN gamma ON gamma.id = beta.id

То в ответе получим ноль строк, потому что:

  1. в предыдущем запросе мы получили beta.id равные 2 и 3
  2. а в этом запросе говорим MySQL-ю: покажи нам строки в которых gamma.id = beta.id т.е. gamma.id = 2 или gamma.id = 3
  3. но ведь в таблице gamma нет строк с id = 2 или 3

Различие указания вариантов условий при LEFT JOIN

Создадим еще одну таблицу omega:

id z nameO
1 1 N1
2 1 N2
3 2 N3
    

CREATE TABLE omega (
id int(11) DEFAULT NULL,
z int(11) DEFAULT NULL,
nameO varchar(50) DEFAULT NULL );

   

INSERT INTO omega(id, z, nameO) VALUES
(1, 1, 'N1'),(2, 1, 'N2'),(3, 2, 'N3');

А теперь выполним 2 казалось бы одинаковых запроса:

SELECT * FROM alpha
LEFT JOIN omega ON omega.id = alpha.id
WHERE omega.z = 1

SELECT * FROM alpha
LEFT JOIN omega ON omega.id = alpha.id
AND omega.z = 1

id nameA id1 z nameO
1 mama 1 1 N1
2 papa 2 1 N2

 

id nameA id1 z nameO
1 mama 1 1 N1
2 papa 2 1 N2
3 ya null null null
WHERE указывает какие строки показать
(срабатывает после JOIN-a)
AND указывает какие строки присоединить
(срабатывает во время JOIN-a)

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

p.s. имейте ввиду, что в этой статье столбец id уникален в рамках своей таблицы. Т.е. если в Ваших таблицах столбец id не уникален, то результаты запросов будут совершенно иными.

А на последок, диаграмма, поясняющая работу JOIN-ов:

MySQL отличие LEFT от INNER

Оцени публикацию:
  • 8,38
Оценили человек: 8

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2017 YaPro.Ru

Главная » Веб-мастеру » MySQL »