Запрос позволяет получить эквисоединение таблиц (соединение при равенстве значений столбцов) Блюда, Состав и Продукты. В строке SELECT указаны лишь те столбцы, которые необходимы в результате:
Результат
Блюдо
Продукт
Вес
Салат летний
Майонез
Салат летний
Помидоры
Салат летний
Зелень
Салат летний
Яблоки
Салат мясной
Говядина
Салат мясной
Майонез
Салат мясной
Яйца
Салат мясной
Морковь
Салат мясной
Помидоры
Салат мясной
Зелень
Салат витаминный
Сметана
Салат витаминный
Лук
Салат витаминный
Помидоры
Салат витаминный
Зелень
…
Рассмотренный вид соединения является внутренним, так как исключает несовпадающие по значению строки. То есть, если в БД занесено блюдо, но для него ещё не указан состав, то информация о таком блюде не появится в результирующей таблице, а иногда такая информация необходима.
Решить эту проблему помогают внешние соединения. Для получения внешнего соединения применяют один из трех подходов:
1. Использование подзапроса с предикатом EXISTS
2. Объединение двух запросов с помощью UNION
3. Применение специальной конструкции JOIN в предложении FROM
Все они будут рассмотрены далее.
Следует отметить, что в предложении SELECT доступны все поля соединённых таблиц, даже если они не используются в запросе. Каждое имя поля уточняется с помощью точечной нотации, при которой имя поля следует через точку за именем таблицы. Такое уточнение необходимо, когда одно имя поля в запросе встречается более одного раза. (Конечно, эти поля будут находиться в разных таблицах, ведь невозможно создать два поля с одинаковыми именами в одной таблице.) Если не идентифицировать однозначно эти поля, то получим синтаксическую ошибку о неопределённости имён. Уточнение имён необходимо производить вне зависимости от того, ссылается ли запрос на оба поля или нет — каждая ссылка должна быть уточнена.
Когда поле в запросе встречается всего один раз, уточнение имён становится необязательным. Поэтому, мы могли получить такой же результат, воспользовавшись следующим кодом: