OpenU.Ru
SQL поддерживает возможность определения связей между несколькими таблицами и вывода информации из них в терминах этих связей. Такие операции называют объединением (не путать с объединением результатов запросов UNION).
При объединении таблицы, которые представлены в запросе в виде списка после предложения FROM, отделяются друг от друга запятыми. Далее, обычно, предикат сравнивает значение в столбцах различных таблиц, чтобы определить, удовлетворяет ли WHERE указанному условию.
Приведем пример: вывести наименование и сумму проданного товара. Для этого воспользуемся следующим запросом:
SELECT Goods.GName, Sells.SSum FROM Goods, Sells WHERE Goods.GNum=Sells.GNum
В результате получим:
Gname | SSum |
Сахар | 192000 |
Мука | 6700 |
Мыло | 100000 |
Мука | 1000 |
Фен «Philips» | 60000 |
Данный запрос соединяет в одну таблицу записи с одинаковыми номерами в полях GNum из таблиц Goods и Sells. Если опустить предложение WHERE, то получится просто декартово произведение указанных таблиц – такое объединение используется достаточно редко.
Описанный в примере запрос является запросом с так называемым внутренним объединением таблиц. По-другому его можно записать так:
SELECT Goods.GName FROM Goods INNER JOIN Sells ON Goods.GNum=Sells.GNum
Как можно заметить, в результате запроса отсутствует такой товар как пиво. Это связано с тем, что его номер отсутствует в таблице продаж. Но если нам хочется видеть полный список товаров, то для этого необходимо использовать полное внешнее объединение. Синтаксис такого запроса будет следующим:
SELECT Goods.GName FROM Goods FULL OUTER JOIN Sells ON Goods.GNum=Sells.GNum
Результат выглядит так:
Gname | SSum |
Сахар | 192000 |
Мука | 6700 |
Мыло | 100000 |
Мука | 1000 |
Пиво | |
Фен «Philips» | 60000 |
Таким образом, запросы такого типа выбирают все NULL значения как из одной таблицы, так и из другой, и помещают их в результат.
Различают также полное левое и полное правое внешние объединения. Соответственно, левое – выбирает NULL значения из таблицы, которая упоминается в предложении FROM, а правое – в предложении JOIN.
Синтаксис запроса такой же, как и у полного внешнего объединения, только вместо ключевого слова FULL пишется либо LEFT, либо RIGHT, в зависимости от типа объединения.
При объединении более, чем двух таблиц после условия объединения первых двух таблиц (предложения ON) без каких-либо знаков препинания пишется предложение INNER (LEFT, RIGHT, FULL) OUTER, а далее – условие объединения таблиц. Например, выведем имя покупателя, наименование товара и сумму покупок:
SELECT Goods.Gname, Sells.SSum, Buyers.BName FROM Goods INNER JOIN Sells ON Goods.GNum=Sells.GNum INNER JOIN Buyers ON Sells.BNum=Buyers.BNum
Результат выглядит так:
GName | SSum | BName |
Сахар | 192000 | Золотой колос |
Мука | 6700 | Москва |
Мыло | 100000 | Дельта |
Мука | 1000 | Дельфин |
Фен «Philips» | 60000 | Золотой колос |