Программирование >>  Sql: полное руководство 

1 ... 47 48 49 [ 50 ] 51 52 53 ... 264


любые критерии сравнения строк двух объединяемых таблиц. Предположим, например, что таблицы boys и girls были расширены путем добавления столбца age. Вот объединение, в котором связываются пары девочка/мальчик из одного города, а также требуется, чтобы мальчик и девочка в каждой паре были одного возраста:

SELECT *

FROM GIRLS IMMER JOIM BOYS ON (GIRLS.CITY = BOYS.CITY) AND (GIRLS.AGE = BOYS.AGE)

В этих простых двухтабличных объединениях все содержимое предложения where просто перешло в предложение on, т.е. последнее не добавляет ничего нового в язык SQL. Вспомните, однако, что во внешних объединениях трех и более таблиц результат запроса зависит от порядка, в котором производятся объединения. Как описывается ниже в настояшей главе, с помощью предложения on осуществляется управление процессом обработки таких многотабличных объединений.

Станд.рт SQL2 допускает еще один вариант запроса на простое внутреннее объединение таблиц girls и boys. Так как связанные столбцы этих таблиц имеют одинаковые имена и сравниваются на предмет равенства (что делается довольно часто), то можно использовать альтернативную форму предложения on, в которой задается список имен связанных столбцов:

SELECT *

FROM GIRLS INNER JOIN BOYS USING (CITY, AGE)

В предложении using перечисляются через запятую имена связанных столбцов; они должны быть идентичными в обеих таблицах. Это предложение полностью эквивалентно предложению on, в котором каждая пара связанных столбцов задается явно, но намного компактнее и, следовательно, легче для понимания. Конечно, если связанные столбцы имеют разные имена в таблицах boys и girls, то необходимо использовать предложение on или where со знаком равенства. Предложение on требуется использовать также в том случае, если объединение не производится по равенству связанных столбцов. Например, если вы хотите выбрать пары девочка/мальчик, в которых девочка старше мальчика, то должны задать объединение с помощью предложения on:

SELECT *

FROM GIRLS INNER JOIN BOYS ON (GIRLS.CITY = BOYS.CITY AND GIRLS.AGE > BOYS.AGE)

Наконец, имеется еще один, последний вариант этого простого запроса, иллюстрирующий одну особенность предложения from в стандарте SQL2. Объединение двух таблиц, в котором связанные столбцы имеют идентичные имена, называется естественным объединением, так как обычно это действительно самый естественный способ объединения двух таблиц. Запрос на выборку пар девочка/мальчик, живущих в одних и тех же городах и имеющих тот же самый возраст, можно выразить как естественное объединение следующим образом:

SELECT *

FROM GIRLS NATURAL INNER JOIN BOYS



Если задано ключевое слово natural, предложения on и using могут отсутствовать в запросе на объединение, так как в естественном объединении точно определено условие отбора для объединения двух таблиц - сравниваются все столбцы с идентичными именами в обеих таблицах.

В стандарте SQL2 определено, что объединение двух таблиц по умолчанию является внутренним. Во всех предыдущих примерах можно опустить ключевое слово inner, и полученные в результате запросы по-прежнему будут действительными инструкциями стандарта SQL2, имеющими тот же самый смысл.

Внешние объединения в стандарте SQL2 *

Стандарт SQL2 обеспечивает полную поддержку внешних объединений, расширяя языковые конструкции, используемые для внутренних объединений. Например, полное внешнее объединение таблиц girls и boys (без столбцов age) создается следующим запросом:

SELECT *

FROM GIRLS FULL OUTER JOIM BOYS ON GIRLS.CITY = BOYS.CITY

Как объяснялось ранее в настоящей главе, таблица результатов запроса будет содержать по одной строке для каждой связанной пары девочка/мальчик, а также по одной строке для каждой несвязанной записи для девочки или мальчика, расширенной значениями null в столбцах другой таблицы. В стандарте SQL2 для внешних объединений допустимы те же самые вариации, что и для внутренних объединений. Данный запрос можно было бы записать так:

SELECT *

FROM GIRLS NATURAL FULL OUTER JOIN BOYS

Или так:

SELECT *

FROM GIRLS FULL OUTER JOIN BOYS USING (CITY)

Ключевое слово outer, так же как и ключевое слово inner, в стандарте SQL2 не является обязательным. Поэтому предьщущий запрос можно было бы переписать следующим образом:

SELECT *

FROM GIRLS FULL JOIN BOYS USING (CITY)

По слову full СУБД сама определяет, что запрашивается внешнее объединение.

Вполне естественно, что в стандарте SQL2 левое и правое внешние объединечия обозначаются словами left и right вместо слова full. Вот вариант того же запроса, определяющий левое внешнее объединение:

SELECT *

FROM GIRLS LEFT OUTER JOIN BOYS USING (CITY)



Как уже говорилось, в результаты запроса войдут строки связанных пар девочка/мальчик и все несвязанные строки, содержащие null, из таблицы girls, но не войдут несвязанные строки из таблицы boys. И наоборот, вот вариант этого же запроса, задающий правое внещнее объединение:

SELECT *

FROM GIRLS RIGHT OUTER JOIN BOYS USING (CITY)

В данном случае в таблице результатов будут представлены пары девочка/мальчик и несвязанные строки из таблицы boys ( правая таблица объединения), но будут отсутствовать несвязанные строки из таблицы girls.

Перекрестные объединения и расширенные запросы на объединение в SQL2 *

Расширенное предложение from в стандарте SQL2 поддерживает также два других способа объединения данных из двух таблиц - декартово произведение (описанное ранее в настоящей главе) и расширенный запрос на объединение. Вот запрос, создающий произведение таблиц girls и boys:

SELECT *

FROM GIRLS CROSS JOIN BOYS

По определению, декартово произведение (иногда называемое перекрестным объединением (cross join), отсюда и название операции cross join) содержит все возможные пары строк из двух таблиц. Оно является результатом умножения двух таблиц, превращая таблицы трех девочек и двух мальчиков в таблицу шести пар девочка/мальчик (3*2=6). Перекрестным объединениям не сопутствуют никакие связанные столбцы или условия отбора , поэтому предложения on и using в них не допускаются. Следует отметить, что операция перекрестного объединения не добавляет ничего нового к возможностям SQL. Те же результаты можно получить с помощью внутреннего объединения, если не задать в нем условия отбора. Поэтому предыдущий запрос можно переписать так:

SELECT *

FROM GIRLS, BOYS

Ключевые слова cross join в предложении from просто в явном виде указывают на то, что создается декартово произведение. Для большинства баз данных такая операция вряд ли будет представлять практический интерес. Она полезна лишь тогда, когда на основе полученной таблицы строятся более сложные выражения, например итоговые запросы (рассматриваются в следующей главе).

Расширенный запрос на объединение заключает в себе некоторые черты как операции union (рассматривалась в предыдущей главе), так и операции join. Вспомним, что операция union объединяет строки двух таблиц, у которых должно быть одинаковое число столбцов, причем типы соответствующих столбцов обеих таблиц должны быть совместимыми. Простейший запрос на объединение

SELECT *

FROM GIRLS UNION ALL



1 ... 47 48 49 [ 50 ] 51 52 53 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика