sql. Операторы InnerJoin и Outer | MetodPro.ru

Реклама на сайте

sql. Операторы InnerJoin и Outer


В первой таблице будет хранится ID пользователя и его nick-name, а во второй - ID ресурса, имя ресурса и ID пользователя, который может этот ресурс администрировать.

create table t_users (

t_id number(11, 0),

t_nickvarchar(16),

primary key (t_id) )

 

create table t_resources (

t_id number(11, 0),

t_namevarchar(16),

t_userid number (11, 0),

primarykey (t_id) )

 

Содержимое таблиц пусть будет таким:

T_ID  T_NICK

  1    user1

  3    user3

  4    user4

 

T_ID  T_NAME  T_USERID

1    res1     3

  2    res2     1

  3    res3     2

  5    res5     3

 

Конструкция join выглядит так:

... join_type join table_name on condition …

 

Где join_type - тип join-выражения, table_name - имя таблицы, которая присоединяется к результату, condition - условие объединения таблиц.

Кострукцияjoin располагается сразу после select-выражения. Можно использовать несколько таких конструкций подряд для объединения соответствующего кол-ва таблиц. Логичнее всего использовать join в том случае, когда таблица имеет внешний ключ (foreignkey).

 

Innerjoinнеобходим для получения только тех строк, для которых существует соответствие записей главной таблицы и присоединяемой. Иными словами условие condition должно выполняться всегда. Пример:

selectt_resources.t_name, t_users.t_nick

fromt_resources

inner join t_users on t_users.t_id = t_resources.t_userid

 

Результат будет таким:

 T_NAME  T_NICK

res2    user1

  res1    user3

  res5    user3

 

В случае с leftjoin из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений, то есть условие condition не учитывает присоединяемую (правую) таблицу. Пример:

selectt_resources.t_name, t_users.t_nick

fromt_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

 

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

 

Rightjoin отображает все строки удовлетворяющие правой части условия condition, даже если они не имеют соответствия в главной (левой) таблице:

selectt_resources.t_name, t_users.t_nick

fromt_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

 

Результирующая таблица показывает ресурсы и их администраторов. Если адмнистратор не задействован, эта запись тоже будет отображена. Такое может случиться, например, если ресурс был удален.

 

Fullouterjoin (ключевое слово outer можно опустить) необходим для отображения всех возможных комбинаций строк из нескольких таблиц. Иными словами, это объединение результатов left и rightjoin.

selectt_resources.t_name, t_users.t_nick

fromt_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

 

Наконец, cross join. Этот тип join еще называют декартовым произведением (на английском - cartesianproduct).

Вот пример запроса, который аналогичен crossjoin:

selectt_resources.t_name, t_users.t_nick

fromt_resources, t_users



Методические пособия

  • Системы автоматизированного проектирования
  • Социология молодёжи
  • Общая социология
  • Криптография
  • Проектирование трансляторов
  • Компьютерная графика
  • Моделирование систем
  • Информационная безопасность
  • Теория вычислительных процессов
  • Логические основы искусственного интелекта
  • Проектирование распределённых информационных систем