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

2. Типы SQL объединений
При разработке веб-проектов с участием базы данных нам часто необходимо в запросах объединять таблицы базы, чтобы получить необходимые данные.
- INNER JOIN — внутреннее (перекрёстное) объединение;
- LEFT JOIN — левостороннее внешнее объединение;
- RIGHT JOIN — правостороннее внешнее объединение;
- декартово произведение.

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

Рассмотрим объединения на примере. Допустим у нас есть две связанные таблицы:
| id | name | type |
| 1 | яблоко | 1 |
| 2 | груша | 1 |
| 3 | помидор | 2 |
| 4 | колбаса | 0 |
| id | name |
| 1 | фркуты |
| 2 | овощи |
| 3 | ягоды |
3. INNER JOIN
Выбираются только те записи, которые совпадают в обеих таблицах. CROSS JOIN или 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 - не обязательно.

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).

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 и наоборот.

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
Please log in or register to have a possibility to add comment.