суббота, 18 августа 2012 г.

inner, left, right, cross join




Пусть имеются две таблицы
Customers                                         City
Id FirstName   CityId          |         Id      Name
-  -           -               |         -       -
1 Вася         1               |         1       Москва
2 Петя         2               |         2       Воронеж
3 Коля         3               |         4       Париж
4 Дима         4               |         6       Лондон
5 Олег         5               |         7       Гондурас
6 Лена         6               |

Заметим, что для Олега и Коли нет соответствующих городов. Так же нет людей живущих
в Гондурасе.


Результат для inner join (inner join тоже что и просто join):



select p.FirstName, c.Name from Customers as p
join City as c
on c.Id = p.CityId
Вася Москва
Петя Воронеж
Дима Париж
Лена Лондон
в результате присутствуют строки, которые соответствуют условию on. Коле и Олегу не были найдены соответствующие города, как и не включен в результат город Гондурас.


Результат для left join (аналогично для left outer join):
select p.FirstName, c.Name from Customers as p
left join City as c
on c.Id = p.CityId
Вася Москва
Петя Воронеж
Коля NULL
Дима Париж
Олег NULL
Лена Лондон
Выводятся все строки из левой таблицы (Customers), и соответствующие условию on строки из правой таблицы (City). Хоть для Коли и Олега, нет подходящих городов, в результат они все равно включаются, ибо указан left join.




Аналогично для right join (right outer join):
select p.FirstName, c.Name from Customers as p
right join City as c
on c.Id = p.CityId
Вася Москва
Петя Воронеж
Дима Париж
Лена Лондон
NULL Гондурас
Здесь Коли и Олега нет, так как города им не нашлось, зато есть Гондурас, которой в right таблице, следовательно условие ему по барабану.

Результат для full outer join
select p.FirstName, c.Name from Customers as p
full outer join City as c
on c.Id = p.CityId
 
Вася Москва
Петя Воронеж
Коля NULL
Дима Париж
Олег NULL
Лена Лондон
NULL Гондурас
Full outer join - как бы объединение запросов right и left. Т.е если есть соответствующая строка, то ок, если нет - выводим null.

Отдельный момент с cross join.
select c.FirstName, tmp.lastname from Customers as c 
cross join (select 'Пупкин' as lastname union select 'Иванов') as tmp
При таком запросе, каждой записи в таблице стоящей перед cross (Customers) будет сопоставлена запись из таблицы указанной в cross join.Т.е. декартово произведение.
Результат запроса cross join:
Вася Иванов
Петя Иванов
Коля Иванов
Дима Иванов
Олег Иванов
Лена Иванов
Вася Пупкин
Петя Пупкин
Коля Пупкин
Дима Пупкин
Олег Пупкин
Лена Пупкин

Комментариев нет:

Отправить комментарий