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
Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.