Секция FROM, логическое связывание таблиц
Перечь таблиц, из которых производится выборка данных, указывается в секции FROM. Выборка возможна как из одной таблицы, так и из нескольких логически взаимосвязанных. Логическая взаимосвязь осуществляется с помощью подсекции JOIN. На каждую логическую связь пишется отдельная подсекция. Внутри подсекции указывается условие связи двух таблиц (обычно по условию равенства первичных и вторичных ключей). Примеры для модели данных Сотрудники-Отделы-Города:
Employees | ||||
TabNum | Name | ![]() | DeptNum | Salary |
Иванов | Начальник | |||
Петров | Инж. | |||
Сидоров | Менеджер |
Departments | ||
![]() | City | Name |
Производственный отдел | ||
Отдел продаж |
Cities | |
City | Name |
Минск | |
Москва |
SELECTEmployees.TabNum, Employees.Name,Departments.Name
FROMEmployees
JOINDepartmentsONEmployees.DeptNum =
Departments.DeptNum
Результат запроса будет выглядеть следующим образом:
Иванов | Производственный отдел | |
Петров | Производственный отдел | |
Сидоров | Отдел продаж |
SELECTEmployees.TabNum, Employees.Name, Departments.Name, Cities.Name
FROMEmployees
JOINDepartmentsONEmployees.DeptNum = Departments.DeptNum
JOINCitiesONDepartments.City = Cities.City
Результат запроса будет выглядеть следующим образом:
Иванов | Производственный отдел | Минск | |
Петров | Производственный отдел | Минск | |
Сидоров | Отдел продаж | Москва |
Пример связывания таблиц по нескольким полям:
SELECTTable1.Field1, Table2.Field2
FROM Table1
JOINTable2
ONTable2.ID1 =Table1.ID1
ANDTable2.ID2 =Table1.ID2
AND ….
Существует несколько типов связывания:
Тип | Результат |
JOIN | Внутреннее соединение. В результирующем наборе присутствуют только записи, значения связанных полей в которых совпадают |
LEFT JOIN | Левое внешнее соединение. В результирующем наборе присутствуют все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет – поля из Table2 будут пустыми |
RIGHT JOIN | Правое внешнее соединение. В результирующем наборе присутствуют все записи из Table2 и соответствующие им записи из Table1. Если соответствия нет – поля из Table1 будут пустыми |
FULL JOIN | Полное внешнее соединение. Комбинация двух предыдущих. В результирующем наборе присутствуют все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет – поля из Table2 будут пустыми. Записи из Table2, которым не нашлось пары в Table1, тоже будут присутствовать в результирующем наборе. В этом случае поля из Table1 будут пустыми. |
CROSS JOIN | Cartesian product. Результирующий набор содержит все варианты комбинации строк из Table1 и Table2. Условие соединения при этом не указывается. |
Проиллюстрируем каждый тип примерами. Модель данных:
Table1 | |
Key1 | Field1 |
A | |
B | |
C |
Table2 | |
Key2 | Field2 |
AAA | |
BBB | |
CCC | |
DDD |
SELECT Table1.Field1, Table2.Field2
FROM Table1
JOIN Table2 ON Table1.Key1 = Table2.Key2
Результат:
A | AAA |
B | BBB |
B | CCC |
SELECT Table1.Field1, Table2.Field2
FROM Table1
LEFT JOIN Table2 ON Table1.Key1 = Table2.Key2
Результат:
A | AAA |
B | BBB |
B | CCC |
C |
SELECT Table1.Field1, Table2.Field2
FROM Table1
RIGHT JOIN Table2 ON Table1.Key1 = Table2.Key2
Результат:
A | AAA |
B | BBB |
B | CCC |
DDD |
SELECT Table1.Field1, Table2.Field2
FROM Table1
FULL JOIN Table2 ON Table1.Key1 = Table2.Key2
Результат:
A | AAA |
B | BBB |
B | CCC |
DDD | |
C |
SELECT Table1.Field1, Table2.Field2
FROM Table1
CROSS JOIN Table2
Результат:
A | AAA |
A | BBB |
A | CCC |
A | DDD |
B | AAA |
B | BBB |
B | CCC |
B | DDD |
C | AAA |
C | BBB |
C | CCC |
C | DDD |
Секция WHERE
Для фильтрации результатов выполнения запроса можно использовать условия выборки в секции WHERE. В общем виде синтаксис WHERE выглядит следующим образом:
WHERE[NOT] <условие1>[AND |OR<условие2>]
Условие представляет собой конструкцию вида:
<столбец таблицы, константа или выражение>
<оператор сравнения> <столбец таблицы, константа или выражение>
или
IS [NOT] NULL
или
[NOT] LIKE <шаблон>
или
[NOT] IN (<список значений>)
или
[NOT] BETWEEN <нижняя граница> AND <верхняя граница>
Операторы сравнения:
< | Меньше |
<= | Меньше либо равно |
<> | Не равно |
> | Больше |
>= | Больше либо равно |
= | Равно |
Примеры запросов с операторами сравнения:
SELECT * FROM Table WHERE Field > 100
SELECT * FROM Table WHERE Field1 <= (Field2 + 25)
Выражение IS [NOT] NULL проверяет данные на [не]пустые значения: