Секция FROM, логическое связывание таблиц
Перечь таблиц, из которых производится выборка данных, указывается в секции FROM. Выборка возможна как из одной таблицы, так и из нескольких логически взаимосвязанных. Логическая взаимосвязь осуществляется с помощью подсекции JOIN. На каждую логическую связь пишется отдельная подсекция. Внутри подсекции указывается условие связи двух таблиц (обычно по условию равенства первичных и вторичных ключей). Примеры для модели данных Сотрудники-Отделы-Города:
| Employees | ||||
| TabNum | Name | Position
| DeptNum | Salary |
| Иванов | Начальник | |||
| Петров | Инж. | |||
| Сидоров | Менеджер |
| Departments | ||
DeptNum
| 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 проверяет данные на [не]пустые значения:
Position
DeptNum