Joins SQLite

В этом учебном пособии вы узнаете, как использовать SQLite JOINS (inner и outer) с синтаксисом и примерами.

Описание

SQLite JOINS используются для извлечения данных из нескольких таблиц. SQLite JOIN выполняется всякий раз, когда две или более таблицы объединяются в операторе SQL.
Существуют различные типы SQLite JOIN:

Подсказка. В SQLite не поддерживаются RIGHT OUTER JOIN и FULL OUTER JOIN.

Итак, давайте обсудим синтаксис SQLite JOIN, рассмотрим наглядные иллюстрации SQLite JOINS и рассмотрим некоторые примеры.

INNER JOIN (Простое соединение)

SQLite INNER JOIN это самый распространенный тип объединения. SQLite INNER JOINS возвращают все строки из нескольких таблиц, где выполняется условие соединения.

Синтаксис

Синтаксис INNER JOIN в SQLite:

SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

Рисунок

На этом рисунке SQLite INNER JOIN возвращает затененную область:

inner-join

SQLite INNER JOIN будет возвращать записи, где пересекаются table1 и table2.

Пример

Вот пример SQLite INNER JOIN:

В этом SQLite примере INNER JOIN будут возвращены все строки из таблиц employees и positions, где в таблицах employees и positions есть совпадающее значение position_id.

Давайте посмотрим на некоторые данные, чтобы понянть, как работает INNER JOINS:

У нас есть таблица с именем employee и четырьмя полями (employee_id, last_name, first_name и position_id). Она содержит следующие данные:

employee_id last_name first_name position_id
10000 Petrov Alex 1
10001 Ivanov Max 2
10002 Sidorov Piter 3
10003 Nikonov Simon

У нас есть еще одна таблица с названием position с двумя полями (position_id и title). Она содержит следующие данные:

position_id title
1 Manager
2 Project Planner
3 Programmer
4 Data Analyst

Если мы запустим SQLite оператор SELECT (который содержит INNER JOIN) ниже:

Наш результирующий набор будет выглядеть так:

employee_id last_name title
10000 Petrov Manager
10001 Ivanov Project Planner
10002 Sidorov Programmer

Строка для employee_id 10003 из таблицы employees была бы опущена, так как соответствующий position_id не существует в таблице positions. Строка для position_id, равная 4, из таблицы positions будет опущена, поскольку этот positions не существует в таблице employees.

Старый синтаксис

В заключение следует отметить, что приведенный выше пример SQLite INNER JOIN можно переписать с использованием более старого неявного синтаксиса следующим образом (но мы все же рекомендуем использовать синтаксис ключевого слова INNER JOIN):

LEFT OUTER JOIN

Другой тип объединения SQLite называется LEFT OUTER JOIN. Этот тип соединения возвращает все строки из таблиц с левосторонним соединением, указанным в условии ON, и только те строки из другой таблицы, где объединяемые поля равны (выполняется условие объединения).

Синтаксис

Синтаксис SQLite LEFT OUTER JOIN:

SELECT columns
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column = table2.column;

Рисунок

На этом рисунке SQLite LEFT OUTER JOIN возвращает затененную область:
left-outer-join

SQLite LEFT OUTER JOIN возвращает все записи из table1 и только те записи из table2, которые пересекаются с table1.

Пример

Вот пример SQLite LEFT OUTER JOIN:

В этом примере LEFT OUTER JOIN будут возвращены все строки из таблицы employees и только те строки из таблицы positions, где объединенные поля равны.

Если значение position_id в таблице employees не существует в таблице positions, все поля в таблице positions будут отображаться как в результирующем наборе.

Давайте посмотрим на некоторые данные, чтобы понять, как работает LEFT OUTER JOINS:

У нас есть таблица с employee и четырьмя полями (employee_id, last_name, first_name и position_id). Она содержит следующие данные:

employee_id last_name first_name position_id
10000 Petrov Alex 1
10001 Ivanov Max 2
10002 Sidorov Piter 3
10003 Nikonov Simon

У нас есть вторая таблица с position и двумя полями (position_id и title). Она содержит следующие данные:

position_id title
1 Manager
2 Project Planner
3 Programmer
4 Data Analyst

Если мы запустим оператор SELECT (который содержит LEFT OUTER JOIN) ниже:

Наш результирующий набор будет выглядеть так:

employee_id last_name title
10000 Petrov Manager
10001 Ivanov Project Planner
10002 Sidorov Programmer
10003 Nikonov

Строка для employee_id = 10003 будет включена, поскольку был использован LEFT OUTER JOIN. Однако вы заметите, что поле заголовка для этой записи содержит значение , поскольку в таблице positions нет соответствующей строки.

CROSS JOIN

Другой тип SQLite объединения называется CROSS JOIN. Этот тип объединения возвращает комбинированный результирующий набор с каждой строкой из первой таблицы, сопоставленной с каждой строкой из второй таблицы. Это также называется декартовым произведением.

Синтаксис

Синтаксис для SQLite CROSS JOIN:

SELECT columns
FROM table1
CROSS JOIN table2;

Подсказка. В отличие от соединения INNER или OUTER, CROSS JOIN не имеет условий для объединения двух таблиц.

Рисунок

На этом рисунке SQLite CROSS JOIN возвращает каждую строку из table1, соответствующую каждой строке из table2.
CROSS-JOIN

Пример

Вот пример SQLite CROSS JOIN:

Этот пример CROSS JOIN вернул бы все строки из таблицы departments, соответствующие всем строкам из таблицы positions.

Давайте рассмотрим некоторые данные, чтобы объяснить, как работает CROSS JOINS:

У нас есть таблица positions содержащая следующие данные:

position_id title
1 Manager
2 Project Planner
3 Programmer
4 Data Analyst

У нас есть вторая таблица под названием departments со следующими данными:

department_id department_name
30 HR
999 Sales

Если мы запустим запрос SELECT (который содержит CROSS JOIN) ниже:

Наш результирующий набор будет выглядеть так:

position_id title department_id department_name
1 Manager 30 HR
1 Manager 999 Sales
2 Project Manager 30 HR
2 Project Manager 999 Sales
3 Programmer 30 HR
3 Programmer 999 Sales
4 Data Analyst 30 HR
4 Data Analyst 999 Sales

Поскольку таблица positions имеет 4 строки, а departments - 2 строки, перекрестное соединение вернет 8 строк (потому что 4x2 = 8). Каждая строка таблицы positions сопоставляется с каждой строкой таблицы departments.