Статьи / MySQL


JOIN

Выборку будем делать из двух таблиц

id name id name
-- ---- -- ----
1 Яблоко 1 Тыква
2 Ананас 2 Яблоко
3 Банан 3 Дыня
4 Груша 4 Банан



INNER JOIN


inner join mysql

SELECT * FROM tableA INNER JOIN tableB ON tableA.name = tableB.name

id name id name
-- ---- -- ----
1 Яблоко 2 Яблоко
3 Банан 4 Банан

Выбираются только те записи, которые совпадают в обоих таблицах.

---------------------------------------------------------------



LEFT OUTER JOIN


left outer join mysql

SELECT * FROM tableA LEFT OUTER JOIN tableB ON tableA.name = tableB.name

id name id name
-- ---- -- ----
1 Яблоко 2 Яблоко
2 Ананас null null
3 Банан 4 Банан
4 Груша null null


Все записи из таблицы А и совпавшие записи из таблицы B. Если совпадение отсутствует, то правая сторона будет содержать значение null, т.к. управляющая таблица левая, об этом говорит ключевое слово LEFT.

---------------------------------------------------------------



LEFT OUTER JOIN WHERE B id IS NULL


left outer join mysql is null

SELECT * FROM tableA LEFT OUTER JOIN tableB ON tableA.name = tableB.name
WHERE tableB.id IS null

id name id name
-- ---- -- ----
2 Ананас null null
4 Груша null null


Уникальные в А. Записи из таблицы А, которые не совпадают с записями из таблицы В.



Если немного изменить запрос, то получим уникальные записи из таблицы B.
right outer join mysql is null

SELECT * FROM tableA RIGHT OUTER JOIN tableB ON tableA.name = tableB.name
WHERE tableA.id IS null

id name id name
-- ---- -- ----
null null 1 Тыква
null null 3 Дыня


---------------------------------------------------------------



FULL OUTER JOIN


full outer join mysql

SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.name = tableB.name

id name id name
-- ---- -- ----
1 Яблоко 2 Яблоко
2 Ананас null null
3 Банан 4 Банан
4 Груша null null
null null 1 Тыква
null null 3 Дыня

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

---------------------------------------------------------------



FULL OUTER JOIN WHERE A or B id IS NULL


left outer join mysql is null is null

SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.name = tableB.name
WHERE tableA.id IS null OR tableB.id IS null

id name id name
-- ---- -- ----
2 Ананас null null
4 Груша null null
null null 1 Тыква
null null 3 Дыня

Уникальные в обоих.

Статья основана на материалах: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html