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

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: MySQL

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

 

Но для начала быстрая напоминалка о 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 );
NSERT 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 (синонимы: JOIN и CROSS 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
по условию совпадению данных в этих строках

А теперь о трех таблицах

Если мы сделаем 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 не уникален, то результаты запросов будут совершенно иными.

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты