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 записи?
Здравствуйте, 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
Здравствуйте, 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
Здравствуйте, 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 INNERJOIN B ON A.Field1 = B.Field2
?
iT>Уфф... Может правильнее было на примере показать? Две таблички по 4 записи?
В книжку посылать никого не нужно!!!
Не нравится вопрос — не отвечай.
А что книжки есть — так это и так всем известно.
Но только книга — одно, а форум — другое.
Затем, что в форуме тебе датут обрывочные сведения, возможно, достаточные для решения конкретной твоей сегодняшней задачи.
А книжка зачастую даст тебе более фундаментальные знания, более хорошее понимание принципов.
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 INNERJOIN B ON A.Field1 = B.Field2
MS>
MS>?
Да вроде нет. Бывают всякие расширения, например в MySQL есть STRAIGHT JOIN, ну это уже муть с оптимизацией... Основное — INNER, LEFT/RIGHT OUTER, FULL OUTER, ну еще CROSS, но как уже сказали это большая редкость.
Здравствуйте, 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
iT>> * A [INNER] JOIN B ON A.Field1 = B.Field2 — внутренее соединение, наиболее частая операция, выражается также ___>Ну а почему только операция равенства? Чем плохо:
Хотел об этом упомянуть, но забыл... Конечно, возможны и другие операции и более сложные условия, например, с AND иногда встречаются.
Здравствуйте, Igor Trofimov, Вы писали:
iT>>> * A [INNER] JOIN B ON A.Field1 = B.Field2 — внутренее соединение, наиболее частая операция, выражается также ___>>Ну а почему только операция равенства? Чем плохо:
iT>Хотел об этом упомянуть, но забыл... Конечно, возможны и другие операции и более сложные условия, например, с AND иногда встречаются.