Учебники

SQLite — СОЕДИНЯЕТСЯ

Предложение 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;

Приведенный выше запрос даст следующий результат —