
SQL (Structured Query Language) — это язык для работы с базами данных. Позволяет выбирать данные и строить сложные отчеты. Сегодня SQL стал универсальным языком данных.
Соединение таблиц
Оператор JOIN обычно объединяет строки с одинаковыми значениями по указанным столбцах.
Как правило, одна таблица содержит первичный / уникальный ключ (primary / unique key) — столбец или набор столбцов, которые однозначно идентифицируют строки в этой таблице (например, столбец student_id в таблице student).
В другой таблице есть столбец (или столбцы), ссылающиеся на первичный ключ первой таблицы (например, столбец student_id в таблице hobby). Такие столбцы называются внешними ключами (foreign keys).
Условие JOIN — это равенство между столбцами первичного ключа в одной таблице и столбцами, которые на них ссылаются из другой таблицы.
hobby.id | hobby.h_name | hobby.s_id |
---|---|---|
1 | Чтение | 3 |
2 | Футбол | NULL |
3 | Блог | 1 |
4 | Блог | 4 |
5 | Чтение | 1 |
student.s_id | student.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_name | s_id_1 | s_id_2 | s_name |
---|---|---|---|
Чтение | 3 | 3 | Петр |
Блог | 1 | 1 | Иван |
Блог | 4 | 4 | Ирина |
Чтение | 1 | 1 | Иван |
Существует также более старый синтаксис, но его использование не рекомендуется.
В нём таблицы перечисляются в разделе 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_id | hobby.id | h_name | s_name |
---|---|---|---|
1 | 3 | Блог | Иван |
1 | 5 | Чтение | Иван |
3 | 1 | Чтение | Петр |
4 | 4 | Блог | Ирина |
Оператор LEFT JOIN
Оператор LEFT JOIN возвращает все строки из левой таблицы вместе с соответствующими строками из правой таблицы. Если совпадений нет, недостающие значения заполняются пустотами (NULL значениями). Оператор LEFT JOIN также называют LEFT OUTER JOIN.
SELECT *
FROM hobby
LEFT JOIN student
ON hobby.s_id = student.s_id
hobby.id | h_name | s_id | s_id | s_name |
---|---|---|---|---|
1 | Чтение | 3 | 3 | Петр |
3 | Блог | 1 | 1 | Иван |
4 | Блог | 4 | 4 | Ирина |
5 | Чтение | 1 | 1 | Иван |
2 | Футбол | NULL | NULL | NULL |
Оператор RIGHT JOIN
Оператор RIGHT JOIN возвращает все строки из правой таблицы вместе с соответствующими строками из левой таблицы. Если совпадений нет, недостающие значения заполняются пустотами (NULL значениями). Оператор RIGHT JOIN также называют RIGHT OUTER JOIN.
SELECT *
FROM hobby
RIGHT JOIN student
ON hobby.s_id = student.s_id
hobby.id | h_name | s_id | s_id | s_name |
---|---|---|---|---|
5 | Чтение | 1 | 1 | Иван |
3 | Блог | 1 | 1 | Иван |
NULL | NULL | NULL | 2 | Анна |
1 | Чтение | 3 | 3 | Петр |
4 | Блог | 4 | 4 | Ирина |
Оператор FULL JOIN
Оператор FULL JOIN возвращает все строки из левой таблицы и все строки из правой таблицы. Строки без совпадений заполняются пустотами (NULL значениями). FULL JOIN также называют FULL OUTER JOIN.
SELECT *
FROM hobby
FULL JOIN student
ON hobby.s_id = student.s_id
hobby.id | h_name | s_id | s_id | s_name |
---|---|---|---|---|
5 | Чтение | 1 | 1 | Иван |
3 | Блог | 1 | 1 | Иван |
NULL | NULL | NULL | 2 | Анна |
1 | Чтение | 3 | 3 | Петр |
4 | Блог | 4 | 4 | Ирина |
2 | Футбол | NULL | NULL | NULL |
Оператор CROSS JOIN
Оператор CROSS JOIN возвращает все возможные комбинации строк из левой и правой таблиц.
SELECT *
FROM hobby
CROSS JOIN student;
SELECT *
FROM hobby, student;
hobby.id | h_name | s_id | s_id | s_name |
---|---|---|---|---|
1 | Чтение | 3 | 1 | Иван |
1 | Чтение | 3 | 2 | Анна |
1 | Чтение | 3 | 3 | Петр |
1 | Чтение | 3 | 4 | Ирина |
2 | Футбол | NULL | 1 | Иван |
2 | Футбол | NULL | 2 | Анна |
2 | Футбол | NULL | 3 | Петр |
2 | Футбол | NULL | 4 | Ирина |
3 | Блог | 1 | 1 | Иван |
3 | Блог | 1 | 2 | Анна |
3 | Блог | 1 | 3 | Петр |
3 | Блог | 1 | 4 | Ирина |
4 | Блог | 4 | 1 | Иван |
4 | Блог | 4 | 2 | Анна |
4 | Блог | 4 | 3 | Петр |
4 | Блог | 4 | 4 | Ирина |
5 | Чтение | 1 | 1 | Иван |
5 | Чтение | 1 | 2 | Анна |
5 | Чтение | 1 | 3 | Петр |
5 | Чтение | 1 | 4 | Ирина |