SQL: все виды джойнов

Author: Tatyana Milkina

1. Виды связей между таблицами

  • Один-к-одному (1:1) – в каждый момент времени каждому кортежу отношения А соответствует 1 или 0 кортежей отношения В.
  • Один-ко-многим (1:М) – в каждый момент времени каждому кортежу отношения А соответствует 0, 1 или несколько кортежей отношения В.
  • Многие-ко-многим (M:N) – связи между отношениями А и В существуют в обоих направлениях.

Виды связей между таблицами фото

2. Типы SQL объединений

При разработке веб-проектов с участием базы данных нам часто необходимо в запросах объединять таблицы базы, чтобы получить необходимые данные.

  • INNER JOIN — внутреннее (перекрёстное) объединение;
  • LEFT JOIN — левостороннее внешнее объединение;
  • RIGHT JOIN — правостороннее внешнее объединение;
  • декартово произведение.

SQL объединения фото

Соответствующие понятия в теории множеств:

Теория множеств фото

Рассмотрим объединения на примере. Допустим у нас есть две связанные таблицы:

tableA
id name type
1 яблоко 1
2 груша 1
3 помидор 2
4 колбаса 0
tableB
id name
1 фркуты
2 овощи
3 ягоды

3. INNER JOIN

Выбираются только те записи, которые совпадают в обеих таблицах. CROSS JOIN или JOIN — это эквивалент INNER JOIN.

INNER JOIN объединение таблиц фото

SELECT tableA.name as food,tableB.name as food_type
FROM tableA INNER JOIN tableB 
ON tableA.type = tableB.id

INNER JOIN можно заменить условием объединения в WHERE:

SELECT tableA.name as food,tableB.name as food_type 
FROM tableA, tableB 
WHERE tableA.type = tableB.id
Результат
food food_type
яблоко фрукты
груша фрукты
помидор овощи

4. LEFT JOIN

LEFT OUTER JOIN (LEFT JOIN) указывает, что левая таблица управляющая (в нашем случае TableA) и производит из нее полную выборку, осуществляя поиск соответствующих записей в таблице TableB. Если таких соответствий не найдено, то база вернет пустой указатель - NULL. Указание OUTER - не обязательно.

LEFT JOIN объединение таблиц фото

SELECT tableA.name as food, tableB.name as food_type 
FROM tableA LEFT JOIN tableB 
ON tableA.type = tableB.id
Результат
food food_type
яблоко фрукты
груша фрукты
помидор овощи
колбаса NULL

5. LEFT OUTER JOIN WHERE tableB id IS NULL

Чтобы произвести выборку записей из таблицы TableA, которых не существует в таблице TableB, мы выполняем LEFT JOIN. Но затем из результата исключаем записи, которые не хотим видеть, путем указания, что TableB.id является нулем (указывая, что записи нет в таблице TableB).

LEFT JOIN объединение таблиц WHERE tableB id IS NULL фото

SELECT tableA.name as food, tableB.name as food_type
FROM tableA LEFT JOIN tableB 
ON tableA.type = tableB.id 
WHERE tableB.id IS null
Результат
food food_type
колбаса NULL

6. RIGHT JOIN

RIGHT JOIN выполняет те же самые функции, что и LEFT JOIN, за исключением того, что правая таблица будет прочитана первой. Таким образом, если в запросах из предыдущей главы LEFT заменить на RIGHT, то таблица результатов, грубо говоря, отразится по вертикали. То есть, в результате вместо значений TableA будут записи TableB и наоборот.

RIGHT JOIN объединение таблиц фото

SELECT tableA.name as food,tableB.name as food_type
FROM tableA RIGHT OUTER JOIN tableB 
ON tableA.type = tableB.id
Результат
food food_type
яблоко фрукты
груша фрукты
помидор овощи
NULL ягоды

6. Декартово произведение

При декартовом произведении (CARTESIAN JOIN) каждая строка из первой таблицы соединяется с каждой строкой второй таблицы.

SELECT tableA.name as food,tableB.name as food_type
FROM tableA, tableB
Декартово произведение
food food_type
яблоко фрукты
яблоко овощи
яблоко ягоды
груша фрукты
груша овощи
груша ягоды
помидор фрукты
помидор овощи
помидор ягоды
колбаса фрукты
колбаса овощи
колбаса ягоды

 

Курс 'Java для начинающих' на Udemy Курс 'Java для начинающих' на Udemy
Читайте также:
Комментарии