Предложение SQLite Joins используется для объединения записей из двух или более таблиц в базе данных. JOIN — это средство для объединения полей из двух таблиц с использованием значений, общих для каждой.
SQL определяет три основных типа соединений:
- CROSS JOIN
- ВНУТРЕННЕЕ СОЕДИНЕНИЕ
- НАРУЖНОЕ СОЕДИНЕНИЕ
Прежде чем мы продолжим, давайте рассмотрим две таблицы КОМПАНИИ и ОТДЕЛЕНИЯ. Мы уже видели операторы INSERT для заполнения таблицы COMPANY. Итак, давайте предположим список записей, доступных в таблице COMPANY —
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
Другая таблица — ОТДЕЛ со следующим определением —
CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL );
Вот список операторов INSERT для заполнения таблицы DEPARTMENT —
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (2, 'Engineering', 2 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (3, 'Finance', 7 );
Наконец, у нас есть следующий список записей, доступных в таблице ОТДЕЛ —
ID DEPT EMP_ID ---------- ---------- ---------- 1 IT Billing 1 2 Engineering 2 3 Finance 7
CROSS JOIN
CROSS JOIN сопоставляет каждую строку первой таблицы с каждой строкой второй таблицы. Если входные таблицы имеют строки x и y соответственно, результирующая таблица будет иметь строку x * y. Поскольку CROSS JOINs могут генерировать очень большие таблицы, необходимо соблюдать осторожность, чтобы использовать их только тогда, когда это необходимо.
Ниже приводится синтаксис CROSS JOIN —
SELECT ... FROM table1 CROSS JOIN table2 ...
На основании приведенных выше таблиц вы можете написать CROSS JOIN следующим образом:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
Приведенный выше запрос даст следующий результат —
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Paul Engineering 7 Paul Finance 1 Allen IT Billing 2 Allen Engineering 7 Allen Finance 1 Teddy IT Billing 2 Teddy Engineering 7 Teddy Finance 1 Mark IT Billing 2 Mark Engineering 7 Mark Finance 1 David IT Billing 2 David Engineering 7 David Finance 1 Kim IT Billing 2 Kim Engineering 7 Kim Finance 1 James IT Billing 2 James Engineering 7 James Finance
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
INNER JOIN создает новую таблицу результатов, комбинируя значения столбцов двух таблиц (table1 и table2) на основе предиката соединения. Запрос сравнивает каждую строку таблицы table1 с каждой строкой таблицы table2, чтобы найти все пары строк, которые удовлетворяют предикату соединения. Когда предикат соединения удовлетворяется, значения столбцов для каждой соответствующей пары строк A и B объединяются в результирующую строку.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ является наиболее распространенным типом объединения по умолчанию. При желании вы можете использовать ключевое слово INNER.
Ниже приводится синтаксис INNER JOIN —
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
Чтобы избежать избыточности и сохранить сокращение фразы, условия INNER JOIN могут быть объявлены с помощью выражения USING . Это выражение указывает список из одного или нескольких столбцов.
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
NATURAL JOIN похож на JOIN … USING , только он автоматически проверяет равенство значений каждого столбца в обеих таблицах —
SELECT ... FROM table1 NATURAL JOIN table2...
Исходя из приведенных выше таблиц, вы можете написать INNER JOIN следующим образом:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
Приведенный выше запрос даст следующий результат —
EMP_ID NAME DEPT ---------- ---------- ---------- 1 Paul IT Billing 2 Allen Engineering 7 James Finance
НАРУЖНОЕ СОЕДИНЕНИЕ
OUTER JOIN — это расширение INNER JOIN. Хотя стандарт SQL определяет три типа OUTER JOIN: LEFT, RIGHT и FULL, SQLite поддерживает только LEFT OUTER JOIN .
У ВНЕШНИХ СОЕДИНЕНИЙ есть условие, идентичное ВНУТРЕННЫМ СОЕДИНЕНИЯМ, выраженное с помощью ключевого слова ON, USING или NATURAL. Исходная таблица результатов рассчитывается аналогично. Как только основной JOIN рассчитан, OUTER JOIN возьмет все несоединенные строки из одной или обеих таблиц, дополнит их значениями NULL и добавит их в результирующую таблицу.
Ниже приведен синтаксис LEFT OUTER JOIN —
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Чтобы избежать избыточности и сохранить сокращение фразы, условия OUTER JOIN могут быть объявлены с помощью выражения USING. Это выражение указывает список из одного или нескольких столбцов.
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
На основании приведенных выше таблиц вы можете написать внутреннее соединение следующим образом:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;
Приведенный выше запрос даст следующий результат —