Секция 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 проверяет данные на [не]пустые значения: