Шпаргалка по SQL JOINs. Часть #1

SQL (Structured Query Language) — это язык для работы с базами данных. Позволяет выбирать данные и строить сложные отчеты. Сегодня SQL стал универсальным языком данных.

Соединение таблиц

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

Как правило, одна таблица содержит первичный / уникальный ключ (primary / unique key) — столбец или набор столбцов, которые однозначно идентифицируют строки в этой таблице (например, столбец student_id в таблице student).

В другой таблице есть столбец (или столбцы), ссылающиеся на первичный ключ первой таблицы (например, столбец student_id в таблице hobby). Такие столбцы называются внешними ключами (foreign keys).
Условие JOIN — это равенство между столбцами первичного ключа в одной таблице и столбцами, которые на них ссылаются из другой таблицы.

hobby.idhobby.h_namehobby.s_id
1Чтение3
2ФутболNULL
3Блог1
4Блог4
5Чтение1
student.s_idstudent.s_name
1Иван
2Анна
3Петр
4Ирина

Оператор JOIN

Оператор JOIN (или INNER JOIN) возвращает все строки, соответствующие условию после оператора ON.

SELECT hobby.h_name,
       hobby.s_id AS s_id_1,
       student.s_id AS s_id_2,
       student.s_name
  FROM hobby JOIN student
  ON hobby.s_id = student.s_id;
h_names_id_1s_id_2s_name
Чтение33Петр
Блог11Иван
Блог44Ирина
Чтение11Иван

Существует также более старый синтаксис, но его использование не рекомендуется.
В нём таблицы перечисляются в разделе FROM, а условия соединения указываются в WHERE.

SELECT *
  FROM hobby, student
WHERE hobby.s_id = student.s_id;

Условие соединения

Условие JOIN не обязательно должно быть равенством — это может быть любое условие. Оператор JOIN не интерпретирует условие, а лишь проверяет, удовлетворяют ли строки заданному критерию.

Чтобы указать столбец в запросе JOIN, нужно использовать полное имя: сначала имя таблицы, затем точку (.) и имя столбца, например

... ON hobby.s_id = student.s_id

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


Оператор NATURAL JOIN

Если таблицы содержат столбцы с одинаковыми именами, вместо JOIN можно использовать NATURAL JOIN. Общий столбец появляется в результирующей таблице только один раз.
Примечание: NATURAL JOIN редко используется на практике.

SELECT *
  FROM hobby 
       NATURAL JOIN student
s_idhobby.idh_names_name
13БлогИван
15ЧтениеИван
31ЧтениеПетр
44БлогИрина

Оператор LEFT JOIN

Оператор LEFT JOIN возвращает все строки из левой таблицы вместе с соответствующими строками из правой таблицы. Если совпадений нет, недостающие значения заполняются пустотами (NULL значениями). Оператор LEFT JOIN также называют LEFT OUTER JOIN.

SELECT *
  FROM hobby 
    LEFT JOIN student 
    ON hobby.s_id = student.s_id
hobby.idh_names_ids_ids_name
1Чтение33Петр
3Блог11Иван
4Блог44Ирина
5Чтение11Иван
2ФутболNULLNULLNULL

Оператор RIGHT JOIN

Оператор RIGHT JOIN возвращает все строки из правой таблицы вместе с соответствующими строками из левой таблицы. Если совпадений нет, недостающие значения заполняются пустотами (NULL значениями). Оператор RIGHT JOIN также называют RIGHT OUTER JOIN.

SELECT *
  FROM hobby 
    RIGHT JOIN student 
    ON hobby.s_id = student.s_id
hobby.idh_names_ids_ids_name
5Чтение11Иван
3Блог11Иван
NULLNULLNULL2Анна
1Чтение33Петр
4Блог44Ирина

Оператор FULL JOIN

Оператор FULL JOIN возвращает все строки из левой таблицы и все строки из правой таблицы. Строки без совпадений заполняются пустотами (NULL значениями). FULL JOIN также называют FULL OUTER JOIN.

SELECT *
  FROM hobby 
    FULL JOIN student 
    ON hobby.s_id = student.s_id
hobby.idh_names_ids_ids_name
5Чтение11Иван
3Блог11Иван
NULLNULLNULL2Анна
1Чтение33Петр
4Блог44Ирина
2ФутболNULLNULLNULL

Оператор CROSS JOIN

Оператор CROSS JOIN возвращает все возможные комбинации строк из левой и правой таблиц.

SELECT *
  FROM hobby 
    CROSS JOIN student;

SELECT *
  FROM hobby, student;
hobby.idh_names_ids_ids_name
1Чтение31Иван
1Чтение32Анна
1Чтение33Петр
1Чтение34Ирина
2ФутболNULL1Иван
2ФутболNULL2Анна
2ФутболNULL3Петр
2ФутболNULL4Ирина
3Блог11Иван
3Блог12Анна
3Блог13Петр
3Блог14Ирина
4Блог41Иван
4Блог42Анна
4Блог43Петр
4Блог44Ирина
5Чтение11Иван
5Чтение12Анна
5Чтение13Петр
5Чтение14Ирина