JOIN - ы
От: Igor Trofimov  
Дата: 31.08.03 08:06
Оценка: 75 (14) +1 -1
#Имя: FAQ.db.join
MS>Никак не могу понять разницу между JOIN-ами (INNER, RIGHT, LEFT и просто). В чем разиличие? И какие еще существуют обединения?

1. Это не объединения, а соединения. Объединение — это UNION.

2. Надо бы послать тебя в книжку, конечно.... ну ладно, коротко:

* Есть таблицы A и B

* A JOIN B дает т.н. CROSS JOIN — полное декартово произведение — то есть все сочетания записей из A и записей из B. Количество записей в результате COUNT(A) * COUNT(B). Поля — это все поля из A + все поля из B.

* A [INNER] JOIN B ON A.Field1 = B.Field2 - внутренее соединение, наиболее частая операция, выражается также без JOIN'а через WHERE:
SELECT ... FROM A,B WHERE A.Field1 = B.Field2

Если для какой-то записи из A не найдется записей из B, удовлетворяющих заданному условию соединения — то в результате таких записей из A не будет.

* A LEFT [OUTER] JOIN B ON A.Field1 = B.Field2 - левое внешнее соединение. Тоже очень частая операция. Все то же самое, что и внутренее, но если для записи из A не нашлось ни одной записи из B, то в результат уйдет ОДНА запись, у которой поля A — из записи таблицы A, а поля B — NULL

* A RIGHT [OUTER] JOIN B ON A.Field1 = B.Field2 эквивалентно
B LEFT [OUTER] JOIN A ON B.Field2 = A.Field1, только столбцы местами обменяются.

* A FULL [OUTER] JOIN B ON A.Field1 = B.Field2 - полное внешнее соединение.
Ну, тут уже пора самому догадаться, что это такое.
Все пары записей, удовлетворяющие условию — в результат. Для тех записей из A, для которых не нашлось пары — в результате одна запись с NULL в полях B.Для тех записей из B, для которых не нашлось пары — в результате одна запись с NULL в полях A.


Уфф... Может правильнее было на примере показать? Две таблички по 4 записи?
Re[3]: JOIN - ы
От: Igor Trofimov  
Дата: 01.09.03 16:51
Оценка: 25 (2)
MS>Зачем книжка, если есть RSDN?

Затем, что в форуме тебе датут обрывочные сведения, возможно, достаточные для решения конкретной твоей сегодняшней задачи.

А книжка зачастую даст тебе более фундаментальные знания, более хорошее понимание принципов.

iT>> * A FULL [OUTER] JOIN B ON A.Field1 = B.Field2 — полное внешнее соединение.

iT>> Ну, тут уже пора самому догадаться, что это такое.
iT>> Все пары записей, удовлетворяющие условию — в результат. Для тех записей из A, для которых не нашлось пары — в результате одна запись с NULL в полях B.Для тех записей из B, для которых не нашлось пары — в результате одна запись с NULL в полях A.

MS>Тоесть количество строк тут будет COUNT(A)?


Нет. (Число удовлетворяющих условию пар) + (Число сирот из A) + (Число сирот из B)
Сирота — это я так назвал запись, для которой не нашлось ни одной пары из другой таблицы.


MS>
MS>A RIGHT JOIN B ON A.Field1 = B.Field2
MS>

MS>и
MS>
MS>A RIGHT JOIN B ON A.Field1 = B.Field2 
MS>


Что-то я не могу найти отличий


MS>А бывают ли

MS>
MS>A RIGHT INNER JOIN B ON A.Field1 = B.Field2 
MS>

MS>?

Да вроде нет. Бывают всякие расширения, например в MySQL есть STRAIGHT JOIN, ну это уже муть с оптимизацией... Основное — INNER, LEFT/RIGHT OUTER, FULL OUTER, ну еще CROSS, но как уже сказали это большая редкость.
Re[2]: JOIN - ы
От: vvaizh http://izh-test.sourceforge.net/
Дата: 31.08.03 08:41
Оценка: 24 (2)
Здравствуйте, vvaizh, Вы писали:

V>Здравствуйте, Mika Soukhov, Вы писали:


блин..



V>Короче две таблички с одним полем:

V><таблица A>:   <таблица B>
V>------------+  +-------------
V>поле a      |  |поле b
V>------------+  +-------------
V>1           |  |
V>2           |  |2
V>            |  |3

V>Таблицы пересекаются только полем 2..
V>отсюда "внутренняя часть" (табличка с двумя полями..):

V>A inner join B on A.a=B.b
V>A.a      |B.b
V>---------+----------------
V>2        |2

V>если left или right то обязательно берутся
V>все поля  соответственно левой или правой таблицы.. 
V>(поля для которых нет соответствия join забиваются null-ом..)
V>т.е.:

V>A left join B on A.a=B.b
V>A.a      |B.b
V>---------+----------------
V>1        |null
V>2        |2

V>и

V>A right join B on A.a=B.b
V>A.a      |B.b
V>---------+----------------
V>2        |2
V>null     |3


V>далее.. outer.. соответственно вообще все поля берутся 
V>(полная противоположность inner)..

V>A left join B on A.a=B.b
V>A.a      |B.b
V>---------+----------------
V>1        |null
V>2        |2
V>null     |3

V>самый экзотичный (потому что я его никогда не приманял)
V>cross... поля берутся во всех комбинациях и никакого условия on нет

V>A cross join B on 
V>A.a      |B.b
V>---------+----------------
V>1        |2
V>1        |3
V>2        |2
V>2        |3
http://izh-test.sourceforge.net/russian/introduction.html
Re[5]: JOIN - ы
От: Igor Trofimov  
Дата: 01.09.03 17:21
Оценка: 22 (2)
MS>Забыл вставить

Да, просто необязательное слово.
Как например

SELECT T1.Fields1 [AS] Value1 .... FROM Table1 [AS] T1 ....
Re[2]: JOIN - ы
От: Аноним  
Дата: 31.08.03 19:03
Оценка: +1 -1
iT>2. Надо бы послать тебя в книжку, конечно....

В книжку посылать никого не нужно!!!
Не нравится вопрос — не отвечай.
А что книжки есть — так это и так всем известно.
Но только книга — одно, а форум — другое.
JOIN - ы
От: Mika Soukhov Stock#
Дата: 30.08.03 16:59
Оценка:
Никак не могу понять разницу между JOIN-ами (INNER, RIGHT, LEFT и просто). В чем разиличие? И какие еще существуют обединения?

Заранее благодарю
Re: JOIN - ы
От: vvaizh http://izh-test.sourceforge.net/
Дата: 31.08.03 08:25
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Никак не могу понять разницу между JOIN-ами (INNER, RIGHT, LEFT и просто). В чем разиличие? И какие еще существуют обединения?


Чего то тебе там мудрено объясняют..

Короче две таблички с одним полем:

<таблица A>: <таблица B>
------------+ +-------------
поле a | |поле b
------------+ +-------------
1 | |
2 | |2
| |3

Таблицы пересекаются только полем 2..
отсюда "внутренняя часть" (табличка с двумя полями..):

A inner join B on A.a=B.b
A.a |B.b
---------+----------------
2 |2

если left или right то обязательно берутся
все поля соответственно левой или правой таблицы..
(поля для которых нет соответствия join забиваются null-ом..)
т.е.:

A left join B on A.a=B.b
A.a |B.b
---------+----------------
1 |null
2 |2

и

A right join B on A.a=B.b
A.a |B.b
---------+----------------
2 |2
null |3


далее.. outer.. соответственно вообще все поля берутся
(полная противоположность inner)..

A left join B on A.a=B.b
A.a |B.b
---------+----------------
1 |null
2 |2
null |3

самый экзотичный (потому что я его никогда не приманял)
cross... поля берутся во всех комбинациях и никакого условия on нет

A cross join B on
A.a |B.b
---------+----------------
1 |2
1 |3
2 |2
2 |3
http://izh-test.sourceforge.net/russian/introduction.html
Re[2]: JOIN - ы
От: Mika Soukhov Stock#
Дата: 31.08.03 10:17
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

MS>>Никак не могу понять разницу между JOIN-ами (INNER, RIGHT, LEFT и просто). В чем разиличие? И какие еще существуют обединения?


iT>1. Это не объединения, а соединения. Объединение — это UNION.


iT>2. Надо бы послать тебя в книжку, конечно.... ну ладно, коротко:


Зачем книжка, если есть RSDN?

iT> * Есть таблицы A и B


iT> * A JOIN B дает т.н. CROSS JOIN — полное декартово произведение — то есть все сочетания записей из A и записей из B. Количество записей в результате COUNT(A) * COUNT(B). Поля — это все поля из A + все поля из B.


iT> * A [INNER] JOIN B ON A.Field1 = B.Field2 — внутренее соединение, наиболее частая операция, выражается также без JOIN'а через WHERE:

iT> SELECT ... FROM A,B WHERE A.Field1 = B.Field2

iT> Если для какой-то записи из A не найдется записей из B, удовлетворяющих заданному условию соединения — то в результате таких записей из A не будет.


iT> * A LEFT [OUTER] JOIN B ON A.Field1 = B.Field2 — левое внешнее соединение. Тоже очень частая операция. Все то же самое, что и внутренее, но если для записи из A не нашлось ни одной записи из B, то в результат уйдет ОДНА запись, у которой поля A — из записи таблицы A, а поля B — NULL


iT> * A RIGHT [OUTER] JOIN B ON A.Field1 = B.Field2 эквивалентно

iT> B LEFT [OUTER] JOIN A ON B.Field2 = A.Field1, только столбцы местами обменяются.

iT> * A FULL [OUTER] JOIN B ON A.Field1 = B.Field2 — полное внешнее соединение.

iT> Ну, тут уже пора самому догадаться, что это такое.
iT> Все пары записей, удовлетворяющие условию — в результат. Для тех записей из A, для которых не нашлось пары — в результате одна запись с NULL в полях B.Для тех записей из B, для которых не нашлось пары — в результате одна запись с NULL в полях A.

Тоесть количество строк тут будет COUNT(A)?

Как я понял в скобках это эквивалентная запись и будут давать один и тот же результат следующие записи
A RIGHT JOIN B ON A.Field1 = B.Field2

и
A RIGHT JOIN B ON A.Field1 = B.Field2


Так ли?

А бывают ли
A RIGHT INNER JOIN B ON A.Field1 = B.Field2

?

iT>Уфф... Может правильнее было на примере показать? Две таблички по 4 записи?


Да уже внизу привели
Re[4]: JOIN - ы
От: Mika Soukhov Stock#
Дата: 01.09.03 16:57
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

MS>>
MS>>A RIGHT JOIN B ON A.Field1 = B.Field2
MS>>

MS>>и
MS>>
MS>>A RIGHT OUTER JOIN B ON A.Field1 = B.Field2 
MS>>


iT>Что-то я не могу найти отличий


Забыл вставить
Re[2]: JOIN - ы
От: _d_m_  
Дата: 01.09.03 22:39
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

MS>>Никак не могу понять разницу между JOIN-ами (INNER, RIGHT, LEFT и просто). В чем разиличие? И какие еще существуют обединения?


iT>1. Это не объединения, а соединения. Объединение — это UNION.


iT>2. Надо бы послать тебя в книжку, конечно.... ну ладно, коротко:


iT> * Есть таблицы A и B


iT> * A JOIN B дает т.н. CROSS JOIN — полное декартово произведение — то есть все сочетания записей из A и записей из B. Количество записей в результате COUNT(A) * COUNT(B). Поля — это все поля из A + все поля из B.


iT> * A [INNER] JOIN B ON A.Field1 = B.Field2 — внутренее соединение, наиболее частая операция, выражается также

Ну а почему только операция равенства? Чем плохо:

... on A.Field1 > B.Field2
... on A.Field1 + B.Field2 = 666
Re[3]: JOIN - ы
От: Igor Trofimov  
Дата: 02.09.03 16:20
Оценка:
iT>> * A [INNER] JOIN B ON A.Field1 = B.Field2 — внутренее соединение, наиболее частая операция, выражается также
___>Ну а почему только операция равенства? Чем плохо:

Хотел об этом упомянуть, но забыл... Конечно, возможны и другие операции и более сложные условия, например, с AND иногда встречаются.
Re[4]: JOIN - ы
От: Mika Soukhov Stock#
Дата: 02.09.03 17:38
Оценка:
Здравствуйте, Igor Trofimov, Вы писали:

iT>>> * A [INNER] JOIN B ON A.Field1 = B.Field2 — внутренее соединение, наиболее частая операция, выражается также

___>>Ну а почему только операция равенства? Чем плохо:

iT>Хотел об этом упомянуть, но забыл... Конечно, возможны и другие операции и более сложные условия, например, с AND иногда встречаются.


Да, я как то понял
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.