Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка SQL(14) (оптимизация).docx
Скачиваний:
62
Добавлен:
17.03.2015
Размер:
452.16 Кб
Скачать

3.4.1. Внутреннее соединение.

Во внутреннем соединении возвращаются только те строки, которые соответствуют условию, указанному после ключевого слова ON. Это наиболее распространённый вид соединений. В следующем примере, как и в большинстве случаев, условие ON указывает два поля, которые должны иметь совпадающие значения. Здесь, если значение (поля A) в строке первой таблицы (R1) равно значению (поля В) в строке второй таблицы (R2), условие выполняется и строки соединяются:

SELECT А, В

FROM R1 INNER JOIN R2 ON А=В;

Рисунок иллюстрирует принцип работы внутреннего соединения.

Результат

А

В

102

102

104

104

106

106

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.