Что такое 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, вёрстке. Интерактивно и качественно. За разумные деньги.
* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
