[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Postgre vs MySQL: JOIN
sergeiss
Продолжение темы: http://phpforum.su/index.php?showtopic=83964

Что такое JOIN, объяснять не буду. Нет у меня сейчас такой задачи. Хочу только сравнить возможности JOIN'ов в Мускуле и Постгре.


К чести Мускуля :) надо заметить, что он работает практически со всеми видами ДЖОЙНов. За исключением одного - FULL JOIN. Поэтому именно на нем я и хочу остановиться, показать его возможности в Постгре. Да, в Мускуле можно извратно эмулировать FULL JOIN, но я рассматриваю именно полноценные штатные возможности системы.
А всё остальное, связанное с JOIN, такие слова как CROSS, LEFT, RIGHT, а также INNER и OUTER, как я считаю, читателям этого опуса известны.

Для теста (сначала) возьмем такие данные:

пользователи
таблица test_users


user_id user_name
1 Andy
2 Serg
3 Ann
4 Nicolay
5 Vladimir
6 Igor



телефоны пользователей
таблица test_phones


user_id phone
1 12345
2 12345
3 12346
4 12347
5 23456
7 34567




Не важно, как появились такие данные. В данном случае их можно считать не совсем корректными, т.к. у нас нет пользователя с айди=7, но есть для него телефон. Естественно, что FULL JOIN можно использовать не только при поиске нецелостных данных :). И я чуть далее покажу это. А сейчас пока работаем с этими данными.

Что мы можем получить? Например, вот такой запрос

select *
from test_users
left join test_phones
using (user_id )
order by user_id


выдаст нам всех юзеров и их телефоны (при их наличии)
юзеры и телефоны LEFT JOIN


user_id user_name phone
1 Andy 12345
2 Serg 12345
3 Ann 12346
4 Nicolay 12347
5 Vladimir 23456
6 Igor




Запрос с "правым" ДЖОНОМ даст нам все телефоны и их пользователей (при наличии таковых)


select *
from test_users
right join test_phones
using (user_id )
order by user_id


юзеры и телефоны, RIGHT JOIN


user_id user_name phone
1 Andy 12345
2 Serg 12345
3 Ann 12346
4 Nicolay 12347
5 Vladimir 23456
7 34567



Оба этих запроса отработают одинаково и в Мускуле, и в Постгре

Но вот мы напишем такой запрос

select *
from test_users
full join test_phones
using (user_id )
order by user_id

и что же получим? А вот что:

юзеры и телефоны, FULL JOIN


user_id user_name phone
1 Andy 12345
2 Serg 12345
3 Ann 12346
4 Nicolay 12347
5 Vladimir 23456
6 Igor
7 34567



Какая с этого практическая польза, говорите? Ну, например, если мы добавим условие
where user_name is null or phone is null

то тогда получим полным список юзеров без телефонов и телефонов без юзеров. Да, в данном случае это не имеет реальной пользы. Но я сейчас покажу, как можно использовать FULL JOIN для большей пользы. Напишу это в первом ответе темы.

Если у вас есть инструмент, то его можно использовать тогда, когда он реально нужен.

За ДЖОЙНы я бы поставил 5:4 в пользу Постгре.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.