Задача:
Напишите вместо пропуска в запросе выражение, которое выведет всех поставщиков и их товары, включая тех, у кого товаров нет:
SELECT s.Name, p.ProductName FROM Suppliers s [ПРОПУСК] JOIN Products p ON s.SupplierID = p.SupplierID
Решение:
Для того чтобы вывести всех поставщиков, включая тех, у кого нет товаров, и при этом показать товары тех поставщиков, у кого они есть, используется оператор LEFT JOIN (или LEFT OUTER JOIN). Этот тип объединения возвращает все строки из "левой" таблицы (в данном случае Suppliers) и совпадающие строки из "правой" таблицы (Products). Если совпадений в "правой" таблице нет, то для столбцов из "правой" таблицы будут выведены значения NULL.
Таким образом, пропущенное выражение будет LEFT.
Полный запрос будет выглядеть так:
SELECT s.Name, p.ProductName FROM Suppliers s LEFT JOIN Products p ON s.SupplierID = p.SupplierID
Пояснение:
В языке SQL:
SELECT s.Name, p.ProductName: Выбирает имя поставщика (Name) из таблицыSuppliers(с псевдонимомs) и название товара (ProductName) из таблицыProducts(с псевдонимомp).FROM Suppliers s: Указывает, что первая таблица, из которой берутся данные, этоSuppliers, и ей присваивается псевдонимs. Эта таблица считается "левой" в контекстеLEFT JOIN.LEFT JOIN Products p: Это оператор объединения.LEFT JOIN(илиLEFT OUTER JOIN) возвращает все строки из левой таблицы (Suppliers), даже если нет совпадающих строк в правой таблице (Products). Для тех поставщиков, у которых нет товаров, столбцы из таблицыProducts(например,p.ProductName) будут содержать значениеNULL. ТаблицаProductsполучает псевдонимp.ON s.SupplierID = p.SupplierID: Это условие объединения. Оно указывает, по какому столбцу таблицы должны быть сопоставлены. В данном случае, строки изSuppliersиProductsбудут объединены, если значения в столбцахSupplierIDсовпадают.
Этот запрос позволяет получить полный список поставщиков, а также информацию об их товарах, если они есть, или NULL, если товаров нет.
