Ключевое слово join в SQL употребляется при построении select выражений. Оказалось, что инструкция Join разрешает значительно совместить колонки из нескольких таблиц в некую. Ну что ж объединение часто случается временное и целостность таблиц не нарушается. А теперь существует 3 вида join-выражений:
В собственную очередь, outer join быть может left, right и full (слово outer обыкновенно тихо спускается).
В качестве образца (DBMS Oracle) умышленно сделаем 2 взаправду несложные таблицы и сконструируем им SQL-выражения с применением join.
В 1 таблице станет сберегается ID юзера и его nick-name, а во 2 - ID ресурса, фамилия ресурса и ID юзера, который правильно сможет данный ресурс администрировать.
create table t_users ( t_id number(11, 0), t_nick varchar(16), primary key (t_id) ) create table t_resources ( t_id number(11, 0), t_name varchar(16), t_userid number (11, 0), primary key (t_id) )
Содержимое таблиц пускай станет таковым:
Конструкция join смотрится так:
Где join_type - вид join-выражения, table_name - фамилия таблицы, коя приобщается к итогу, condition - условие соединения таблиц.
Кострукция join расположен незамедлительно опосля select-выражения. Естественно, можно радушно принимать на вооружение немного этих систем подряд для соединения отчасти надлежащего кол-ва таблиц. Стало быть логичнее всего срочно принимать на вооружение join в том случае, как скоро таблица лично имеет поистине наружной ключ (foreign key).
Inner join мало-мальски важен для получения лишь тех строчек, для которых добросовестно присутствует соотношение записей основной таблицы и присоединяемой. Иными словами условие condition обязано прекрасно выполняться постоянно. В сущности пример:
select t_resources.t_name, t_users.t_nick from t_resources inner join t_users on t_users.t_id = t_resources.t_userid
Результат станет таковым:
T_NAME T_NICK res2 user1 res1 user3 res5 user3
В случае с left join из основной таблицы станут окончательно подобраны все записи, в том числе и когда в присоединяемой таблице нет совпадений, т.е. условие condition Спокойно не принимает во внимание присоединяемую (правую) таблицу. И все же пример:
select t_resources.t_name, t_users.t_nick from t_resources left join t_users on t_users.t_id = t_resources.t_userid
Результат исполнения запроса:
T_NAME T_NICK res1 user3 res2 user1 res3 (null) res5 user3
Результат указывает все ресурсы и их админов, вне зависимотсти от того есть они или же нет.
Right join хладнокровно показывает все строчки долго удовлетворяющие правой доли условия condition, в том числе и раз у них нет соотношения в крупнейшей (левой) таблице:
select t_resources.t_name, t_users.t_nick from t_resources right join t_users on t_users.t_id = t_resources.t_userid
А эффект станет последующим:
T_NAME T_NICK res2 user1 res1 user3 res5 user3 (null) user4
Результирующая таблица указывает ресурсы и их админов. Несомненно если адмнистратор не задействован, данная запись также станет отображена. Следовательно такое бывает, к примеру, в случае если ресурс был удален.
Full outer join (более-менее ключевое слово outer возможно осторожно опустить) попросту важен для отображения всех по-старому вероятных композиций строчек из нескольких таблиц. Иными словами, данное сообщество эффектов left и right join.
select t_resources.t_name, t_users.t_nick from t_resources full join t_users on t_users.t_id = t_resources.t_userid
А эффект станет таковым:
T_NAME T_NICK res1 user3 res2 user1 res3 (null) res5 user3 (null) user4
Некоторые СУБД не поддерживают эту работоспособность (к примеру, MySQL), при таких раскладах вполне традиционно радушно примут на вооружение сообщество 2-ух запросов:
select t_resources.t_name, t_users.t_nick from t_resources left join t_users on t_users.t_id = t_resources.t_userid union select t_resources.t_name, t_users.t_nick from t_resources right join t_users on t_users.t_id = t_resources.t_userid
Наконец, cross join . И действительно этот вид join еще обычно именуют декартовым творением (По-старому на британском - cartesian product ). Так или иначе настоятельно советую применять его с разумом, т.к. время исполнения запроса с повышением количества таблиц и строчек в их подрастает по экспоненте.
Вот образчик запроса, который полностью подобен cross join:
select t_resources.t_name, t_users.t_nick from t_resources, t_users
Конструкция Join (в купе с иными SQL системами, к примеру, group by) нередко ежедневно встречается при программировании под ненамного информационной базы. Видите ли думаю, данная заметка станет вам может быть очень-очень полезна. По крайней мере кстати, для ревизии личных познаний в сфере баз этих (и например Oracle) советую широко пользоваться сиим веб-сайтом интернет испытания - Тесты по базам этих .
Вы должны быть зарегистрироавны чтобы оставить комментарий.