Данная статья будет полезна новичкам и поможет в освоении оператора JOIN и в этом примере он будет рассмотрен в контексте языка T-SQL. Для визуализации работы запросов были также использованы диаграммы Венна, которые, как я надеюсь помогут вникнуть в смысл JOIN-ов. Для начала работы над примерами - предположим, что у нас есть 2 таблицы ('Таблица_1' слева и 'Таблица_2' справа), давайте заполним их тестовыми данными:
Таблица_1 |
Таблица_2 |
id |
name |
id |
name |
-- |
---- |
-- |
---- |
1 |
Машина |
1 |
Паром |
2 |
Грузовик |
2 |
Машина |
3 |
Самолет |
3 |
Велосипед |
4 |
Поезд |
4 |
Самолет |
Теперь, когда мы разобрались с условностями - можно переходить к рассмотрению примеров:
1. INNER JOIN выводит только те записи, которые совпадают в обеих таблицах
SELECT * FROM Table_1
INNER JOIN Table_2
ON Table_1.name = Table_2.name
Результат работы запроса:
id |
|
name |
id |
name |
-- |
|
---- |
-- |
---- |
1 |
|
Машина |
2 |
Машина |
3 |
|
Самолет |
4 |
Самолет |
|
|
|
2. FULL OUTER JOIN выводит набор записей, которые совпадают в обеих таблицах (с двух сторон), там, где нет совпадения вставляется значение NULL (сравнение записей ведется с Таблицей_1, т.е. той, что с левой стороны).
SELECT * FROM Table_1
FULL OUTER JOIN Table_2
ON Table_1.name = Table_2.name
Результат работы запроса:
id |
|
name |
id |
name |
-- |
|
---- |
-- |
---- |
1 |
|
Машина |
2 |
Машина |
2 |
|
Грузовик |
NULL |
NULL |
3 |
|
Самолет |
4 |
Самолет |
4 |
|
Поезд |
NULL |
NULL |
NULL |
|
NULL |
1 |
Паром |
NULL |
|
NULL |
3 |
Велосипед |
|
|
|
3. LEFT OUTER JOIN выводит полный набор записей из первой таблицы (в нашем случае Таблица_1), и совпадающие записи (где это возможно) со второй таблицы (Таблица_2). Если совпадений нет - в поле вставляется значение NULL.
SELECT * FROM Table_1
LEFT OUTER JOIN Table_2
ON Table_1.name = Table_2.name
id |
|
name |
id |
name |
-- |
|
---- |
-- |
---- |
1 |
|
Машина |
2 |
Машина |
2 |
|
Грузовик |
NULL |
NULL |
3 |
|
Самолет |
4 |
Самолет |
4 |
|
Поезд |
NULL |
NULL |
|
|
|
4. RIGHT OUTER JOIN выводит полный набор записей из второй таблицы (в нашем случае Таблица_1), и совпадающие записи (где это возможно) из первой таблицы (Таблица_1). Если совпадений нет - в поле вставляется значение NULL. Как мы видим этот оператор похож на предыдущий, только в данном случае "ведущей" будет вторая таблица (с правой стороны).
SELECT * FROM Table_1
RIGHT OUTER JOIN Table_2
ON Table_1.name = Table_2.name
id |
|
name |
id |
name |
-- |
|
---- |
-- |
---- |
NULL |
|
NULL |
1 |
Паром |
1 |
|
Машина |
2 |
Машина |
NULL |
|
NULL |
3 |
Велосипед |
3 |
|
Самолет |
4 |
Самолет |
|
|
|
5. Извлечение уникальных записей из таблицы посредством оператора WHERE. В данном примере мы выведем только те записи из Таблицы_1, которых нет в Таблице_2.
SELECT * FROM Table_1
LEFT OUTER JOIN Table_2
ON Table_1.name = Table_2.name
WHERE Table_2.id IS null
id |
|
name |
id |
name |
-- |
|
---- |
-- |
---- |
2 |
|
Грузовик |
NULL |
NULL |
4 |
|
Поезд |
NULL |
NULL |
|
|
|
6. Извлечение уникальных записей из обеих таблиц посредством оператора WHERE. В данном примере мы выведем уникальные записи из Таблицы_1 и Таблицы_2.
SELECT * FROM Table_1
FULL OUTER JOIN Table_2
ON Table_1.name = Table_2.name
WHERE Table_1.id IS null
OR Table_2.id IS null
id |
|
name |
id |
name |
-- |
|
---- |
-- |
---- |
2 |
|
Грузовик |
NULL |
NULL |
4 |
|
Поезд |
NULL |
NULL |
NULL |
|
NULL |
1 |
Паром |
NULL |
|
NULL |
3 |
Велосипед |
|
|
|
7. CROSS JOIN. Для полноты изложения материала следует упомянуть еще об одном операторе - CROSS JOIN. Этот оператор используется довольно редко и для визуального представления нет подходящей диаграммы Венна. С помощью CROSS JOIN-а мы можем сделать перекрестную выборку всех записей из обеих таблиц (Таблицы_1 и Таблицы_2) и в нашем случае мы получим 4х4=16 строк данных. Возьмите на заметку, что лучше не применять этот опреатор для больших таблиц, т.к. это может серьезно повлиять на производительность СУБД.
SELECT * FROM Table_1
CROSS JOIN Table_2
|
|
|