Inner Join – внутреннее соединение, используется по умолчанию. Соединяются только те строки для которых найдено совпадение.
Left Join – соединение левое внешнее. В выборку включаются все строки из левой таблицы и строки из правой, для которых обнаружено совпадение. В строки из правой таблицы, в которых не обнаружено совпадение заполняются Null.
Right Join – соединение правое внешнее. В выборку включаются все строки из правой таблицы и строки из левой, для которых обнаружено совпадение. В строки из левой таблицы, в которых не обнаружено совпадение заполняются Null.
Full join – в выборку включаются все строки из обеих таблиц.
Union – включает те строки из левой и правой таблицы, для которых не найдено совпадения.
Пример: Select P.Name From P Where P.Status>3 Union /* Объединение */ (intersect /* Пересечение */) | (Exept /* Вычитание */) Select P.Name From P, PD Where P.Num = PD.Num and PD.DNum = 2
Порядок выполнения оператора Select:
Если необязательных ключевых слов нет, то переход к следующему шагу.
1) Ключевое слово From вычисляет прямое декартово произведение всех указанных за ним таблиц.
2) Where. Таблицы сканируются, и для каждой строки проверяется условие, если оно истинно, то строка включается в выборку. Если есть подзапросы, то они выполняются в соответствии с алгоритмом.
3) Group By. Строки группируются в соответствии со списком группировки.
4) Having. Группы не удовлетворяющие условию выражения исключаются.
5) Select. Каждая группа, полученная на этапе 4, генерирует одну структуру результата так: вычисляются все скалярные выражения в разделе Select по правилам раздела Group by. Такие скалярные выражения должны быть одинаковы для всех структур каждой группы. Так же для каждой группы вычисляются значения агрегатных функций. Если раздела Group by нет, но в Select есть агрегатные функции, то считается, что есть всего одна группа. Если нет агрегатных функций и Group by, то считается, что имеется столько групп, сколько отображается строк. В результате получаем таблицу, содержащую столбцов, сколько элементов в разделе Select и строк, сколько отображено групп.
Если есть ключевые слова Union, Except, Intersect, то результаты Select соответственно объединяются, вычитаются, пересекаются. Если есть Order by, то строки упорядочиваются в соответствии со списком.
Как на самом деле выполняется Select.
Схемотичная работа оптимизатора: Каждая СУБД имеет свой оптимизатор, который находит оптимальный путь выполнения запроса.
1) Синтаксический анализ, после анализа вырабатывается внутреннее представление запроса.
2) Преобразование в каноническую форму, для этого используются синтаксические и семантические преобразования. Синтаксические (приведение выражения к КНФ,ДНФ) позволяют получить новое внутреннее определение запроса синтаксически эквивалентное исходному, но более стандартизованное. Семантические используют дополнительные возможности системы, в результате новый запрос синтаксически не эквивалентен исходному, но дает тот же результат.
3) Генерация планов выполнения запроса и выбор оптимального. Оптимизатор генерирует множество планов выполнения запроса. Каждый план – комбинации низкоуровневых процедур доступа к данным из таблиц, процедуры объединения таблиц и т.п. Из всех планов выбирается план с min стоимостью.