Открытая коллекция знаний

OpenU.Ru

Язык запросов SQL. DML.

SLQ запросы для объединения таблиц

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 Золотой колос

Содержание