[Developer's community]

Оператор JOIN для чайников

 

21 January 2011
Данная статья будет полезна новичкам и поможет в освоении оператора JOIN и  в этом примере он б

Данная статья будет полезна новичкам и поможет в освоении оператора 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