SQLite JOIN
ПредложениеJOINв SQLite используется для объединения записей из таблиц в двух или более базах данных. JOIN — это способ объединения полей из двух таблиц с помощью общих значений.
SQL определяет три основных типа соединений:
Перекрестное соединение - CROSS JOIN
Внутреннее соединение - INNER JOIN
Внешнее соединение - OUTER JOIN
Прежде чем продолжить, предположим, что есть две таблицы: COMPANY и DEPARTMENT. Мы уже видели операторы 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
Другая таблица — DEPARTMENT, определённая следующим образом:
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 );
Наконец, у нас есть следующий список записей в таблице DEPARTMENT:
ID DEPT EMP_ID ---------- ---------- ---------- 1 IT Billing 1 2 Engineerin 2 3 Finance 7
Перекрестное соединение - CROSS JOIN
CROSS JOIN сопоставляет каждую строку первой таблицы с каждой строкой второй таблицы. Если две входные таблицы содержат соответственно x и y строк, результирующая таблица содержит x*y строк. Поскольку CROSS JOIN может создавать очень большие таблицы, его следует использовать осторожно и только когда это уместно.
Операция перекрёстного соединения возвращает декартово произведение всех строк данных из двух соединяемых таблиц. Количество возвращаемых строк данных равно количеству строк данных в первой таблице, удовлетворяющих условиям запроса, умноженному на количество строк данных во второй таблице, удовлетворяющих условиям запроса.
Ниже приведён синтаксис 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 Engineerin 7 Paul Finance 1 Allen IT Billing 2 Allen Engineerin 7 Allen Finance 1 Teddy IT Billing 2 Teddy Engineerin 7 Teddy Finance 1 Mark IT Billing 2 Mark Engineerin 7 Mark Finance 1 David IT Billing 2 David Engineerin 7 David Finance 1 Kim IT Billing 2 Kim Engineerin 7 Kim Finance 1 James IT Billing 2 James Engineerin 7 James Finance
Внутреннее соединение - INNER JOIN
INNER JOIN создаёт новую результирующую таблицу, объединяя значения столбцов двух таблиц (table1 и table2) на основе предиката соединения. Запрос сравнивает каждую строку в table1 с каждой строкой в table2, находя все совпадающие пары строк, удовлетворяющие предикату соединения. Когда предикат соединения выполняется, значения столбцов каждой совпадающей пары строк A и B объединяются в результирующую строку.
INNER JOIN — наиболее распространённый тип соединения и тип соединения по умолчанию. Ключевое слово INNER необязательно.
Ниже приведён синтаксис INNER JOIN:
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
Чтобы избежать избыточности и сократить формулировку, можно использоватьUSINGвыражение, чтобы объявить условие INNER JOIN. Это выражение задаёт список из одного или нескольких столбцов:
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 Engineerin 7 James Finance
Внешнее соединение - OUTER JOIN
OUTER JOIN является расширением INNER JOIN. Хотя стандарт SQL определяет три типа внешних соединений: LEFT, RIGHT и FULL, SQLite поддерживает толькоLEFT OUTER JOIN。
Способ, которым OUTER JOIN объявляет условия, такой же, как в INNER JOIN, с использованием ключевых слов ON, USING или NATURAL. Начальная таблица результатов вычисляется таким же образом. Как только основной расчет соединения завершен, OUTER JOIN добавляет любые несоединенные строки из одной или обеих таблиц, используя значения NULL для столбцов внешнего соединения, и присоединяет их к таблице результатов.
Ниже приведен синтаксис LEFT OUTER JOIN:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Чтобы избежать избыточности и сделать формулировку короче, вы можете использоватьUSINGвыражение для объявления условия OUTER JOIN. Это выражение задает список из одного или нескольких столбцов:
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...
На основе приведенных выше таблиц мы можем записать OUTER JOIN следующим образом:
sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
Приведённый выше запрос даст следующий результат:
EMP_ID NAME DEPT
---------- ---------- ----------
1 Paul IT Billing
2 Allen Engineerin
Teddy
Mark
David
Kim
7 James Finance
Другие расширения