Выдержка из текста работы
INNER JOIN создает внутреннее объединение таблиц по указанному в предложении ON ключу. В свою очередь, операции LEFT, RIGHT, OUTER JOIN создают внешние объединения.
Условный оператор ON представляет собой условие в любой форме из числа тех, которые можно использовать в выражении WHERE. Однако, в большинстве случаев не следует задавать критерии отбора в части ON. Если необходимо указать, какие строки должны присутствовать в результате, рекомендуется делать это в выражении WHERE.
Оператор USING служит для указания списка столбцов, по которым производится связывание (столбцы должны иметь одинаковое название). Такое выражение USING, как:
t1 LEFT JOIN t2 USING (f1,f2,f3)
семантически идентично следующему выражению ON:
t1.f1=t2.f11 AND t1.f2=t2.f22 AND t1.f3=t2.f3
Рассмотрим несколько примеров:
SELECT * FROM goods INNER JOIN vendors ON goods.vendor=vendors.code;
Результат этого запроса будет эквивалентен тому, что будет получено при выполнении следующего запроса:
SELECT * FROM goods,vendors WHERE goods.vendor=vendors.code;
Разница — в способе обработки запросов драйвером СУБД и скорости их выполнения.
Запрос на выборку всех товаров, для которых указан код производителя, и названий их производителей:
SELECT * FROM goods AS a INNER JOIN vendors AS b ON a.vendor=b.code;
Аналогичный результат будет при выполнении запроса с использованием LEFT JOIN:
SELECT * FROM goods AS a LEFT JOIN vendors AS b ON a.vendor=b.code;
Использование RIGHT JOIN приведет к выборке всех товаров и названий их производителей, а также и тех производителей, товары которых не представлены в таблице goods:
SELECT * FROM goods AS a RIGHT JOIN vendors AS b ON a.vendor=b.code;
Если запись для правой таблицы в частях ON или USING в LEFT JOIN не найдена, то для данной таблицы используется строка, в которой все столбцы установлены в NULL. Эту возможность можно применять для нахождения результатов в таблице, не имеющей эквивалента в другой таблице:
SELECT a.* FROM goods a LEFT JOIN vendors b ON a.vendor=b.code WHERE b.code IS NULL;
Этот запрос вернет 0 записей, поскольку в таблице vendors определены все записи в поле code
Операции JOIN могут быть вложенными. К сожалению, проиллюстрировать вложенность запросов на таблицах goods, vendors и categorys не представляется возможным (это связано со структурой таблиц), поэтому, в качестве примера приведен следующий запрос. Обратите внимание порядок связывания таблиц во вложенных JOIN:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id LEFT JOIN table3 ON table2.id=table3.id;
- Задания к лабораторной работе
Используя операторы JOIN, создать по 2-3 запроса на объединение разных типов (см. указания к лабораторной работе № 9).