Урок 22

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


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

RIGHTJOIN объединение таблиц

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
яблоко фрукты
яблоко овощи
яблоко ягоды
груша фрукты
груша овощи
груша ягоды
помидор фрукты
помидор овощи
помидор ягоды
колбаса фрукты
колбаса овощи
колбаса ягоды

 



0 comments
Leave your comment: