Руководство по SQL. Слияние данных.

Для комбинирования данных из двух или более таблиц базы данных (далее – БД), в языке SQL используется механизм объединения (join). Он объединяет определённые поля в указанных таблицах БД и выводит необходимый нам результат.

Предположим, что у нас есть две таблицы:

developers


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          3 |   2500 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
|  6 | Kolya Nikolaev    | Javascript |          5 |   3400 |
|  7 | Ivan Ivanov       | C#         |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+

projects


+---------+-------------+------------------+------------+--------------+
| TASK_ID | TASK_NAME   | DESCRIPTION      | DEADLINE   | DEVELOPER_ID |
+---------+-------------+------------------+------------+--------------+
|       1 | Bug#123     | Fix company list | 2016-06-03 |            1 |
|       2 | Bug#321     | Fix registration | 2016-06-06 |            2 |
|       3 | Feature#777 | Latest actions   | 2016-06-25 |            3 |
+---------+-------------+------------------+------------+--------------+

Попробуем выполнить следующий запрос:


mysql> SELECT ID, NAME, TASK_NAME DESCRIPTION, DEADLINE 
FROM developers, tasks 
WHERE developers.ID = tasks.DEVELOPER_ID ;

В итоге мы увидим следующий результат:


+----+-------------------+-------------+------------+
| ID | NAME              | DESCRIPTION | DEADLINE   |
+----+-------------------+-------------+------------+
|  1 | Eugene Suleimanov | Bug#123     | 2016-06-03 |
|  2 | Peter Romanenko   | Bug#321     | 2016-06-06 |
|  3 | Andrei Komarov    | Feature#777 | 2016-06-25 |
+----+-------------------+-------------+------------+

Мы также можем усложнить запрос для того, чтобы получить все задания определённого разработчика:


mysql> SELECT ID, NAME, TASK_NAME DESCRIPTION, DEADLINE 
FROM developers, tasks WHERE developers.ID = tasks.DEVELOPER_ID 
AND developers.ID = 1;

Результатом данного запроса станет следующее:


+----+-------------------+-------------+------------+
| ID | NAME              | DESCRIPTION | DEADLINE   |
+----+-------------------+-------------+------------+
|  1 | Eugene Suleimanov | Bug#123     | 2016-06-03 |
+----+-------------------+-------------+------------+

Другими словами, мы можем использовать весь арсенал условных запросов при объединении таблиц.


Виды объединений (JOIN)

  • INNER JOIN:
    возвращает записи, когда имеются совпадения в обоих таблицах
  • LEFT JOIN:
    возвращает записи из левой таблицы даже если нет совпадений в правой.
  • RIGHT JOIN:
    возвращает все записи из правой таблицы, даже если нет совпадений в левой.
  • FULL JOIN:
    возвращает записи, когда есть совпадение, хотя бы в одной из таблиц.
  • SELF JOIN:
    используется для объединения таблицы с ней самой, таким образом, как будто первая таблица является и второй, временно переименовывая хотя бы одну из таблиц в SQL запросе.

На этом мы заканчиваем изучение способов объединения таблиц.

В следующей статье мы рассмотрим такую сущность, как объединения (UNIONS).