A
|
|
B
|
102
|
|
101
|
104
|
|
102
|
106
|
|
104
|
107
|
|
106
|
|
|
108
|
Рис. 3.4. R1 INNER JOIN R2
Как вы можете видеть, строка из R1 соединяется со строкой из R2, если их значения одинаковы. Поэтому в результате возвращаются значения 102, 104 и 106. Значение 107 из таблицы R1 не имеет соответствий в таблице R2, и поэтому не включается в результат. Аналогично, значения 101 и 108 из таблицы R2 не встречаются в таблице R1, поэтому и они тоже не включаются в набор.
Данная форма эквивалентна следующему запросу с условием WHERE
SELECT А, В FROM R1, R2 WHERE А = В;
3.4.2. Внешнее соединение.
Внешние соединения отличаются от внутренних тем, что могут возвращать строки, соответствующие условию и некоторые из тех, что не соответствуют ему.
3.4.2.1. Левое внешнее соединение.
В левом внешнем соединении результатом являются все строки левой таблицы, вне зависимости от того, имеют ли они подходящую пару в правой таблице. Но какая, же из них левая, а какая правая? Оказывается, это таблицы, указанные слева и справа от ключевых слов OUTER JOIN. Например, в следующей команде, R1 — левая таблица, а R2 — правая, и задано левое внешнее объединение.
SELECT А, В
FROM R1 LEFT OUTER JOIN R2 ON А=В;
Рисунок демонстрирует результаты такого соединения.
Результат
|
|
А
|
В
|
102
|
102
|
104
|
104
|
106
|
106
|
107
|
NULL
|
A
|
|
B
|
102
|
|
101
|
104
|
|
102
|
106
|
|
104
|
107
|
|
106
|
|
|
108
|
Рис. 3.5. R1 LEFT OUTER JOIN R2
Заметьте, что все значения из таблицы R1 включены в результат, так как она является левой таблицей. Значение 107, не встречающееся в таблице R2, тоже включено в результат, однако в строке вместе с ним нет значения из R2, оно пустое(NULL).
3.4.2.2. Правое внешнее соединение.
В правом внешнем соединении результатом являются все строки правой таблицы, вне зависимости от того, имеют ли они подходящее соответствие в левой таблице. Другими словами, правое соединение работает так же, как и левое, с тем лишь отличием, что возвращаются все строки из правой таблицы.
SELECT A, B
FROM R1 RIGHT OUTER JOIN R2 ON A=B
В приведённом примере R1 по-прежнему является левой таблицей, а R2 — правой, поскольку именно в таком порядке они указаны по отношению к ключевым словам OUTER JOIN. Поэтому результат соединения содержит все строки таблицы R2 и строки таблицы R1, соответствующие условию, если такие имеются (см. Рис. 3.6.).
Результат
|
|
А
|
В
|
NULL
|
101
|
102
|
102
|
104
|
104
|
106
|
106
|
NULL
|
108
|
A
|
|
B
|
102
|
|
101
|
104
|
|
102
|
106
|
|
104
|
107
|
|
106
|
|
|
108
|
Рис. 3.6. R1 RIGHT OUTER JOIN R2
Правое внешнее соединение противоположно левому. На одинаковых таблицах — левой R1 и правой R2— результаты правого и левого внешних объединений сильно различаются. На этот раз возвращаются все значения таблицы R2. Значения 101 и 108, не встречающиеся в R1, тоже включены в результат — в виде пустого значения в соответствующем поле. Опять-таки, строка включается в результат, несмотря на отсутствие значений в таблице R1.
3.4.2.3. Полное внешнее соединение.
В полном внешнем соединении результатом являются строки обеих таблицы, вне зависимости от того, имеют ли они соответствия в другой таблице. Другими словами, оно работает так же, как левое и правое, но на этот раз возвращаются значения обеих таблиц. Рассмотрим пример:
SELECT А, В
FROM R1 FULL OUTER JOIN R2 ON А=В;
Опять же, R1 — левая таблица, а R2 — правая, хотя на этот раз это не так важно. Полное внешнее coединение возвратит строки из всех таблиц, включая и те, что соответствуют условию, если такие найдутся (см. Рис. 3.7.).
Результат
|
|
А
|
В
|
NULL
|
101
|
102
|
102
|
104
|
104
|
106
|
106
|
107
|
NULL
|
NULL
|
108
| A
|
|
B
|
102
|
|
101
|
104
|
|
102
|
106
|
|
104
|
107
|
|
106
|
|
|
108
|
Рис. 3.7. R1 FULL OUTER JOIN R2
Полное внешнее соединение — это комбинация левого и правого соединения. К сожалению, по крайней мере в одной из систем баз данных, они вызовут ошибку. В MySQL, которая не поддерживает FULL OUTER JOIN вопреки стандарту SQL, результатом будет синтаксическая ошибка: SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN entries ON …'
Различие между внутренними и внешними соединениями.
Результаты внешнего соединения всегда включают в себя результаты соответствующего внутреннего соединения, а также не соответствующие условию строки из левой, правой или обеих таблиц — в зависимости от типа соединения.
Различие между левым и правым внешним соединением лишь в том, что в первом возвращаются все строки левой таблицы с соответствиями из правой, а во втором — наоборот, все строки правой таблицы с соответствиями из левой.
В то же время, полное внешнее объединение всегда включает результаты, как левого, так и правого объединения.
3.4.2.4. Перекрёстное соединение.
В перекрёстном соединении каждая строка из одной таблицы соединяется с каждой строкой из другой таблицы. Отличительной чертой перекрёстного соединения является отсутствие условия ON, как вы можете заметить из следующего запроса:
SELECT A, B FROM R1 CROSS JOIN R2
A
B
102
101
104
102
06
104
107
106
108
|
Результат
|
|
|
|
|
А
|
В
|
|
Продолжение
|
102
|
101
|
|
106
|
101
|
102
|
102
|
|
106
|
102
|
102
|
104
|
|
106
|
104
|
102
|
106
|
|
106
|
106
|
102
|
108
|
|
106
|
10
|
104
|
101
|
|
107
|
101
|
104
|
102
|
|
107
|
102
|
104
|
104
|
|
107
|
104
|
104
|
106
|
|
107
|
106
|
104
|
108
|
|
107
|
108
|
|
Рис. 3.8. R1 CROSS JOIN R2
Как можно видеть, перекрестное соединение эквивалентно декартову произведению. Перекрёстные соединения могут быть полезны, но используются чрезвычайно редко. Они применяются для генерации табличной структуры, содержащей все возможные комбинации двух наборов значений (в нашем примере, значений полей двух таблиц; это полезно при генерации тестовых данных или поиске недостающих значений).
3.4.3. Реальные примеры соединений.
Внутреннее соединение.
Пример 21.
Получить информацию о стоимости и количестве каждого продукта на складе
SELECT Продукты.Продукт, Наличие.Количество, Наличие.Цена
FROM Продукты JOIN Наличие
ON Продукты.ID_Продукта = Наличие.Продукт;
Do'stlaringiz bilan baham: |